Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

文章目录

  • 12.7 利用形状场景算法比较轮廓
    • 12.7.1 计算形状场景距离
    • 12.7.2 计算Hausdorff距离

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

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

12.7.1 计算形状场景距离

OpenCV提供了使用“距离”作为形状比较的度量标准。这是因为形状之间的差异值和距离有相似之处,比如二者都只能是零或者正数,又比如当两个形状一模一样时距离值和差值都等于零。
OpenCV提供了函数cv2.createShapeContextDistanceExtractor(),用于计算形状场景距离。其使用的“形状上下文算法”在计算距离时,在每个点上附加一个“形状上下文”描述符,让每个点都能够捕获剩余点相对于它的分布特征,从而提供全局鉴别特征。
有关该函数的更多理论知识,可以参考学者Belongie等人2002年在IEEE Transactions on Pattern Analysis & Machine Intelligence上发表的论文Shape Matching and Object Recognition Using Shape Contexts
函数cv2.createShapeContextDistanceExtractor()的语法格式为:

    retval = cv2.createShapeContextDistanceExtractor([, nAngularBins[,nRadialBins[,innerRadius[,outerRadius[,iterations[,comparer[,transformer]]]]]]] )

式中的返回值为retval,返回结果。
该结果可以通过函数cv2.ShapeDistanceExtractor.computeDistance()计算两个不同形状之间的距离。此函数的语法格式为:

  retval=cv2.ShapeDistanceExtractor.computeDistance(contour1, contour2)

式中,coutour1和coutour2是不同的轮廓。
函数cv2.createShapeContextDistanceExtractor()的参数都是可选参数:
● nAngularBins:为形状匹配中使用的形状上下文描述符建立的角容器的数量。
● nRadialBins:为形状匹配中使用的形状上下文描述符建立的径向容器的数量。
● innerRadius:形状上下文描述符的内半径。
● outerRadius:形状上下文描述符的外半径。
● iterations:迭代次数。
● comparer:直方图代价提取算子。该函数使用了直方图代价提取仿函数,可以直接采用直方图代价提取仿函数的算子作为参数。
● transformer:形状变换参数。

eg1:使用函数cv2.createShapeContextDistanceExtractor()计算形状场景距离。
代码如下:

