通过Python对的大理石接触分析
资源下载地址:https://download.csdn.net/download/sheziqiong/85928818
资源下载地址:https://download.csdn.net/download/sheziqiong/85928818
一、环境介绍
- 系统:win10
- 语言:python3.7
- 依赖库:opencv、numpy、PyQt
二、功能说明
实际工程中,为了得知路面沥青质量的好坏,需要对其进行数据分析。如下三幅图所示,原图是路面沥青切片,第二幅图是原图的二值化图像(处理的这么好,当然是 PS 的),第三幅图画出了原图沥青石块之间的接触点。如果人工进行标注的话,工程量过于巨大,所以现在需要通过软件来实现对原图完成数据分析,需要完成以下几个功能点:
- 二值化处理(难点)
- 石块接触分析:以二值化后的图像为基础,计算每个石块的面积,标记出石块间的接触点,计算每个石块质心位置。
- 输出图像:
- 大于 2.36mm 粗石料接触点位置(两张:点接触图像、线接触图像)
- 接触点连接图
- 接触点 Voronoi 图
- 大于 2.36 粗石料的形心连接图
- 输出参数:
- 相互接触大于 2.36mm 粗石料的面积
- 接触点总数量
- 平均匹配数
- 图像总面积
- 接触石料总面积
- 只有一个接触点石料的总面积
- 无接触石料的总面积(未完成)
- 参数 A:接触石料总面积/图像总面积
- 参数 B:无接触石料总面积/图像总面积
三、实现步骤
在本小节,由于 Qt 界面的实现太没有技术含量,省略,不介绍。
3.1 二值化
经过不停的摸索,翻遍了百度、Google、论文,没有一步就可以将其二值化到上图所示的方法,什么 OSTU[^1]算法是不行的,由于它是统计整张图片的像素直方图,在光照不均匀的情况下,会产生极大的误差,阴暗位置会产生极大的误差。
为了得到合适的二值化图像,采用 opencv 的 adaptiveThreshold
自适应二值化[^2]函数,该函数是基于小窗口二值化方法,在光照不均匀的情况下也可以得到较好的二值化结果,但是这种方法由于其本身的特性,虽然得到较好的轮廓效果,但是也会产生较大的噪声,如下图所示:
在上图中,虽然噪声对,但是轮廓也比较明显,接下来需要借用到 opencv 的 findContours
轮廓分析[^3]方法,在参考文献中记录了该方法的使用方法,以及一些应用方法。首先使用该方法去除石块外的其他噪声,去除结果如下:
接下来,采用 findContours
给出深度[^3]信息(用到多叉树遍历算法,不能使用递归,python 的机制里面,一个函数重复调用 2000 多次后,会强制中断程序,需手动构建堆栈),去除掉最里面的轮廓,去除结果如下:
接下来,采用 findContours
给出的轮廓大小信息,去除掉小于用户指定尺寸的石块,结果如下所示:
看的出来,噪声还是很大,没关系,因为这不是最后的二值化图像,还需要使用分水岭算法进行最终的处理,处理之后根据 findContours
方法去除小碎块和最外层边框,处理结果如下:
至此,石块的二值化结束(为什么和要求的不一样,因为这种二值化,更加方便后续处理),不去除最外层边框就可以和第二章功能说明里面一样!!
3.2 计算石块面积
在 opencv 中通过 contourArea
结合 findContours
方法可以快速得到每个块的像素点个数,成功得到每个块的面积。
self.blocksSize.append([contourIndex, cv2.contourArea(contrs)])
- contourIndex:为石块的下标。
- cv2.contourArea(contrs):该石块的面积
将每个石块的大小记录在 self.blocksSize
。
3.3 计算接触点
点接触:两个石块之间只显示一个接触点。
线接触:两个石块之间,显示满足阈值距离的所有接触点
3.3.1 分析
这一步需要得到点接触和线接触,而点接触可以从线接触中获得,所以先获得所有的线接触。实现步骤:
- 对每个石块的边缘进行标记,通过像素标记,如果是 1,则其像素为(0,0,1)。
- 遍历所有的块,在每个块的边缘,以圆为半径找其他块的边缘,满足则记录在数据中。
- 点接触:在线接触中,提取出点接触
3.3.2 对石块标记
直接上代码,通俗易懂:
def generateMasker(self, contour):masker = np.zeros_like(self.image)for contourIndex, contrs in enumerate(contour):if cv2.contourArea(contrs) < self.blocksize:continue# 对每一个块进行编码x1 = int((contourIndex + 1) / (256 * 256))x2 = int(((contourIndex + 1) - 256 * 256 * x1) / 256)x3 = int((contourIndex + 1) - 256 * 256 * x1 - 256 * x2)cv2.drawContours(masker, contour, contourIndex, (x1, x2, x3), thickness=1)return masker
输入是通过 findContours
得到的轮廓信息,返回的 masker 就是编码成功的图层。
3.3.3 计算线接触
暴力法计算点附近是否有临近点,代码比较复杂,但原理比较简单,动图比较通俗易懂,直接上 GIF:
红色是所有满足条件的接触点,边框变绿表示该轮廓已经计算过,不再参与计算,可以看到,计算速度比较慢,毕竟是暴力法计算。
再说一下数据结构,看代码中的注释就好,将上面得到的接触点存入下面的数据结构中,后面使用起来就会美滋滋。
四、结果展示
形心图:
形心连接图:
点接触图:
线接触图:
接触点 Voronoi 图:
参数输出:
接触点数量:133
平均匹配数: 1.13
石块总面积: 1824.46 mm2
有接触石块面积: 582.67 mm2
无接触石块面积: 80.9 mm2
参数A(接触石料的总面积/石块总面积): 31.94 %
参数B(无接触石料的总面积/石块总面积): 4.43 %
块大小:
0: 2.177 mm2
1: 1.161 mm2
2: 1.841 mm2
3: 4.110 mm2
4: 4.629 mm2
5: 5.546 mm2
6: 1.314 mm2
7: 2.482 mm2
8: 2.207 mm2
9: 5.783 mm2
10: 12.765 mm2
11: 3.201 mm2
12: 1.726 mm2
...
Qt 操作界面展示:
有些点(边缘为白色的小石块)没有计算,是因为不满足设置的最小石块的大小,所以会跳过计算。
资源下载地址:https://download.csdn.net/download/sheziqiong/85928818
资源下载地址:https://download.csdn.net/download/sheziqiong/85928818
通过Python对的大理石接触分析相关推荐
- 第14章-1~3 法兰接头预紧力密封接触分析周期对称 (介绍、局部柱坐标系建立、周期对称的设置) Beta选项打开、 cyclic region、symmetry
第14章-1~3 法兰接头预紧力密封接触分析周期对称 (介绍.局部柱坐标系建立.周期对称的设置) Beta选项打开. cyclic region.symmetry 冬 泳 怪 鸽 2020-08-31 ...
- Python就业行情和前景分析之一
Python就业行情和前景分析之一爬取数据 最近Python大热,就想要分析一下相关的市场需求,看一下Python到底集中在哪些城市,企业对Python工程师的一些需求到底是怎样的,基于此,爬取了国内 ...
- 第17章- 5~8 钣金实体书架与刚体平台接触分析、材料弹塑性分析(网格控制、刚体接触设置,刚体只能作为接触的目标面、爆炸显示、载荷步设置、残余应力)
第17章- 5~8 钣金实体书架与刚体平台接触分析.材料弹塑性分析(网格控制.刚体接触设置,刚体只能作为接触的目标面.爆炸显示.载荷步设置.残余应力) 冬 泳 怪 鸽 2020-09-17 18:07 ...
- Python通过人脸识别全面分析好友,一起看透你的“朋友圈”!
微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友 ...
- Python新冠疫情可视化分析系统 计算机专业毕业设计源码08504
摘 要 文中首先对新冠疫情可视化分析的项目需求进行了背景分析,接着介绍了项目的总体设计思路,然后具体阐述了疫情数据库的设计.疫情数据的查询.疫情数据的展示,并分析了核心代码.文中利用MySQL数据库存 ...
- python框架django书籍_有Python基础,刚接触web框架的Django初学者。
本文面向:有Python基础,刚接触web框架的Django初学者. 环境:windows7 python3.5.1 pycharm Django 1.10版 pip3 一.Django简介 百度百科 ...
- python实现简单的情感分析
python实现简单的情感分析 1 数据导入及预处理 1.1 数据导入 # 数据导入 import pandas as pd data = pd.read_csv('../data/京东评论数据.cs ...
- Python使用matplotlib可视化相关性分析热力图图heatmap、使用seaborn中的heatmap函数可视化相关性热力图(Correllogram)
Python使用matplotlib可视化相关性分析热力图图heatmap.使用seaborn中的heatmap函数可视化相关性热力图(Correllogram) 目录
- Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化
拿来主义: python -m cProfile -o profile.pstats to_profile.py gprof2dot -f pstats profile.pstats |dot -Tp ...
最新文章
- python格式化字符_Python格式化字符 %s %d %f
- 经典C语言程序100例之六九
- 项目经理主要工作职责
- Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag
- RCurl网络数据抓取
- 普通人学python有意义吗-普通人为什么要学习Python?
- Stack of js
- 目标检测(Object Detection)—— M2Det
- PTA 基础编程题目集 7-15 计算圆周率 C语言
- 解决MATLAB的xlsread函数读取表格失败
- 使用Hooks实现防抖节流 TS版本
- 怎么戒网瘾?一个玩了上百款游戏的程序员告诉你有多少废话
- js(jquery)鼠标移入移出事件时,出现闪烁、隐藏显示隐藏显示不停切换的情况
- MySQL:使用NavicatIP远程连接失败,提示“is not allowed to connect to this MySql server”
- 旺店通与用友U8集成解决方案
- 名悦集团:开车从不追尾,老司机分享驾驶避免事故小知识
- Java并发知识点快速复习手册(下)
- 开源,全栈的道路开始变得清淅了
- 【第一期】电子元器件创意作品,附带高清原图
- 设置软件有效许可期(设置截止时间)