# ContactAnalysis
大理石接触分析
### 一、环境介绍
* 系统:win10
* 语言:python3.7
* 依赖库:opencv、numpy、PyQt
### 二、功能说明
实际工程中,为了得知路面沥青质量的好坏,需要对其进行数据分析。如下三幅图所示,原图是路面沥青切片,第二幅图是原图的二值化图像(处理的这么好,当然是PS的),第三幅图画出了原图沥青石块之间的接触点。如果人工进行标注的话,工程量过于巨大,所以现在需要通过软件来实现对原图完成数据分析,需要完成以下几个功能点:
* 二值化处理(难点)
* 石块接触分析:以二值化后的图像为基础,计算每个石块的面积,标记出石块间的接触点,计算每个石块质心位置。
* 输出图像:
* 大于2.36mm粗石料接触点位置(两张:点接触图像、线接触图像)
* 接触点连接图
* 接触点Voronoi图
* 大于2.36粗石料的形心连接图
* 输出参数:
* 相互接触大于2.36mm粗石料的面积
* 接触点总数量
* 平均匹配数
* 图像总面积
* 接触石料总面积
* 只有一个接触点石料的总面积
* 无接触石料的总面积(未完成)
* 参数A:接触石料总面积/图像总面积
* 参数B:无接触石料总面积/图像总面积
![1580389512063](readmeImage/1580389512063.png)
![1580389711782](readmeImage/1580389711782.png)
### 三、实现步骤
在本小节,由于Qt界面的实现太没有技术含量,省略,不介绍。
#### 3.1 二值化
经过不停的摸索,翻遍了百度、google、论文,没有一步就可以将其二值化到上图所示的方法,什么OSTU[^1]算法是不行的,由于它是统计整张图片的像素直方图,在光照不均匀的情况下,会产生极大的误差,阴暗位置会产生极大的误差。
~~(如果有足够的数据集,应该可以使用U-net来做)~~
为了得到合适的二值化图像,采用opencv的`adaptiveThreshold`自适应二值化[^2]函数,该函数是基于小窗口二值化方法,在光照不均匀的情况下也可以得到较好的二值化结果,但是这种方法由于其本身的特性,虽然得到较好的轮廓效果,但是也会产生较大的噪声,如下图所示:
![1580392929361](readmeImage/1580392929361.png)
在上图中,虽然噪声对,但是轮廓也比较明显,接下来需要借用到opencv的`findContours`轮廓分析[^3]方法,在参考文献中记录了该方法的使用方法,以及一些应用方法。首先使用该方法去除石块外的其他噪声,去除结果如下:
![1580393248409](readmeImage/1580393248409.png)
接下来,采用`findContours`给出深度[^3]信息(用到多叉树遍历算法,不能使用递归,python的机制里面,一个函数重复调用2000多次后,会强制中断程序,需手动构建堆栈),去除掉最里面的轮廓,去除结果如下:
![1580393316473](readmeImage/1580393316473.png)
接下来,采用`findContours`给出的轮廓大小信息,去除掉小于用户指定尺寸的石块,结果如下所示:
![1580393391685](readmeImage/1580393391685.png)
看的出来,噪声还是很大,没关系,因为这不是最后的二值化图像,还需要使用分水岭算法进行最终的处理,处理之后根据`findContours`方法去除小碎块和最外层边框,处理结果如下:
![1580393545300](readmeImage/1580393545300.png)
至此,石块的二值化结束(为什么和要求的不一样,因为这种二值化,更加方便后续处理),不去除最外层边框就可以和第二章功能说明里面一样!!
#### 3.2 计算石块面积
在opencv中通过`contourArea`结合`findContours`方法可以快速得到每个块的像素点个数,成功得到每个块的面积。
```python
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 对石块标记
直接上代码,通俗易懂:
```python
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:
![ContantsGIF.gif](readmeImage/ContantsGIF.gif)
红色是所有满足条件的接触点,边框变绿表示该轮廓已经计算过,不再参与计算,可以看到,计算速度比较慢,毕竟是暴力法计算。
再说一下数据结构,看代码中的注释就好,将上面得到的接触点存入下面的数据结构中,后面使用起来就会美滋滋。
```python
# -*- coding: utf-8 -*-
# @Time : 2020/1/22 21:04
# @Author : zwenc
# @Email : zwence@163.com
from operator import itemgetter
class contactsLinePointInfo(object):
"""
线接触点信息,记录所有满足条件的点
"""
def __init__(self):
self.PointInfo = []
def appand(self, index1, index2, point1, point2, dis):
"""
index1: 石块1
index2: 接触的石块2
point1: 接触点中心x坐标
point1: 接触点中心y坐标
dis: 半径
"""
if len(self.PointInfo) == 0:
self.PointInfo.append(TowBlocksContactsInfo(index1, index2, point1, point2, dis))
return
# 查找 index1和index2是否已经存在
for towBlocksContactsInfo in self.PointInfo:
if towBlocksContactsInfo.compareIndex(index1, index2):
# 存在,则在里面加点
towBlocksContactsInfo.append(point1, point2, dis)
return
# 不存在,则new一个两个石块接触信息
self.PointInfo.append(TowBlocksContactsInfo(index1, index2, point1, point2, dis))
def __len__(self):
return len(self.PointInfo)
def __getitem__(self, item):
return self.PointInfo[item]
# 将两个石块最小记录的最小单位
class TowBlocksContactsInfo(object):
def __init__(self, index1, index2, point1, point2, dis):
self.index1 = index1
self.index2 = index2
self.pointInfo = [point1, point2, dis]
def append(self, point1, point2, dis):
self.pointInfo.append([point1, point2, dis])
def compareIndex(self, index1, index2):
if self.index1 == index1 and self.index2 == index2:
return True
if self.index2 == index1 and self.index1 == index2:
return True
return False
def getCoordinateByMiddle(self):
# 根据坐标,将中间的点作为接触点位置返回
self.pointInfo.sort(key=itemget
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于python实现的大理石接触精准分析程序+源码+开发文档+项目解析+代码解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于python实现的大理石接触精准分析程序+源码+开发文档+项目解析+代码解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 大理石接触分析 一、环境介绍 系统:win10 语言:python3.7 依赖库:opencv、numpy、PyQt 二、功能说明 实际工程中,为了得知路面沥青质量的好坏,需要对其进行数据分析。如下三幅图所示,原图是路面沥青切片,第二幅图是原图的二值化图像(处理的这么好,当然是PS的),第三幅图画出了原图沥青石块之间的接触点。如果人工进行标注的话,工程量过于巨大,所以现在需要通过软件来实现对原图完成数据分析
资源推荐
资源详情
资源评论
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JPG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/TXT.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JPG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JPG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JPG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/TXT.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JPG.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JPG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JPG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JPG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JPG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/GIF.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 52 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/554c939cfade481faacd75fffe0bdc52_cs1395293598.jpg!1)
![avatar-vip](https://csdnimg.cn/release/downloadcmsfe/public/img/user-vip.1c89f3c5.png)
梦回阑珊
- 粉丝: 3539
- 资源: 1151
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)