【OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率

『youcans 的 OpenCV 例程200篇 - 总目录』


【youcans 的 OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率


特征通常是针对于图像中的某个目标而言的。

我们把感兴趣的人或物称为目标,目标所处的区域就是目标区域。图像分割之后,还要对目标区域进行适当的表示和描述,以便下一步处理。


4.1 基本区域特征描述子

针对目标所在区域的特征描述符(Region descriptors),称为区域特征描述子。
例如:

  • 紧致度(compactness),周长的平方与面积之比,具有平移、尺度、旋转不变性
  • 圆度(circularity),面积与周长的平方之比,具有平移、尺度、旋转不变性
  • 偏心率(Eccentricity),椭圆的偏心率定义为焦距与椭圆长轴的长度之比
  • 拓扑描述子,欧拉数 E 是目标区域的连通分量的数量 C 与孔洞数量 H 的差:E=C−HE=C-HE=CH
  • 纹理,纹理提供了诸如平滑度、粗糙度和规定性等的测度,可以用统计方法和谱方法描述
  • 不变矩,由二阶和三阶归一化中心距可以推导出 7 个二维矩不变量,对于平移、缩放、镜像和旋转是不变的。

区域的面积 A 定义为该区域中的像素数量,区域的周长 p 是区域边界的长度。使用面积和周长作为特征描述子时,要进行归一化处理后才有意义。

(1)紧致度(Compactness),周长的平方与面积之比,具有平移、尺度、旋转不变性。

compactness=p2/Acompactness = {p^2} / {A} compactness=p2/A

紧致度是一个无量纲的测度,圆的紧致度最小,为 4π4\pi4π,正方形的紧致度 是 16。

(2)圆度(Circularity),面积与周长的平方之比,具有平移、尺度、旋转不变性

circularity=4πA/p2circularity = {4 \pi A} / {p^2} circularity=4πA/p2

圆度也是一个无量纲的测度,圆的圆度为 1 最大,正方形的圆度为 π/4\pi / 4π/4

(3)偏心率(Eccentricity),椭圆的偏心率定义为焦距与椭圆长轴的长度之比
eccentricity=2c2a=a2−b2a=1−(b/a)2,a>beccentricity= \frac{2c}{2a} = \frac{\sqrt{a^2-b^2}}{a} = \sqrt{1-(b/a)^2}, \quad a \gt b eccentricity=2a2c=aa2b2=1(b/a)2,a>b
偏心率的值域范围为 [0,1],圆的偏心率为 0 最小,直线的偏心率为 1最大。

通常将不同的特征描述子构造为一组特征向量,容易在特征空间中进行分类和识别。


