Hu矩---OpenCV-Python开发指南(26)

简介: Hu矩---OpenCV-Python开发指南(26)

什么是Hu矩


Hu矩是归一化中心矩的线性组合。Hu矩在图像的旋转,缩放,平移等操作后,仍然保持矩的特征不变,所以经常会用到Hu矩来识别图像的特征。


OpenCV中,我们可以通过cv2.HuMoments()函数获取Hu矩。该函数使用cv2.moments()函数的返回值作为参数,返回7个Hu矩值。


其完整定义如下:

def HuMoments(m, hu=None):

m:是由函数cv2.moments()计算得到的矩特征值


获取Hu矩值


下面,我们就通过该函数获取下图的Hu矩值。

具体代码如下所示:

import cv2
img = cv2.imread("24.jpg")
cv2.imshow("img", img)
# 转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hu=cv2.HuMoments(cv2.moments(img_gray)).flatten()
print(hu)


运行之后,我们会得到7个值的list数组:


形状匹配


前面我们已经介绍,通过Hu矩可以判断两个轮廓是否一致。而为了更直观的比较Hu矩值,OpenCV给我们提供了cv2.matchShapes()来对两个对象的Hu矩进行比较。


其完整定义如下:

def matchShapes(contour1, contour2, method, parameter): 

contour1:需要对比的轮廓1,或者灰度图像


contour2:需要对比的轮廓2,或者灰度图像


method:比较两个轮廓的Hu矩方法,取值如下表:

取值

含义

cv2.CONTOURS_MATCH_11

cv2.CONTOURS_MATCH_12

cv2.CONTOURS_MATCH_13

parameter:应用于method的特定参数,该参数为扩展参数OpenCV4.X还不支持该参数,因此该参数设置为0。


下面,我们通过几张图测试形状匹配,原图如下:


其中24是之前用到的图与后面图形都不一样,而26所有的图形都是从同一个椭圆变换而来的,比如26_2是26_1等比例放大之后的图像,26_4是26_1移动并旋转一定角度的图像。


下面,我们来通过matchShapes来判断图形,代码如下:

import cv2
img1 = cv2.imread("26_1.jpg")
img2 = cv2.imread("26_2.jpg")
img3 = cv2.imread("24.jpg")
img4 = cv2.imread("26_4.jpg")
# 转换为灰度图像
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
gray3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)
gray4 = cv2.cvtColor(img4, cv2.COLOR_BGR2GRAY)
contours1, hierarchy1 = cv2.findContours(gray1, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours2, hierarchy2 = cv2.findContours(gray2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours3, hierarchy3 = cv2.findContours(gray3, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours4, hierarchy4 = cv2.findContours(gray4, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
ret1 = cv2.matchShapes(contours1[0], contours2[0], 1, 0.0)
ret2 = cv2.matchShapes(contours1[0], contours3[0], 1, 0.0)
ret3 = cv2.matchShapes(contours1[0], contours4[0], 1, 0.0)
print(ret1)
print(ret2)
print(ret3)


这里26_1与26_2,24,26_4分别对比,控制台输出结果如下:


可以看到,与放大移动旋转的图像比,输出值都是0。这是因为相似的图像通过平移,缩放,旋转后,cv2.matchShapes()的值仍然接近与0。而24图的矩形与椭圆并不是一个轮廓。所以其差别非常大,自然返回值也大。

相关文章
|
5天前
|
数据采集 存储 XML
深入浅出:基于Python的网络数据爬虫开发指南
【2月更文挑战第23天】 在数字时代,数据已成为新的石油。企业和个人都寻求通过各种手段获取互联网上的宝贵信息。本文将深入探讨网络爬虫的构建与优化,一种自动化工具,用于从网页上抓取并提取大量数据。我们将重点介绍Python语言中的相关库和技术,以及如何高效、合法地收集网络数据。文章不仅为初学者提供入门指导,也为有经验的开发者提供进阶技巧,确保读者能够在遵守网络伦理和法规的前提下,充分利用网络数据资源。
|
6月前
|
数据采集 JavaScript 前端开发
Web爬虫开发指南:使用Python的BeautifulSoup和Requests库
Web爬虫是一种从互联网上获取数据的自动化工具,它可以用于抓取网页内容、提取信息和分析数据。Python提供了一些强大的库,其中BeautifulSoup和Requests是两个常用的工具,用于解析HTML内容和发起HTTP请求。本文将介绍如何使用BeautifulSoup和Requests库构建一个简单而有效的Web爬虫。
|
6月前
|
前端开发 API 数据库
Python网站开发指南:构建现代化、高效的Web应用
在当今数字化时代,网站已成为企业、组织以及个人展示自己的重要窗口。Python作为一种简洁、高效且易于学习的编程语言,被广泛运用于网站开发领域。本文将向您介绍如何使用Python进行网站开发,包括常用的Web框架、关键技术和最佳实践。
|
算法
实现人脸美白算法---OpenCV-Python开发指南(59)
实现人脸美白算法---OpenCV-Python开发指南(59)
474 0
实现人脸美白算法---OpenCV-Python开发指南(59)
|
算法 Python
实现人脸磨皮算法---OpenCV-Python开发指南(58)
实现人脸磨皮算法---OpenCV-Python开发指南(58)
414 0
实现人脸磨皮算法---OpenCV-Python开发指南(58)
|
计算机视觉
实现抖音慢动作效果---OpenCV-Python开发指南(57)
实现抖音慢动作效果---OpenCV-Python开发指南(57)
183 1
|
计算机视觉
实现抖音时光倒流效果---OpenCV-Python开发指南(56)
实现抖音时光倒流效果---OpenCV-Python开发指南(56)
139 1
实现抖音时光倒流效果---OpenCV-Python开发指南(56)
|
算法
实现抖音霓虹灯效果---OpenCV-Python开发指南(55)
实现抖音霓虹灯效果---OpenCV-Python开发指南(55)
223 0
实现抖音霓虹灯效果---OpenCV-Python开发指南(55)
|
算法 程序员 计算机视觉
实现抖音闪烁效果---OpenCV-Python开发指南(54)
实现抖音闪烁效果---OpenCV-Python开发指南(54)
139 0
实现抖音闪烁效果---OpenCV-Python开发指南(54)
|
算法 计算机视觉
实现抖音视频抖动效果---OpenCV-Python开发指南(53)
实现抖音视频抖动效果---OpenCV-Python开发指南(53)
221 0
实现抖音视频抖动效果---OpenCV-Python开发指南(53)