资源下载地址: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对的大理石接触分析相关推荐

  1. 第14章-1~3 法兰接头预紧力密封接触分析周期对称 (介绍、局部柱坐标系建立、周期对称的设置) Beta选项打开、 cyclic region、symmetry

    第14章-1~3 法兰接头预紧力密封接触分析周期对称 (介绍.局部柱坐标系建立.周期对称的设置) Beta选项打开. cyclic region.symmetry 冬 泳 怪 鸽 2020-08-31 ...

  2. Python就业行情和前景分析之一

    Python就业行情和前景分析之一爬取数据 最近Python大热,就想要分析一下相关的市场需求,看一下Python到底集中在哪些城市,企业对Python工程师的一些需求到底是怎样的,基于此,爬取了国内 ...

  3. 第17章- 5~8 钣金实体书架与刚体平台接触分析、材料弹塑性分析(网格控制、刚体接触设置,刚体只能作为接触的目标面、爆炸显示、载荷步设置、残余应力)

    第17章- 5~8 钣金实体书架与刚体平台接触分析.材料弹塑性分析(网格控制.刚体接触设置,刚体只能作为接触的目标面.爆炸显示.载荷步设置.残余应力) 冬 泳 怪 鸽 2020-09-17 18:07 ...

  4. Python通过人脸识别全面分析好友,一起看透你的“朋友圈”!

    微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友 ...

  5. Python新冠疫情可视化分析系统 计算机专业毕业设计源码08504

    摘 要 文中首先对新冠疫情可视化分析的项目需求进行了背景分析,接着介绍了项目的总体设计思路,然后具体阐述了疫情数据库的设计.疫情数据的查询.疫情数据的展示,并分析了核心代码.文中利用MySQL数据库存 ...

  6. python框架django书籍_有Python基础,刚接触web框架的Django初学者。

    本文面向:有Python基础,刚接触web框架的Django初学者. 环境:windows7 python3.5.1 pycharm Django 1.10版 pip3 一.Django简介 百度百科 ...

  7. python实现简单的情感分析

    python实现简单的情感分析 1 数据导入及预处理 1.1 数据导入 # 数据导入 import pandas as pd data = pd.read_csv('../data/京东评论数据.cs ...

  8. Python使用matplotlib可视化相关性分析热力图图heatmap、使用seaborn中的heatmap函数可视化相关性热力图(Correllogram)

    Python使用matplotlib可视化相关性分析热力图图heatmap.使用seaborn中的heatmap函数可视化相关性热力图(Correllogram) 目录

  9. Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化

    拿来主义: python -m cProfile -o profile.pstats to_profile.py gprof2dot -f pstats profile.pstats |dot -Tp ...

最新文章

  1. python格式化字符_Python格式化字符 %s %d %f
  2. 经典C语言程序100例之六九
  3. 项目经理主要工作职责
  4. Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag
  5. RCurl网络数据抓取
  6. 普通人学python有意义吗-普通人为什么要学习Python?
  7. Stack of js
  8. 目标检测(Object Detection)—— M2Det
  9. PTA 基础编程题目集 7-15 计算圆周率 C语言
  10. 解决MATLAB的xlsread函数读取表格失败
  11. 使用Hooks实现防抖节流 TS版本
  12. 怎么戒网瘾?一个玩了上百款游戏的程序员告诉你有多少废话
  13. js(jquery)鼠标移入移出事件时,出现闪烁、隐藏显示隐藏显示不停切换的情况
  14. MySQL:使用NavicatIP远程连接失败,提示“is not allowed to connect to this MySql server”
  15. 旺店通与用友U8集成解决方案
  16. 名悦集团:开车从不追尾,老司机分享驾驶避免事故小知识
  17. Java并发知识点快速复习手册(下)
  18. 开源,全栈的道路开始变得清淅了
  19. 【第一期】电子元器件创意作品,附带高清原图
  20. 设置软件有效许可期(设置截止时间)

热门文章

  1. 【图片新闻】洛克希德马丁公司发布第一架F-21战斗机
  2. 测绘现行国家及行业标准汇总(截至2021年1月)可下载在线查看相关规范
  3. 读 精益数据分析 笔记
  4. 指针<小罗爱c语言>
  5. 价值1.35亿美元的BUG
  6. Spring Security 入门 Remember-Me 记住我功能
  7. 怎么制作搞笑的GIF
  8. Nginx 面试40问
  9. 投研报告 - Ariva(ARV)
  10. 微信小程序二维码如何生成?