例程 14.6:区域特征描述之紧致度,圆度和偏心率

    #  14.6 区域特征描述子之紧致度,圆度和偏心率plt.figure(figsize=(9, 6))n = 4for i in range(1,n+1):path = "../images/wingding{}.tif".format(str(i))gray = cv2.imread(path, flags=0)_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  # OpenCV4~cnts = sorted(contours, key=cv2.contourArea, reverse=True)  # 所有轮廓按面积排序cnt = cnts[0]  # 第 0 个轮廓,面积最大的轮廓,(2867, 1, 2)cntPoints = np.squeeze(cnt)  # 删除维度为 1 的数组维度,(2867, 1, 2)->(2867,2)print("{}, path:{}, shape:{}".format(i, path, gray.shape))area = cv2.contourArea(cnt)  # 轮廓面积 (area)print("\tarea of contour: ", area)perimeter = cv2.arcLength(cnt, True)  # 轮廓周长 (perimeter)print("\tperimeter of contour: {:.1f}".format(perimeter))compact = perimeter ** 2 / area  # 轮廓的紧致度 (compactness)print("\tcompactness of contour: {:.2f}".format(compact))circular = 4 * np.pi * area / perimeter ** 2  # 轮廓的圆度 (circularity)print("\tcircularity of contour: {:.2f}".format(circular))ellipse = cv2.fitEllipse(cnt)  # 轮廓的拟合椭圆# 椭圆中心点 (x,y), 长轴短轴长度 (a,b), 旋转角度 ang(x, y), (a, b), ang = np.int32(ellipse[0]), np.int32(ellipse[1]), round(ellipse[2], 1)# print("Fitted ellipse: (Cx,Cy)={}, (a,b)={}, ang={})".format((x, y), (a, b), ang))# 轮廓的偏心率 (eccentricity)if (a > b):eccentric = np.sqrt(1.0 - (b / a) ** 2)  # a 为长轴else:eccentric = np.sqrt(1.0 - (a / b) ** 2)print("\teccentricity of contour: {:.2f}".format(eccentric))imgCnt = np.ones(gray.shape, np.uint8) * 255  # 创建空白图像cv2.drawContours(imgCnt, cnt, -1, 0, 2)  # 绘制轮廓cv2.rectangle(imgCnt, (2, 3), (452, 452), 0, 1)  # 绘制边框notes = np.ones(gray.shape, np.uint8)  # 创建空白图像text1 = "Compactness: {:.2f}".format(compact)text2 = "Circularity: {:.2f}".format(circular)text3 = "Eccentricity: {:.2f}".format(eccentric)imgNotes = cv2.putText(notes, text1, (10,50), cv2.FONT_HERSHEY_PLAIN, 2.5, 0)imgNotes = cv2.putText(notes, text2, (10,100), cv2.FONT_HERSHEY_PLAIN, 2.5, 0)imgNotes = cv2.putText(notes, text3, (10,150), cv2.FONT_HERSHEY_PLAIN, 2.5, 0)plt.subplot(3,n,i), plt.axis('off'), plt.title("Figure_{}".format(i))plt.imshow(gray, cmap='gray')plt.subplot(3,n,n+i), plt.axis('off'), plt.imshow(imgCnt, cmap='gray')plt.subplot(3,n,2*n+i), plt.axis('off'), plt.imshow(imgNotes, cmap='gray')plt.tight_layout()plt.show()

运行结果:

在这里插入图片描述

1, path:../images/wingding1.tif, shape:(454, 454)area of contour:  45497.0perimeter of contour: 796.0compactness of contour: 13.93circularity of contour: 0.90eccentricity of contour: 0.00
2, path:../images/wingding2.tif, shape:(454, 454)area of contour:  37136.0perimeter of contour: 1392.6compactness of contour: 52.22circularity of contour: 0.24eccentricity of contour: 0.00
3, path:../images/wingding3.tif, shape:(454, 454)area of contour:  57600.0perimeter of contour: 960.0compactness of contour: 16.00circularity of contour: 0.79eccentricity of contour: 0.00
4, path:../images/wingding4.tif, shape:(454, 454)area of contour:  35197.0perimeter of contour: 812.9compactness of contour: 18.77circularity of contour: 0.67eccentricity of contour: 0.73

【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125652989)
Copyright 2022 youcans, XUPT
Crated:2022-7-7

222. 特征提取之弗里曼链码
225. 特征提取之傅里叶描述子

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

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

相关文章

Java常见的几种设计模式

单例模式 指一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。 getInstance()的返回值是一个对象的引用,并不是一个新的实例&a…

【OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子 特征通常是针对于图像中的某个目标而言的。 针对目标所在区域的特征描述符(Region descriptors),称为区域特征描述子。 4.2 纹…

【OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子 特征通常是针对于图像中的某个目标而言的。针对目标所在区域的特征描述符(Region descriptors),称为区域特征描述子。 局部…

【OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage) 局部二值模式(LBP,Local binary patterns)是一种用来描述图像局部纹理特征的算子,它具…

Java多线程的使用

无论在我们的工作中还是在我们的生活中,我们都会用到多线程的知识,今天就给大家讲一下如何使用多线程。 序幕 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 我们首先要知道进程和线程分别是什么? 进程 - 进…

