【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测

OpenCV 例程200篇 总目录-202206更新


【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测


3. 基于不变矩检测的图像识别

形状匹配也称为形状相似度检测,用于比较两个形状或两个轮廓。

函数 cv2.matchShapes() 基于 Hu 不变矩检测两个形状之间的相似度,因此图像的平移、旋转、灰度变化、尺度变化对相似度的影响都很小。

Hu 利用二阶和三阶归一化中心距构造了 7 个不变矩 M1~M7, 在连续图像下具有平移、灰度、尺度、旋转不变性, 是高度浓缩的图像特征。 不变矩能够描述图像的整体性质,从而在边缘提取、图像匹配及目标识别中得到了广泛的应用。

在实际的图像识别中,只有 M1 和 M2 的不变性比较好,而 M3~M7 的误差较大,识别率比较低。Hu不变矩对于物体的形状描述比较稳定,比较适合识别较大尺寸的物体,如水果的形状、车牌的字符等。


例程 12.8:基于不变矩的形状相似性检测

    # 12.8 基于不变矩的形状相似性检测img = cv2.imread("../images/Polygon01.png", flags=1)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图像_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_OTSU+cv2.THRESH_BINARY_INV)# 寻找二值化图中的轮廓# binary, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # OpenCV3contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # OpenCV4~#  绘制最外层轮廓contourEx = img.copy()  # OpenCV3.2 之前的早期版本,查找轮廓函数会修改原始图像for i in range(len(contours)):  # 绘制第 i 个轮廓x, y, w, h = cv2.boundingRect(contours[i])  # 外接矩形contourEx = cv2.drawContours(contourEx, contours, i, (205, 0, 0), thickness=-1)  # 第 i 个轮廓,内部填充contourEx = cv2.putText(contourEx, str(i), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255))# 形状相似度检测print("| 对比形状 | 相似度 | 变形方式 |")print("| :--: | :--: | :--: |")similarity = np.array([cv2.matchShapes(contours[10], contours[i], 1, 0.0) for i in range(len(contours))])argSort = similarity.argsort()  # 形状相似度 ret 从小到大排序 (相似度降低)for i in range(len(contours)):index = argSort[i]print("| cnt[10] & cnt[{}] | {} |  |".format(index, round(similarity[index],2)))# 计算所有轮廓的 Hu 不变矩print("| 轮廓编号 | M1 | M2 | M3 | M4 | M5 | M6 | M7 |")print("| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |")cntsHuM = np.empty((len(contours), 7), np.float)for i in range(len(contours)):moments = cv2.moments(contours[i])  # 返回字典,几何矩 mpq, 中心矩 mupq 和归一化矩 nupqhum = cv2.HuMoments(moments)  # 计算 Hu 不变矩cntsHuM[i,:] = np.round(hum.reshape(hum.shape[0]), 2)print("|{}|{:.2e}|{:.2e}|{:.2e}|{:.2e}|{:.2e}|{:.2e}|{:.2e}|".format(i, cntsHuM[i][0],cntsHuM[i][1], cntsHuM[i][2], cntsHuM[i][3], cntsHuM[i][4], cntsHuM[i][5], cntsHuM[i][6]))plt.figure(figsize=(9, 6))plt.subplot(121), plt.axis('off'), plt.title("Origin")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.subplot(122), plt.axis('off'), plt.title("Contours")plt.imshow(cv2.cvtColor(contourEx, cv2.COLOR_BGR2RGB))plt.tight_layout()plt.show()

在这里插入图片描述


形状相似度:

对比形状相似度变形方式
cnt[10] & cnt[10]0.00原图
cnt[10] & cnt[3]0.03放大尺寸
cnt[10] & cnt[11]0.04旋转角度
cnt[10] & cnt[4]0.04缩小尺寸
cnt[10] & cnt[6]0.09旋转 + 缩放
cnt[10] & cnt[9]0.40尾部缩短
cnt[10] & cnt[7]0.52尾部拉长
cnt[10] & cnt[8]0.55头部放大
cnt[10] & cnt[2]0.59不同形状
cnt[10] & cnt[5]0.69形状变形
cnt[10] & cnt[1]1.48缩放+尾部拉长
cnt[10] & cnt[0]1.89扭曲

Hu 不变矩:

轮廓编号M1M2M3M4M5M6M7
102.60e-013.00e-020.00e+000.00e+000.00e+000.00e+00-0.00e+00
32.50e-013.00e-020.00e+000.00e+000.00e+000.00e+000.00e+00
112.50e-013.00e-020.00e+000.00e+000.00e+000.00e+00-0.00e+00
42.50e-013.00e-020.00e+000.00e+000.00e+000.00e+000.00e+00
62.70e-014.00e-020.00e+000.00e+000.00e+000.00e+000.00e+00

程序说明:

  1. 根据形状相似度检测结果进行分析:
    (1) 相似度值越小则图形的相似性越高。本例的基准形状为轮廓 [10] ,与自身的相似度值为 0.0,表示是完全相同的形状。
    (2) 轮廓 [10] 与轮廓 [3]、[11]、[4]、[6] 的相似度值也很小,表示与轮廓 [10] 的相似性很高。这些轮廓是由轮廓 [10] 进行放大、缩小、旋转、旋转+缩放产生的,表明图像的平移、缩放和旋转对相似度的影响都很小。
    (3) 轮廓 [10] 与轮廓 [9]、[7]、[8]、[2]、[5] 的相似度值较小,表示与轮廓 [10] 的相似性较高。这些轮廓有的是由轮廓 [10] 进行尾部或头部拉伸、放大产生,有的进行了较大的变形。
    (4) 轮廓 [10] 与轮廓 [1]、[0] 的相似度值很大,表示与轮廓 [10] 的相似性很低。实际上轮廓 [1] 也是对轮廓 [10] 的尾部拉伸和变形,轮廓 [0] 是对轮廓 [10] 的扭转。
    综合以上结果分析,(1)图像的平移、缩放和旋转对相似度的影响很小;(2)形状相似度检测结果在一定程度上可以反映形状的相似程度,但该指标并不完全可靠。

  2. 轮廓 [10] 与轮廓 [3]、[11]、[4] 的 7 个不变矩 M1~M7 完全相同,这些轮廓是由轮廓 [10] 进行放大、缩小、旋转产生的,这验证了 Hu 不变矩具有具有平移、尺度、旋转不变性。


(本节完)


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125024042)
Copyright 2022 youcans, XUPT
Crated:2022-5-28
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】

194.寻找图像轮廓(cv.findContours)
195.绘制图像轮廓(cv.drawContours)
196.图像的矩和不变矩(cv.moments)
197.轮廓的基本特征
198.基于不变矩的形状相似性检测
199.轮廓的外接边界框
200.轮廓的基本属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot 如何修改默认端口号和context path

创建了SpringBoot项目之后进行运行,当我们需要使用游览器进行访问的时候要输入端口号,那麽我们如何来修改这个端口号呢??? 1.在src/main/resources目录下新建文件application.properties,并进行配置,来重写…

【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框

OpenCV 例程200篇 总目录-202206更新 【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框 文章目录【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框2. 轮廓的特征描述2.3 轮廓的外接边界框2.3.1 轮廓的垂直矩形边界框2.3.2 轮廓的最小矩形边界框2.3.3 轮廓的最小外接圆…

单级联动

想要实现联动的效果首先我们要知道什么是单机联动,所谓的单级联动就是点击输入框的时候,下面会出现多个单级联动的列表供你选择自己所要选择的数据。 我们使用html写主题内容,使用CSS添加样式,使用Jquery实现联动等相关的事件和效…

【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性

OpenCV 例程200篇 总目录-202206更新 文章目录【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性2.4 轮廓的基本属性2.4.1 轮廓的宽高比(Aspect Ratio)2.4.2 轮廓的面积比(Extent)2.4.3 轮廓的坚实度(Solidity&#…

mysql c api example_The MySQL C API 编程实例

在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇《The MySQL C API 编程实例》,希望对须要调用到MYSQL的C的API的朋友有所帮助,附例中的环境为RedHat在这篇文章里,我们将学会怎…

【youcans 的 OpenCV 例程200篇】结束语

【youcans 的 OpenCV 例程200篇】总目录 【youcans 的 OpenCV 例程200篇】结束语 【youcans 的 OpenCV 例程】真的写到了 200篇,迎来了“结束语”。 本系列原名【OpenCV 例程 100篇】,从 2021年 11月开始写作,原计划每天写一篇,写…

java aspose 导出word_使用aspose.word 第三方的插件实现导出word

#region 生成的excel文件命名和确保文件的唯一性Random rd new Random();DateTime dtime DateTime.Now;string Filename "培训需求表" dtime.Year.ToString() dtime.Month.ToString() dtime.Day.ToString() dtime.Hour.ToString() dtime.Minute.ToString() …

智能家居(1)行业发展分析

1 智能家居系统 智能家居是基于物联网技术,由硬件系统、软件系统、云计算平台构成一个家庭生态圈,为用户提供安全、便利、舒适的家居生活环境。 具体而言,智能家居以住宅为单位、以家庭生活为背景,以综合布线技术、网络通信技术…

redis 高级实用教程

一、设置redis外网访问 更改redis.conf 文件 # vim redis.conf bind 127.0.0.1 # 注释掉改行 protected-mode yes # 更改模式为no(redis3.2后)二、设置密码验证 更改redis.conf配置文件 requirepass redhat或者通过set设置 127.0.0.1:6284>…

java学到哪里最容易蒙,蒙哥比vs蒙克(目前最好的哪个)

Im planning to integrate mongodb based migration tool in my spring boot application which is having spring-data dependency in project. I found main two libraries 1) Mongobee 2) Mongock.I need some feedback which one should i choose ? Thanks in advance!解决…

