基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)

2023-11-12

主要内容

本文对裂缝检测技术进行了深入研究,并结合裂缝图像的特征,提出了一种基于传统机器学习和图像处理技术的裂缝检测方法,实现裂缝基本参数的计算和显示。内容如下:

1.裂缝图像采集(无人机)

2.裂缝图像预处理

3.裂缝分割(提取)、裂缝连接

4.裂缝分类(SVM支持向量机)

5.裂缝主要参数计算(裂缝长度、裂缝最大宽度、裂缝面积占比)

6.MATLAB GUI软件界面设计

7.结束语

​​​​​​本文提供裂缝检测系统软件及完整程序(含裂缝图片数据),访问(评论区置顶):

 

软件界面展示、裂缝检测结果展示:

1、裂缝图像采集

采集裂缝图像的设备可以是相机、无人机等,这不影响后续裂缝的处理,本文使用四无人机来采集桥梁裂缝图像。通过控制无人机遥控器并结合预先计算好的无人机飞行参数(下文详细介绍),让无人机与桥梁面保持一定距离飞行,采集桥梁图像。

1.1图像尺寸标定

完成裂缝图像采集之后,需要对裂缝的主要参数,例如长度、最大宽度以及面积进行计算,所以提前对图像进行尺寸标定,确定好图像中像素代表的实际物理尺寸十分必要,最后在软件界面中直接输出实际裂缝的具体参数。

要想准确计算出裂缝的各项参数,那么在图像采集的整个过程中必须让无人机摄像头与桥面保持固定的距离,并需要考虑到测量所要实现的精度。本文图像采集的精度不得低于0.2mm,则通过计算可得,在拍摄像素为2720×1530时,要求采集到的图像实际覆盖区域不得超过544×306mm。确定拍摄距离的方法如下表所示:

步骤序号

具体方法

1

由于无人机摄像头的像素为2720×1530,故提前在白纸上画出长为544mm,宽为306mm的长方形;

2

将白纸固定在任意墙面上,让无人机悬停在空中,通过调整无人机与墙面之间的距离,使得摄像头拍摄到的画面刚好覆盖住整个长方形;

3

此时,使用辅助工具(卷尺)测量无人机摄像头到墙面的距离;

4

反复多次进行测量,求得距离的平均值为350mm;

在拍摄距离得到确认后,就需要计算出一个像素所代表的的实际物理尺寸。首先将无人机悬停在距离墙面300mm(小于350mm即可)的位置处,保证无人机镜头与墙面90°垂直,此时测量出摄像头所覆盖区域的长度和宽度,分别为513mm和288mm,此时可计算出图片中每一个像素代表的实际长度为δ1=513/2720≈0.19mm/pixel,δ2=288/1530≈0.19mm/pixel,故δ=0.19mm/pixel,完成尺寸标定。

2、裂缝图像预处理

2.1图像灰度化

为提高系统处理和分析图像的效率,就需要对多余的色彩信息进行剔除,将彩色图像转换成灰度图像可以有效的达到这一目的。

img=rgb2gray(img);

2.2图像对比度增强

在图像灰度化后,仍然可能会存在图像光照不均、细节部分较暗等问题,使用线性灰度变换可以使图像中的裂缝目标获得更好的视觉效果,增强裂缝目标细节,方便后续步骤的处理。

img=imadjust(img,[0.25,0.6],[0,1]);%对比度增强

也可使用直方图均衡化来增强图像对比度,但效果不是很好。

 2.3图像滤波去噪

图像增强后,虽然能提高图像整体的对比度,但是不能消除图像中的干扰因素,因此需要经过滤波去噪算法来消除干扰,使裂缝轮廓更加清晰。但是在进行去噪前可以添加一步形态学低帽变换,突出裂缝特征,以此来达到一个更好的去噪效果。

%形态学低帽变换,体现原始图像的灰度谷值
se=strel('disk',7);
img=imbothat(img,se);

图像去噪的方法有很多:均值滤波法、中值滤波法以及高斯滤波等等,对比各种去噪方法,发现高斯去噪效果最好。

%滤波去噪
    H = fspecial('gaussian',3,3);%高斯滤波算子
    img = imfilter(img,H,'replicate');%进行高斯滤波
%   img=medfilt2(img,[3 3]);%中值法平滑效果不好

 3、裂缝分割、裂缝连接

3.1裂缝分割

