美文网首页
图像轮廓之形状比较

图像轮廓之形状比较

作者: 大龙10 | 来源:发表于2021-11-10 07:32 被阅读0次

《OpenCV轻松入门:面向Python》读书笔记
作者:李立宗
出版社:电子工业出版社
出版时间:2019-05

第12章 图像轮廓

12.6 利用形状场景算法比较轮廓

用矩比较形状是一种非常有效的方法,不过现在有了更有效的方法。从OpenCV 3开始,有了专有模块shape,该模块中的形状场景算法能够更高效地比较形状。

1)计算形状场景距离

OpenCV提供了使用“距离”作为形状比较的度量标准。这是因为形状之间的差异值和距离有相似之处,比如二者都只能是零或者正数,又比如当两个形状一模一样时距离值和差值都等于零。

OpenCV提供了函数cv2.createShapeContextDistanceExtractor(),用于计算形状场景距离。其使用的“形状上下文算法”在计算距离时,在每个点上附加一个“形状上下文”描述符,让每个点都能够捕获剩余点相对于它的分布特征,从而提供全局鉴别特征。

2)计算Hausdorff距离

OpenCV提供了函数cv2.createHausdorffDistanceExtractor()来计算Hausdorff距离。
【例12.27】使用函数cv2.createHausdorffDistanceExtractor()计算不同图像的Hausdorff距离。

import cv2
#-----------读取原始图像--------------------
o1 = cv2.imread('cs.bmp')
o2 = cv2.imread('cs3.bmp') 
o3 = cv2.imread('hand.bmp') 
cv2.imshow("original1",o1)
cv2.imshow("original2",o2) 
cv2.imshow("original3",o3) 
#-----------色彩转换--------------------
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) 
#-----------提取轮廓--------------------
image,contours1, hierarchy = cv2.findContours(binary1,
                                              cv2.RETR_LIST,
                                              cv2.CHAIN_APPROX_SIMPLE)  
image,contours2, hierarchy = cv2.findContours(binary2,
                                              cv2.RETR_LIST,
                                              cv2.CHAIN_APPROX_SIMPLE)  
image,contours3, hierarchy = cv2.findContours(binary3,
                                              cv2.RETR_LIST,
                                              cv2.CHAIN_APPROX_SIMPLE)  
cnt1 = contours1[0]
cnt2 = contours2[0]
cnt3 = contours3[0]
#-----------构造距离提取算子--------------------
hd = cv2.createHausdorffDistanceExtractor()
#-----------计算距离--------------------
d1 = hd.computeDistance(cnt1,cnt1)
print("自身Hausdorff距离d1=", d1)
d2 = hd.computeDistance(cnt1,cnt2)
print("旋转缩放后Hausdorff距离d2=", d2)
d3 = hd.computeDistance(cnt1,cnt3)
print("不相似对象Hausdorff距离d3=", d3)
#-----------显示距离--------------------
cv2.waitKey()
cv2.destroyAllWindows()

从上述运行结果可以看出:

  • 相同图像之间的Hausdorff距离为零。
  • 相似图像之间的Hausdorff距离较小。
  • 不同图像之间的Hausdorff距离较大。

相关文章

网友评论

      本文标题:图像轮廓之形状比较

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