Hu矩在图像旋转、缩放、平移等操作后,仍能保持矩的不变性,所以经常会使用Hu距来识别图像的特征。

OpenCV中,使用函数cv2.HuMoments()可以得到Hu矩。返回七个Hu矩值。

Hu矩函数

语法:

hu = cv2.HuMoments(m)

式中返回值hu,表示返回的Hu矩值;参数m,是由函数cv2.moments()计算得到矩阵特征值。

返回值

形状匹配

可以通过Hu矩来判断两个对象的一致性。

为了更加方便直观地比较Hu值,OpenCV提供了函数cv2.matchShapes(),对两个对象的Hu矩进行了比较。

cv2.matchShapes()的语法:

retval = cv2.matchShapes(contours1, contours2, method, parameter)
  • contours1:第一个轮廓或者灰度图像
  • contours2:第二个轮廓或者灰度图像
  • method:比较两个对象Hu矩的方法,具体如下表所示:

method的值及具体含义

  • parameter:应用于method的特定参数,暂不支持该参数,因此设为0即可。

例1:使用函数cv2.matchShape()计算三幅不同图像的匹配度。

import cv2
import numpy as np
img1 = cv2.imread('E:\Blog\OpenCV\Process\A1.png')
img2 = cv2.imread('E:\Blog\OpenCV\Process\A2.png')
img3 = cv2.imread('E:\Blog\OpenCV\Process\A3.png')

# ====处理为二值图=====
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)   
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)  
gray3 = cv2.cvtColor(img3,cv2.COLOR_BGR2GRAY)  
ret1,binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY) #阈值处理
ret2,binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY) #阈值处理
ret3,binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY) #阈值处理

# =====find轮廓=======
contours1, hierarchy = cv2.findContours(binary1, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours2, hierarchy = cv2.findContours(binary2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours3, hierarchy = cv2.findContours(binary3, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# =====轮廓提取=====
cnt1 = contours1[0]
cnt2 = contours2[0]
cnt3 = contours3[0]

# =====比较Hu矩=====
retval1 = cv2.matchShapes(cnt1, cnt1, cv2.CONTOURS_MATCH_I1, 0.0)  #自身比较
retval2 = cv2.matchShapes(cnt1, cnt2, cv2.CONTOURS_MATCH_I1, 0.0)  #放缩+平移比较
retval3 = cv2.matchShapes(cnt1, cnt3, cv2.CONTOURS_MATCH_I1, 0.0)  #差异较大的比较

# ====结果输出=====
print('相同图像的Hu矩比较',retval1)
print('相似图像的Hu矩比较',retval2)
print('不相似图像的Hu矩比较',retval3)

结果:

相同图像的Hu矩比较 0.0
相似图像的Hu矩比较 0.011079424397544696
不相似图像的Hu矩比较 0.2775062963269702

表明:

1、同一幅图像的Hu矩是不变的;2、相似的图形(放缩、旋转、平移),返回值比较接近;3、不相似的图形返回值较大


素材:

A1

A2

A3



博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV36.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 27 日
如果觉得我的文章对你有用,请随意赞赏