《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()
![](https://img.haomeiwen.com/i17748967/fde78fba13820399.jpg)
从上述运行结果可以看出:
- 相同图像之间的Hausdorff距离为零。
- 相似图像之间的Hausdorff距离较小。
- 不同图像之间的Hausdorff距离较大。
网友评论