最常见的自动确定阈值的算法是大津阈值法(Otsu),但大津阈值法只适用于双峰性质较明显的图像,观察上示裂缝图像直方图,发现双峰性质并不明显,故本文直接给出了固定分割阈值,设定为90/255,分割效果如图。

  img=im2bw(img,90/255);   
阈值分割效果图

显然,图像分割后还是会存在大量噪声区域,故必须进行二次去噪,本文提出一种基于连通域的动态去噪方法。通过观察裂缝图像发现,裂缝的连通域面积远远大于噪声的连通域面积,故可通过计算噪声面积和裂缝面积的比值,以此确定是否滤除当前的连通区域。

img=bwareaopen(img,50);
[L,num] = bwlabel(img);%计算裂缝连通域
stats = regionprops(L); 
Ar = cat(1, stats.Area); 
a=max(Ar);
  for i = 1 : num
      A=stats(i).Area;%遍历各个连通域的面积
      if((A/a)<0.1)
          ind = find(A);
          img(find(L==i))=0;%设为背景
      else
          ind = find(A);
          img(find(L==i))=1;%设为目标
      end
  end
基于连通域的动态去噪效果图

 3.2裂缝连接

(1)形态学闭运算

观察上图,噪声区域已经基本被滤除,但是裂缝毛刺较多,且出现了断裂情况,可以通过形态学闭操作运算解决此问题,获得更好的裂缝提取效果。

形态学闭运算效果图

 (2)KD树裂缝连接算法

尽管形态学闭运算可以实现部分断裂裂缝的连接,但是它并不适用于处理所有断裂裂缝。故本文提出一种基于KD树的裂缝连接算法,利用KD树的思想来找出相邻裂缝的端点,通过判断端点间的欧几里得距离是否符合阈值条件,从而来确定这两个端点是否需要连接起来,效果如图。

BW=img;
[L,num] = bwlabel(BW,8);%找到图中连通域,num为连通域个数
if(num>1)    
     s=regionprops(BW,'ConvexHull');%找到图像的最小凸多边形
     axes(handles.axes9);imshow(BW);
    [m1 ,~]=size(s(1).ConvexHull);
    [m2 ,~]=size(s(2).ConvexHull);
    len=length(s);
 for i=1:len-1
    for j=i+1:len        
        [m1 ,~]=size(s(i).ConvexHull);
        [m2 ,~]=size(s(j).ConvexHull);      
        for h=1:m1
            for k=1:m2              
                  if  pdist([s(i).ConvexHull(h,:) ;s(j).ConvexHull(k,:)],'euclidean')<20
                      hold on;
                      plot([s(i).ConvexHull(h,1) ,s(j).ConvexHull(k,1)]  ,[s(i).ConvexHull(h,2) ,s(j).ConvexHull(k,2)],'w');
                  end
            end
        end
    end
end
  else
%           title('无断裂情况');
  end

至此,我们就得到了较为理想的二值裂缝图像。

4、裂缝分类(SVM)

不同类型的裂缝在其物理参数计算时用到的方法也有差异,故需先对裂缝进行分类处理,大致可分为规则裂缝和非规则裂缝,规则裂缝又包括横向裂缝和纵向裂缝。本文使用传统的机器学习算法——SVM支持向量机来进行分类。

支持向量机的分类原理在此就不多做赘述,读者可查阅相关博文进行了解,或者我后续可就裂缝分类专门发表一篇博文。裂缝分类流程如图所示:

 本文选取的裂缝训练特征是HOG特征,将裂缝分为横向裂缝、纵向裂缝以及其他裂缝,采用SVM一对多的分类方式,最后用混淆矩阵评估分类器准确度。

5、裂缝参数计算

对于规则裂缝(横向、纵向),需计算裂缝的长度和最大宽度,对于非规则裂缝,则需计算裂缝区域的面积占比。

5.1裂缝长度

计算裂缝长度时,可以先将裂缝图像细化,得到裂缝单像素线条,再用图像中总像素个数乘以每个像素代表的实际长度即为裂缝的总长度,在第一小节已经计算出每个像素代表的实际物理长度为0.19mm/pixel,从而可直接计算出实际裂缝长度。

 B=im2bw(img,0.5);
 I = bwmorph(B,'skel',Inf);%细化

5.2裂缝最大宽度