oracle 存储过程 db,oracle数据库的存储过程是什么?

oracle数据库的存储过程:一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。存储过程(Stored Procedur…

【OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图 局部二值模式(LBP,Local binary patterns)是一种用来描述图像局部纹理特征的算子,它具有旋转不变性和灰度不变性的优点…

【OpenCV 例程200篇】232. 特征描述之频谱方法

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】232. 纹理特征之频谱方法 4.3 纹理特征之频谱方法 傅里叶谱可以描述图像中的周期性或半周期性二维模式的方向性,因此可以基于傅里叶变换对纹理进行频谱分析。 纹理与图像频谱中的高频分…

java制作oracle程序,Java程序操作Oracle两种方式之简单实现

Java程序操作Oracle两种方式之简单实现1.通过JDBC-ODBC桥连接Oracle数据库(1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名为wangtao,选择一个Service,输入用户名密码,测试连接,若通过说明成功;(注意&…

【OpenCV 例程200篇】233. 区域特征之矩不变量

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】233. 区域特征之矩不变量 4.4 区域特征之矩不变量 矩是概率与统计中的一个概念,是随机变量的一种数字特征。矩函数在图像分析中有着广泛的应用,如模式识别、目标分类、图像编…

【OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM) 4.2.4 灰度共生矩阵(GLCM) 灰度共生矩阵(Gray level co-occurrence matrix,GLCM&#xff…

oracle11 处理器数,11G AWR中%Total CPU与%Busy CPU指标的疑问

ODM FINDING:FROM http://www.os2ora.com/how-to-analyze-awr-report-1/ 推荐 kaya 的这篇文章引用如下:如果关注数据库的性能,那么当拿到一份AWR报告的时候,最想知道的第一件事情可能就是系统资源的利用情况了,而首当其冲的&am…

【OpenCV 例程200篇】237. 基于主成分提取的方向校正(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】237. 基于主成分提取的方向校正(OpenCV) 主成分分析(Principal Components Analysis,PCA)是一种基于统计的数据降维方法,又称主…

swoole 捕捉php错误,swoole怎么处理错误

在协程编程中可直接使用try/catch处理异常。但必须在协程内捕获,不得跨协程捕获异常。不仅是应用层throw的Exception,底层的一些错误也是可以被捕获的,如function、class、method不存在下面的代码中,try/catch和throw在不同的协程…

【OpenCV 例程200篇】235. 特征提取之主成分分析(sklearn)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】235. 特征提取之主成分分析(sklearn) 特征提取是指从原始特征中通过数学变换得到一组新的特征,以降低特征维数,消除相关性,减少无用信息…

Linux 进程资源分配,linux 进程管理和内存分配

1、进程相关概念进程:正在运行中的程序内核功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等Process:运行中的程序的一个副本,是被载入内存的一个指令集合进程 ID(Process ID,PID)号码被用来标记各…

【OpenCV 例程300篇】234. 特征提取之主成分分析(PCA)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】234. 特征提取之主成分分析(PCA) 5.1 特征提取的方法 初步获取的图像特征维数通常很大,而且往往包含一定的无关或冗余特征。特征提取是指从原始特征中通过数学变…

Java并发编程基础

线程的简介 什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 为什么要使用多线…

【OpenCV 例程200篇】236. 特征提取之主成分分析(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】236. 特征提取之主成分分析(OpenCV) 文章目录【youcans 的 OpenCV 例程200篇】236. 特征提取之主成分分析(OpenCV)5.2 主成分分析的数学方法5.4 OpenC…

linux 访问共享内存,Linux下的共享内存(03)---通过指针访问共享内存中的数据...

环境:Vmware Workstation;CentOS-6.4-x86_64说明:1、将共享内存挂载至进程:void *shmat(int shmid, const void *shmaddr,int shmflg);参数shmid是要附加的共享内存区标示符。总是把参数shmaddr设为0。参数shmflg可以为SHM_RDON…