import cv2
#-----------原始图像o1边缘--------------------
o1 = cv2.imread('cs.bmp')
cv2.imshow("original1",o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
image,contours1, hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt1 = contours1[0]
#-----------原始图像o2边缘--------------------
o2 = cv2.imread('cs3.bmp')
cv2.imshow("original2",o2)
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY)
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
image,contours2, hierarchy = cv2.findContours(binary2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt2 = contours2[0]
#-----------原始图像o3边缘--------------------
o3 = cv2.imread('hand.bmp')
cv2.imshow("original3",o3)
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY)
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY)
image,contours3, hierarchy = cv2.findContours(binary3,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt3 = contours3[0]
#-----------构造距离提取算子--------------------
sd = cv2.createShapeContextDistanceExtractor()
#-----------计算距离--------------------
d1 = sd.computeDistance(cnt1,cnt1)
print("自身距离d1=", d1)
d2 = sd.computeDistance(cnt1,cnt2)
print("旋转缩放后距离d2=", d2)
d3 = sd.computeDistance(cnt1,cnt3)
print("不相似对象距离d3=", d3)
#-----------显示距离--------------------
cv2.waitKey()
cv2.destroyAllWindows()

运行上述程序,会显示如下图所示的图像。其中:
● 左图是图像o1。
● 中间的是图像o2。
● 右图是图像o3。

同时,程序还会显示如下的运行结果:

自身距离d1= 0.0
旋转缩放后距离d2= 0.7913379669189453
不相似对象距离d3= 2.75199031829834

从上述运行结果可以看出;
● 相同图像之间的形状场景距离为零。
● 相似图像之间的形状场景距离较小。
● 不同图像之间的形状场景距离较大。

12.7.2 计算Hausdorff距离

Hausdorff距离的计算方法是:
(1)针对图像A内的每一个点,寻找其距离图像B的最短距离,将这个最短距离作为Hausdorff直接距离D1。
(2)针对图像B内的每一个点,寻找其距离图像A的最短距离,将这个最短距离作为Hausdorff直接距离D2。
(3)将上述D1、D2中的较大者作为Hausdorff距离。
通常情况下,Hausdorff距离H(·)是根据对象A和对象B之间的Hausdorff直接距离h(·)来定义的,用数学公式表式如下:
H(A, B)=max(ℎ(A, B), ℎ(B, A))
其中:

式中,‖·‖表示点a和点b的某种范数,通常是欧氏距离。
OpenCV提供了函数cv2.createHausdorffDistanceExtractor()来计算Hausdorff距离。其语法格式为:

    retval = cv2.createHausdorffDistanceExtractor( [, distanceFlag [, rankProp]])

式中的返回值retval为函数返回的结果。
式中的参数如下:
● distanceFlag为距离标记,是可选参数。
● rankProp为一个比例值,范围在0到1之间,也是可选参数。

eg2:使用函数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()

运行上述程序,会显示如图12-32所示的图像。其中:
● 左图是图像o1。
● 中间的是图像o2。
● 右图是图像o3。

同时,程序还会显示如下的运行结果:

自身Hausdorff距离d1= 0.0
旋转缩放后Hausdorff距离d2= 18.357559204101562
不相似对象Hausdorff距离d3= 57.27128601074219

从上述运行结果可以看出:
● 相同图像之间的Hausdorff距离为零。
● 相似图像之间的Hausdorff距离较小。
● 不同图像之间的Hausdorff距离较大。

win10+Python3.7.3+OpenCV3.4.1入门学习(十二 图像轮廓)————12.7 利用形状场景算法比较轮廓相关推荐

  1. win10+Python3.7.3+OpenCV3.4.1入门学习(二十章 K近邻算法)————20.1理论基础

    Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm 文章目录 第20章 K近邻算法 20.1 理论基础 第20章 K近邻算法 机器学习算法是从数 ...

  2. win10+Python3.7.3+OpenCV3.4.1入门学习(十二 图像轮廓)————12.4 Hu矩

    文章目录 12.4 Hu矩 12.4.1 Hu矩函数 12.4.2 形状匹配 Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm 12.4 Hu ...

  3. win10+Python3.7.3+OpenCV3.4.1入门学习(八)————8.7 礼帽运算

    Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm 礼帽运算是用原始图像减去其开运算图像的操作.礼帽运算能够获取图像的噪声信息,或者得到比原始 ...

  4. win10+Python3.7.3+OpenCV3.4.1入门学习(七)————7.1均值滤波(上)

    Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm 均值滤波是指用当前像素点周围N·N个像素值的均值来代替当前像素值.使用该方法遍历处理图像内 ...

  5. Linux入门学习(十二)

    软件安装 软件名称识别 [abrt-addon-ccpp]-[2.1.11-19].[el7].[x86_64].rpm :rpm结尾的适用与redhat操作系统 软件名 abrt-addon-ccp ...

  6. Oracle入门(十二)之SQL的DDL

    一.数据类型 Character 数据类型 Number 数据类型 Date 数据类型 Raw 和 Long Raw 数据类型 LOB 数据类型 注:Oracle数据类型详解 二.表 (1)创建表 c ...

  7. TIA博途SCL入门学习(二)常用基本控制语句用法和举例

    TIA博途SCL入门学习(二)常用基本控制语句用法和举例 FOR循环语句 FOR循环可以指定循环的次数,在使用这种循环的时候需要先定义一个INT型变量,并指定计数范围,即循环次数,直到循环次数到达设定 ...

  8. Reflex WMS入门系列十二:Reflex里的Location

    Reflex WMS入门系列十二:Reflex里的Location 玩过SAP系统里的人都知道,在SAP系统里库存管理分为IM Level和WM Level.IM Level的仓库,在SAP里被定义为 ...

  9. 无人驾驶汽车系统入门(十二)——卷积神经网络入门,基于深度学习的车辆实时检测

    无人驾驶汽车系统入门(十二)--卷积神经网络入门,基于深度学习的车辆实时检测 上篇文章我们讲到能否尽可能利用上图像的二维特征来设计神经网络,以此来进一步提高识别的精度.在这篇博客中,我们学习一类专门用 ...

最新文章

  1. Query理解在美团搜索中的应用
  2. JS中的 generator
  3. 电影网网站优化-SEO篇
  4. 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(61)-如何使用框架来开发?...
  5. POST的表单数据参数过多问题
  6. 链表反转leetcode206
  7. 电脑光驱不读盘_维修电脑找电脑维修君
  8. UVALive 3942 Remember the Word(字典树+DP)
  9. 电力系统潮流计算matlab程序,大神们,求个电力系统潮流计算的matlab程序。
  10. TB创建公式应用dll失败 请检查用户权限,终极解决方案
  11. 他帮 10 多家公司变身独角兽,总结出一份“成功”清单
  12. java调用scala内部类_scala中的内部类 == 简单示例
  13. url编码 java_java中的url 编码与解码
  14. void* LPVOID是些什么东东
  15. Python之灵魂三问,分享学习路上的神器集合!
  16. 通过EverEdit工具连接Linux系统远程操作文件
  17. checkpoint NGFW 实验(一)
  18. 微信投放卡券-支付即会员
  19. mysql 大于当前时间条件查询
  20. garch dcc用matlab,MRS DCC GARCH 模型的MATLAB 程序修改

热门文章

  1. 交叉熵损失函数(Cross Entropy Loss)
  2. python1.常见基础数据结构
  3. Lucene6.6的介绍和使用
  4. html表单内加入小图标,精美的HTML5/CSS3表单 带小图标
  5. 使用 Python 第三方库 xlwt 写入数据到 Excel 工作表
  6. 吃一堑长一智!2021最新Java面试真题解析
  7. 苹果系统iOS、macOS应用管理机制
  8. 【EMC电磁兼容】01.14——近场与远场
  9. videoInput视频采集
  10. jsp电影视频分享影评网站