本文提出一种基于形态学腐蚀操作的裂缝最大宽度求解算法。根据形态学腐蚀的原理,裂缝图像每进行一次腐蚀操作,裂缝面积就会缩小一圈,对于裂缝最宽的部分肯定是最后被腐蚀掉的。所以可以选择一个半径较小的结构元素对裂缝二值图像进行腐蚀,统计在图像像素个数逐渐变为0的过程中产生的腐蚀次数n,设裂缝最大宽度为P,L代表每腐蚀一次消除掉的宽度,得到以下最大宽度计算公式:

                P=n×L                 

 本文求解出的L=0.05mm

 bw=imread('picture1.png');%读入裂缝图像
   cont=1;
    for i =1 : 10
        se=strel('disk',1);
        bw=imerode(bw,se);%腐蚀一次
         m=sum(sum(bw));
         if(m==0)
             disp(cont);
         else
             cont = cont+1;
         end
    end
  M=cont*0.05;

由于本文针对的是桥梁裂缝图像,故还对桥梁健康状况进行评估。当裂缝最大宽度小于0.2mm时认为桥梁状况安全;数值大于0.2mm且小于0.3mm时,建议维护;当数值大于0.3mm时发出危险警报,建议立即维护。

5.3裂缝面积占比

对于非规则裂缝,无法求出裂缝长度和宽度,故用裂缝面积占比来衡量桥梁健康状况。方法如下:

(1)计算图像总像素个数M;

(2)计算裂缝区域(像素灰度值为1)像素个数;

(3)则裂缝面积占比P的计算公式为:P=N/M     

6、MATLAB GUI软件界面设计

 在成功计算出所有裂缝参数后,为了更直观的展示测量结果,方便用户使用,本文还进一步设计了基于MATLAB GUI的软件界面。软件界面如文章开头处所示,分为三个区域:图像显示区域、控制面板以及参数显示区域,实现了五个功能。

(1)载入图像:载入原始裂缝图像。

(2)图像处理:通过上述操作,得到裂缝二值图像,并进行显示。同时计算出裂缝的主要参数,将其显示在参数显示区域。

(3)保存结果:利用MATLAB与Office Excel之间的便捷接口,可以方便的将裂缝的主要参数保存在Excel表格中。

(4)清空数据。

(5)退出界面。

软件系统运行结果展示:

 7、结束语

##本文提供了完整的程序代码(包括GUI界面)以及所有裂缝图像数据集,下载即可运行:##

 (评论区置顶链接)

