《数字图像处理》课程设计——路面裂缝检测系统

本文使用MATLAB实现了路面裂缝检测系统,部分代码如下。

预处理函数:

function Result = Process_Main(I)
if ndims(I) == 3
    I1 = rgb2gray(I);
else
    I1 = I;
end
I2 = hist_con(I1);
I3 = med_process(I2);
I4 = adjgamma(I3, 2);
[bw, th] = IterProcess(I4);
bw = ~bw;
bwn1 = bw_filter(bw, 15);
bwn2 = Identify_Object(bwn1);
[projectr, projectc] = Project(bwn2);
[r, c] = size(bwn2);
bwn3 = Judge_Crack(bwn2, I4);
bwn4 = Bridge_Crack(bwn3);
[flag, rect] = Judge_Direction(bwn4);
if flag == 1
    str = '横向裂缝';
    wdmax = max(projectc);
    wdmin = min(projectc);
else
    str = '纵向裂缝';
    wdmax = max(projectr);
    wdmin = min(projectr);
end
Result.Image = I1; 
Result.hist = I2; 
Result.Medfilt = I3; 
Result.Enance = I4;
Result.Bw = bw; 
Result.BwFilter = bwn1; 
Result.CrackRec = bwn2;
Result.Projectr = projectr;
Result.Projectc = projectc;
Result.CrackJudge = bwn3;
Result.CrackBridge = bwn4; 
Result.str = str;
Result.rect = rect;
Result.BwEnd = bwn4; 
Result.BwArea = bwarea(bwn4); 
Result.BwLength = max(rect(3:4));
Result.BwWidthMax = wdmax; 
Result.BwWidthMin = wdmin; 
Result.BwTh = th; 

桥面裂缝检测函数:

function bwn = Bridge_Crack(bw)
[row, col] = size(bw); 
[L, num] = bwlabel(bw); 
bwn = bw; 
if num < 2
    return;
end
stats = regionprops(L, 'BoundingBox');
for i = 1 : num
    l(i) = round(stats(i).BoundingBox(1) + 0.5);
    b(i) = round(stats(i).BoundingBox(2) - 0.5);
    r(i) = round(stats(i).BoundingBox(1) + stats(i).BoundingBox(3) - 1.5);
    rb(i) = round(stats(i).BoundingBox(2) + stats(i).BoundingBox(4));
end
l(l<=0) = 1;
b(b<=0) = 1;
r(r>=col) = col;
rb(rb>=row) = row;
try
    for i = 1 : num-1
        for j = b(i) : rb(i)
            if bw(j, r(i)) ~= 0
                break;
            end
        end
        for k = b(i+1) : rb(i+1)
            if bw(k, l(i+1)) ~= 0
                break;
            end
        end
        Yi = l(i+1); Ya = r(i);
        Xi=  k; Xa = j;
        d = Yi - Ya;
        e = Xa - Xi;
        if e>0
            if (d>e) || (d==e);
                for p = 1 : e
                    bw(j-p, r(i)+p) = 1;
                    bw(j-p-1, r(i)+p) = 1;
                    bw(j-p+1, r(i)+p) = 1;
                end
                for q = e+1 : d-1
                    bw(j-e, r(i)+q) = 1;
                    bw(j-e-1, r(i)+q) = 1;
                    bw(j-e+1, r(i)+q) = 1;
                end
            end
            if d<e
                for p = 1:d
                    bw(j-p, r(i)+d) = 1;
                    bw(j-p-1, r(i)+d) = 1;
                    bw(j-p+1, r(i)+d) = 1;
                end
                for q = d+1 : e-1
                    bw(j-q, r(i)+d) = 1;
                    bw(j-q, r(i)+d-1) = 1;
                    bw(j-q, r(i)+d+1) = 1;
                end
            end
            if d == 0;
                for p = 1 : e
                    bw(j-p, r(i)) = 1;
                    bw(j-p, r(i)-1) = 1;
                    bw(j-p, r(i)+1) = 1;
                end
            end
        end
        if e < 0
            e = abs(e);
            if (d>e) || (d==e)
                for p = 1:e;
                    bw(j+p, r(i)+p) = 1;
                    bw(j+p-1, r(i)+p) = 1;
                    bw(j+p+1, r(i)+p) = 1;
                end
                for q = e+1 : d-1
                    bw(j+e, r(i)+q) = 1;
                    bw(j+e-1, r(i)+q) = 1;
                    bw(j+e+1, r(i)+q) = 1;
                end
            end
            if d < e
                for p = 1 : d
                    bw(j+p, r(i)+p) = 1;
                    bw(j+p-1, r(i)+p) = 1;
                    bw(j+p+1, r(i)+p) = 1;
                end
                for q = d+1 : e-1
                    bw(j+q, r(i)+d) = 1;
                    bw(j+q, r(i)+d-1) = 1;
                    bw(j+q, r(i)+d+1) = 1;
                end
            end
            if d == 0
                for p = 1:e
                    bw(j+p, r(i)) = 1;
                    bw(j+p, r(i)-1) = 1;
                    bw(j+p, r(i)+1) = 1;
                end
            end
        end
    end
catch
    bwn = bw;
    return;
end
bwn = bw;

GUI界面设计:

function varargout = Gui_Main(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
    'gui_Singleton',  gui_Singleton, ...
    'gui_OpeningFcn', @Gui_Main_OpeningFcn, ...
    'gui_OutputFcn',  @Gui_Main_OutputFcn, ...
    'gui_LayoutFcn',  [] , ...
    'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end



function Gui_Main_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
handles.Result = [];
handles.File = [];
guidata(hObject, handles);
clc; warning off all;
InitAxes(handles);

function varargout = Gui_Main_OutputFcn(hObject, eventdata, handles)

function pushbuttonOpenFile_Callback(hObject, eventdata, handles)
[filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
    '*.*','All Files' },'载入图像',...
    fullfile(pwd, 'images'));
if isequal(filename, 0) || isequal(pathname, 0)
    return;
end
I = imread(fullfile(pathname, filename));
Result = Process_Main(I);
handles.File = fullfile(pathname, filename);
handles.Result = Result;
guidata(hObject, handles);
InitAxes(handles)
axes(handles.axes1); imshow(handles.Result.Image); title('原图像');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值