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

主要内容

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

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

2.裂缝图像预处理

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

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

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

6.MATLAB GUI软件界面设计

7.结束语

##点击此处下载:MATLAB GUI裂缝检测系统软件及完整程序(含裂缝图片数据)##​​​​​​

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

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第1张图片

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第2张图片

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]);%对比度增强

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第3张图片

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

 2.3图像滤波去噪

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

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

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第4张图片

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

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

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第5张图片

 3、裂缝分割、裂缝连接

3.1裂缝分割

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

  img=im2bw(img,90/255);   
基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第6张图片 阈值分割效果图

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

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
基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第7张图片 基于连通域的动态去噪效果图

 3.2裂缝连接

(1)形态学闭运算

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

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第8张图片 形态学闭运算效果图

 (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

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第9张图片

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

4、裂缝分类(SVM)

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

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

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第10张图片

 本文选取的裂缝训练特征是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)退出界面。

软件系统运行结果展示:

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第11张图片

基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)_第12张图片

 7、结束语

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

##   点击此处下载:MATLAB GUI裂缝检测系统软件及完整程序(含裂缝图片数据集) ##

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

你可能感兴趣的:(matlab,图像处理,目标检测,支持向量机)