LaTex实战笔记 4-插入 Python 程序代码块

LaTex插入 Python 程序代码块1. 需求描述和解决方案2. minted 包的安装与配置2.1 安装 Python 第三方库 Pygments2.2 下载和安装 minted 宏包2.3 配置 LaTeX 编译环境3. minted 包的使用3.1 基本使用3.2 扩展使用3.2.1 \mint 命令行3.2.2 \mintinline 行内使用3.2.3 \inputmint…

Redis 安装与配置

Redis 安装与配置 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases。 这里我们下载 Redis-x64-xxx.zip 解压到指定目录:  打开命令行(cmd)跳转至解压路径,并运行安装命令,结果如图 C:\U…

智能家居(2)智能体验与智能交互

1. 智能体验的分析与讨论 随着信息和网络技术的发展,可以网络连接的电子电器产品越来越丰富,智能家居、智慧园区、智能汽车等智能控制系统和产品应用越来越广泛。 智能交互终端是智能控制系统的人机交互接口,既是实现智能功能的重要载体&am…

netbeans java9_Java 开发新选择?Apache NetBeans IDE 9.0 备受好评

Apache NetBeans 9.0 目前已发布 Beta 版本,离正式版本越来越近。9.0 版本的主要目标囊括 Oracle 捐赠的大量代码,以及提供 Java 9 和 10 支持。Apache NetBeans 近期在社区上发起了一项满意度调查,用于验收用户如何对 9.0 版本的看法&#x…

LaTex实战笔记 1-快速入门

LaTex插入 Python 程序代码块1. 为什么用 LaTeX?2. LaTeX 的安装与配置2.1 安装 TeXLive2.2 选择 LaTeX 编辑器3. LaTeX 的初次使用3.1 最短的 LaTeX 示例3.2 从模板创建文档3.3 编译生成 PDF 文件4. 基于模板编辑文档4.1 tex 模板的基本结构4.2 基于模板编辑排版5.…

Redis 常见命令

Redis一共有5种数据类型 : String(字符串) List(列表)Hash(字典) Set(集合)Sorted Set(有序集合) 不同的数据类型,有不同的命令方式…

java fx 皮肤_JavaFX 皮肤功能

作为RIA技术之一,为了让应用程序的界面看起来更加的漂亮或者更有个性,皮肤功能自然是必不可少的。在JavaFX中,可以使用CSS样式表来进行皮肤的更换。不过JavaFX中的CSS是基于W3C CSS version 2.1,但又不完全相同。JavaFX中的换肤有…

LaTex实战笔记 2-文档层次与结构

LaTeX 支持结构化文档的编写。 什么是结构化文档?会议论文、期刊论文、学位论文,这类有统一结构、统一版式的文档,是典型的结构化文档。而报刊文章的结构则因人而异,因文而异,是典型的非结构化文档。 1. 结构化文档的…

java爬取小说

使用Java爬取网站:http://www.shicimingju.com的小说内容 代码详解 1.在本地创建存储位置 2.编写正则表达式 3.循环获取内容 4.把内容存入文件夹中 5.判断成功或失败 效果演示 代码展示 package text;import java.io.BufferedReader;import java.io.BufferedWri…

java json u0026_特殊字符的json序列化

先来看一段golangpackage mainimport ("encoding/json""fmt")func main() {data : map[string]string{"str0": "Hello, world","str1": ""str2": ">","str3": "&",}js…