美文网首页
Hu矩---OpenCV-Python开发指南(26)

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

作者: 极客学编程 | 来源:发表于2021-04-26 18:11 被阅读0次

什么是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矩可以判断两个轮廓是否一致。而为了更直观的比较Hu矩值,OpenCV给我们提供了cv2.matchShapes()来对两个对象的Hu矩进行比较。

其完整定义如下:

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

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

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

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

取值 含义
cv2.CONTOURS_MATCH_11 3.png

|

| cv2.CONTOURS_MATCH_12 | 4.png

|

|cv2.CONTOURS_MATCH_13 | 5.png

|

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

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


6.png

其中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分别对比,控制台输出结果如下:


7.png

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

相关文章

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

    什么是Hu矩 Hu矩是归一化中心矩的线性组合。Hu矩在图像的旋转,缩放,平移等操作后,仍然保持矩的特征不变,所以经...

  • Hu矩

    Hu矩是归一化矩的线性组合,Hu矩在图像旋转、平移、缩放等操作后,仍能保持不变性,所以经常使用Hu矩来识别图像的特...

  • 矩特征---OpenCV-Python开发指南(25)

    什么是矩特征 通过前篇博文的学习,我们知道如何从图像中分解轮廓。而矩特征是比较两个轮廓最简单的方法,通过它们的轮廓...

  • OpenCV Hu不变矩

    1. 矩的概念 图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,...

  • 图像的矩(含hu不变矩)

    冒泡!八月下旬啦~暑假要过去了诶,制定的plan因为lan只完成了个p这周就提前更新一下 在图像识别中遇到的关于图...

  • 胡矩 Hu Moments, OpenCV Shape Desc

    图像的几何矩 - CSDN 这7个不变矩构成一组特征量,Hu.M.K在1962年证明了他们具有旋转,缩放和平移不变...

  • 轮廓拟合---OpenCV-Python开发指南(27)

    前言 在计算轮廓时,可能并不需要实际的轮廓,而仅需要一个接近于轮廓的近似多边形。比如矩形其实都是差不多的轮廓,都是...

  • 凸包---OpenCV-Python开发指南(28)

    前言 逼近多边形是某个图像轮廓的高度近似,而凸包的提出是为了简化逼近多边形的。其实,凸包跟逼近多边形很像,只不过它...

  • 人脸检测---OpenCV-Python开发指南(41)

    人脸检测函数 在OpenCV中,人脸检测使用的函数是cv2.CascadeClassifier.detectMul...

  • CPU卡开发指南(五)发卡流程

    CPU卡开发指南(一)错误码 CPU卡开发指南(二)基本指令 CPU卡开发指南(三)安全体系 CPU卡开发指南(四...

网友评论

      本文标题:Hu矩---OpenCV-Python开发指南(26)

      本文链接:https://www.haomeiwen.com/subject/fjkelltx.html