文章难免有疏漏之处,请多多包涵,如果有更好的实现方法欢迎各位赐教!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机) 的相关文章

  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • 考虑预分配速度[重复]

    这个问题在这里已经有答案了 我正在做以下事情 for i 1 m index 0 for j 1 n index index values i j 2 j 1 if j 1 symbol chip chip values index 1 e
  • 在 Pari-GP 中嵌套特定递归

    每个人 我最初在 Stackexchange 上发布了类似的问题 它已移至此处 可以在链接中找到 在 Matlab 中声明函数递归序列 https stackoverflow com questions 67146061 declaring
  • Matlab strcat 不返回字符串?

    imgstr 无法识别 strcat 的输出字符串 homedir C Users images for img 01 bmp 02 bmp 03 bmp imgstr strcat homedir img I imread imgstr
  • 在 MATLAB 图中用值标记点

    以下命令确实用正方形标记了点 但没有在其中放入值 例如 21 0 X 21 8 2 1 0 Y 0 1 2 3 4 plot X Y k s 我应该添加哪个参数以便全部5点值出现在图上吗 这些值不能一一键入 因为它们是随机数 因此它们可能会
  • Blob 的簇生长

    考虑以下来自 Mathworks 的图像 我已经用标签标记了斑点 L num bwlabel I 如何迭代连接所有斑点 即从一个斑点开始 找到离它最近的一个 考虑最左边的两个斑点 可以从一个斑点的许多点绘制许多条线来连接到另一个斑点blob
  • Matlab下降低图像质量

    问候 我正在尝试找到一种简单的方法来处理图像 以便将其质量从 8 位降低到 3 位 实现这一目标的最简单方法是什么 干杯 如果要线性缩放 只需将每个像素值除以 255 7 即 如果原始图像存储在矩阵 I 中 则让低分辨率图像 J I 255
  • Matlab 中的 3D 堆叠条形图

    我想在一个图中绘制多个堆叠条形图 detached 条形图 例如 准确地想象一下bar http mathworks com help matlab ref bar3 detached png绘图 但堆叠在一起 而不是单一颜色 Set up
  • MATLAB 子图标题和轴标签

    我有以下脚本来最终绘制 4 x 2 子图 files getAllFiles preliminaries n size files cases cell 1 n m cell 1 n for i 1 1 n S load files i c
  • 将值从 C++ MEX 文件返回到 MATLAB

    我正在编写一个从 C 代码中检索数据的 MATLAB 程序 为此 我在 MATLAB 中创建了一个 MEX 文件和一个网关 mexFunction 虽然可以在 MATLAB 中读取读取值 但我无法检索它来使用它 如果不清楚 我有与这里完全相
  • 计算向量的导数

    我有以下函数 维维亚尼曲线 Phi t cos t 2 cos t sin t sin t 只需检查它是否有效 s linspace 0 T 1000 plot3 cos s 2 cos s sin s sin s 如何推导函数Phi 可能
  • MATLAB 问题中的 Parfor

    为什么我不能使用parfor在这段代码中 parfor i 1 r for j 1 N r xr j N r i 1 x i r j 1 end end 这是错误 错误 parfor 中的变量 xr 无法分类 请参阅 MATLAB 中的并行
  • MATLAB;具有 2+ 个/分割图例的饼图 R2017b

    我正在创建一个饼图 理想情况下希望图例水平显示在顶部和 或底部 然而 在几乎所有情况下 这是不可能的 因为图例超出了数字 因此 我理想情况下希望将图例分成两个 或更多 子图例并单独放置它们 我知道这不是 MATLAB 中的内置功能 我使用的
  • Python 中 Matlab 'fscanf' 的等价物是什么?

    Matlab函数fscanf 似乎很强大 python 或numpy 中是否有相同的等效项 具体来说 我想从文件中读取矩阵 但我不想迭代每一行来读取矩阵 类似的东西 来自 matlab 用于读取 2D 1000x1000 矩阵 matrix
  • 静态时序数据的数据库解决方案

    我们拥有一个庞大且不断增长的实验数据集 该数据集取自约 30 000 名受试者 对于每个主题 都有多个数据记录 在每个记录中 收集了多个生理数据时间序列 每个时间序列约 90 秒长 并以 250Hz 采样 我应该注意到 时间序列的任何给定实
  • 如何在 MATLAB 中为 4 个子图创建一个通用图例?

    如何在 MATLAB 中为 4 个子图创建一个通用图例 如下所示 又快又脏 hSub subplot 3 1 1 plot 1 1 1 1 1 1 1 1 hLegend legend hello i am legend subplot 3
  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 在每次迭代中使用 for 循环的索引命名图像

    我正在使用 MATLAB 进行图像处理项目 我使用 for 循环在每次循环迭代时生成某种图像数据 图像大小不同 我的问题是如何阻止它在下一次迭代中覆盖图像 Img i j data 理想情况下我希望它有 Img 1 data for 1st
  • 有没有办法在 MATLAB 中查看 pcode 文件 (.p) 的源代码?

    有没有办法在 MATLAB 中打开 pcode 文件 p 如果 开放 是指edit 那么当然不是 pcode 中的 p 代表 受保护 其主要设计目标是在保护其源代码的同时部署功能组件 如果 开放 是指run 那么当然是的 引用手册 http

