本文使用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('原图像');