第12章 图像轮廓 -- 12.3 Hu矩

本文介绍了如何在OpenCV中使用Hu矩进行图像特征稳定性和形状匹配,通过cv2.HuMoments()函数获取Hu矩,并通过cv2.matchShapes()比较不同图像的相似性。实例演示了轮廓匹配与Hu矩计算的应用。
摘要由CSDN通过智能技术生成

《OpenCV 轻松入门 面向Python》 学习笔记

Hu矩

Hu矩是归一化中心矩的线性组合,Hu矩再图像旋转,缩放,平移等操作后,仍能保持矩的不变性,经常使用 Hu 矩来识别图像的特征。在 OpenCV 中,使用函数 cv2.HuMoments()可以得到 Hu 距。该函数使用 cv2.moments()函数的返回值作为参数,返回 7 个 Hu 矩值。


矩函数 cv2.HuMoments()

函数原型:

hu = cv2.HuMoments( m )
  • hu 表示返回的Hu 矩阵
  • 参数m 是cv2.moments() 计算得到的矩特征值。

形状匹配 cv2.matchShapes()

我们可以通过Hu 矩来判断两个对象的一致性。为了更直观方便地比较Hu值,opencv 提供了函数 cv2.matchShapes() 对两个对象的Hu矩进行比较。

函数 cv2.matchShapes()允许我们提供两个对象,,这两个轮廓可以是轮廓, 也可以是灰度图。不管是什么,函数都会提前计算好对象的Hu矩。

函数原型:

retval = cv2.matchShapes( contour1, contour2, method, parameter )

参数:

  • contour1: 第一个轮廓或者灰度图像
  • contour2: 第二个灰度或轮廓图像
  • method: 比较两个对象的Hu 矩的方法,ℎ𝑖𝐴和ℎ𝑖𝐵分别是对象 A 和对象 B 的 Hu 矩
  • parameter 应用于mathod 的特定函数,暂不支持该参数,将该值设置为0即可。

举例:

import cv2 
import numpy as np

# 读取图片
o1 = cv2.imread('18-1.jpg')
o2 = cv2.imread('18-2.jpg')
o3 = cv2.imread('12.jpg') 

# 处理为单通道的灰度图
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY) 
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY) 
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY) 

# 处理为单通道的灰度图二值图
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY) 
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY) 
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY) 

# 查找轮廓
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]

# 查看形状匹配
ret0 = cv2.matchShapes(cnt1,cnt1,1,0.0)
ret1 = cv2.matchShapes(cnt1,cnt2,1,0.0)
ret2 = cv2.matchShapes(cnt1,cnt3,1,0.0)

print("相同图像的 matchShape=",ret0)
print("相似图像的 matchShape=",ret1)
print("不相似图像的 matchShape=",ret2)

# 输出为:
# 相同图像的 matchShape= 0.0
# 相似图像的 matchShape= 0.12473414346068246   
# 不相似图像的 matchShape= 1.7976931348623157e+308   


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Enzo 想砸电脑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值