随机推荐

  • Yarn基础知识(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 Yarn架构 Yarn集群有一个ResourceManager 每台
  • 基于vue实现钉钉审批流程(仿)

    做项目有个需求 实现审批流程 看了钉钉审批流感觉功能很强大 模仿其实现审批效果 效果图 没有找到windows录制视频转gif的软件 所以只能放一张静图了 有好的软件欢迎各位积极分享 代码位置 整个流程上传至github https git
  • 数据库字段为什么要使用NOT NULL

    目录 1 对程序的影响 2 对查询结果的影响 2 1 聚合函数count 不准确 2 1 与 失效 2 3 NULL与其他值运算结果为NULL 2 4 对distinct group by order by等排序结果的影响 3 对索引的影响
  • html文本延迟加载,LazyLoad 延迟加载(按需加载)

    1 实际需求 大型网站往往很矛盾 想用户在首页看到更多东西 又不想浪费太多服务器流量 比如一个有3屏的首页 可能50 的用户进首页的目的是点击首页的连接 到子页面 那么我们的网站却为100 的用户加载了 3个 屏幕的所有内容 如果可以按需加
  • HIT-ICS2019大作业-程序人生-Hello’s P2P

    HIT ICS2019大作业 程序人生 Hello s P2P 摘 要 本文以一个简单的C程序hello c为楔子描绘了从预处理一直到I O管理的计算机的内部原理 将计算机对程序的处理过程生动地展现在人们眼前 关键词 hello 程序 P2
  • 1157:哥德巴赫猜想(C C++)

    题目描述 哥德巴赫猜想的命题之一是 大于6 的偶数等于两个素数之和 编程将6 100所有偶数表示成两个素数之和 输入 无 输出 分行输出 例如 6 3 3 8 3 5 每个数只拆开一次 请保证第一个加数最小 输入样例 无 输出样例 无 代码
  • Simulink 学习(一)

    一 基本操作 Simulink多用于仿真 分为模块 输入 输出 matlab中 有两种方法打开 第一种就如图所示 第二种直接在命令窗口输入 simulink 模块库 例如 常量倍数放大利用Math Oprations中的Gain模块 双击可
  • koa-view架构分析

    根据后端的模板引擎渲染到模板上 如ejs 安装 npm install koa views save registry https registry npm taobao org 安装ejs npm install ejs save reg
  • Gin框架使用Casbin进行用户权限校验

    以下是测试项目目录 一 配置model conf casbin rbac model conf 请求 request definition r sub obj act sub gt 想要访问资源的用户角色 Subject 请求实体 obj
  • TensorFlow学习笔记2-Anaconda下安装matplotlib的方法

    文章在下述博文的基础上删减 http blog csdn net abvedu article details 54731713 安装好Anaconda后 在Anaconda Prompt下执行conda命令安装matplotlib包 执行
  • JavaScript 宏任务和微任务

    JavaScript 宏观任务和微观任务 概念 宏观任务 宿主发起的任务为宏观任务 如setTimeout setInterval setImmediate I O 微观任务 JavaScript引擎发起的任务为微观任务 如Promise
  • 计算机组成原理——指令系统题库

    指令系统题库 选择题 1 以下有关指令系统的说法中错误的是什么 A 指令系统是一台机器硬件能执行的指令全体 B 任何程序运行前都要先转化为机器语言 C 指令系统是计算机软件 硬件的界面 D 指令系统和机器语言是无关的 2 在CPU执行指令的
  • tip消息定时弹窗功能 核心代码

    for var i 0 i lt 5 i var j 0 var arr 1 2 5 7 8 setTimeout function console log arr j i 3000
  • 深度学习与神经网络笔记

    在正式学习之前 首先清楚一下当前出现了很多次的概念是什么 这些概念之间的关系是什么 人工智能 AI 研究 开发用于模拟 延伸和扩展人的智能的理论 方法 技术和应用系统的一门新的技术科学 机器学习 实现人工智能的一种途径 以机器学习为手段解决
  • 《现代C++教程》笔记(2)

    2 语言可用性的强化 2 1 常量 nullptr 问题 C 不允许直接将 void 隐式转换到其他类型 但如果编译器尝试把 NULL 定义为 void 0 那么在下面这句代码中 char ch NULL 没有了 void 隐式转换的 C
  • 处理系统装机后BitLocker锁硬盘问题

    处理系统装机后BitLocker锁硬盘问题 今天重装公司里面的电脑发现装好后系统的D E盘被BitLocker锁住了 然后总结出了以下两种解决方法 可能不是非常详细但是还是希望可以对大家有所帮助 文章目录 处理系统装机后BitLocker锁
  • 总结使用Unity3D优化游戏运行性能的经验

    一 遇到麻烦时要调用 垃圾回收器 Garbage Collector 无用单元收集程序 以下简称GC 由于具有C C 游戏编程背景 我们并不习惯无用单元收集程序的特定行为 确保自动清理你不用的内存 这种做法在刚开始时很好 但很快你就公发现自
  • 2021-06-20

    TIM2 PWM部分初始化 PWM输出初始化 arr 自动重装值 psc 时钟预分频数 void TIM2 PWM Init u16 arr u16 psc GPIO InitTypeDef GPIO InitStructure TIM T
  • Symbol类型详解

    Symbol类型详解 symbol类型通过Symbol函数生成 用于表示独一无二的值 不使用new关键字 直接调用即可创建 例 const s Symbol str 即使使用相同的字符串来创建Symbol类型的值 这些值也是不同的 symb
  • 基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)

    主要内容 本文对裂缝检测技术进行了深入研究 并结合裂缝图像的特征 提出了一种基于传统机器学习和图像处理技术的裂缝检测方法 实现裂缝基本参数的计算和显示 内容如下 1 裂缝图像采集 无人机 2 裂缝图像预处理 3 裂缝分割 提取 裂缝连接 4