【缺陷識(shí)別】基于支持向量機(jī)算法實(shí)現(xiàn)金屬表面缺陷檢測(cè)
一、簡(jiǎn)介
1.1題目內(nèi)容
金屬板廣泛應(yīng)用在工業(yè)生產(chǎn)與生產(chǎn)生活的各方面。由于金屬板制造過程涉及到的設(shè)備、工藝等多因素的影響,金屬板表面容易出現(xiàn)種類較多、形態(tài)各異的缺陷,這些缺陷對(duì)金屬板的耐磨性、抗腐蝕性、電磁特性及美觀性都會(huì)造成不同程度的影響,最終影響金屬板的電磁特性和涂鍍效果。因此對(duì)于生產(chǎn)金屬板的企業(yè)來說,表面缺陷檢測(cè)是必不可少的一個(gè)工序,一方面可以通過表面缺陷檢測(cè)及時(shí)檢測(cè)到缺陷產(chǎn)品,保證所產(chǎn)金屬板的質(zhì)量,維護(hù)企業(yè)的信譽(yù),另一方面也可以通過分析檢測(cè)結(jié)果及時(shí)發(fā)現(xiàn)生產(chǎn)過程中存在的問題,并及時(shí)解決[1]。我們將依據(jù)網(wǎng)上提供的金屬表面缺陷照片數(shù)據(jù)集為圖片來源,構(gòu)造相應(yīng)的算法對(duì)金屬表面的缺陷進(jìn)行檢測(cè),識(shí)別,分類與大小測(cè)量。
1.2題目要求
金屬表面缺陷識(shí)別與分類有以下具體要求:
(1)依據(jù)金屬表面缺陷圖片的特性,對(duì)圖片進(jìn)行適當(dāng)?shù)幕叶茸儞Q(對(duì)比度增強(qiáng)與濾波處理);
(2)對(duì)金屬表面缺陷圖片進(jìn)行全局優(yōu)化閾值分割;
(3)提取二值圖片區(qū)域邊界坐標(biāo);
(4)對(duì)金屬缺陷進(jìn)行特征提取;
(5)對(duì)金屬缺陷進(jìn)行分類有監(jiān)督訓(xùn)練;
(6)完成對(duì)金屬缺陷類型的判斷與位置大小的計(jì)算;
(7)完成金屬缺陷檢測(cè)的GUI設(shè)計(jì)。
2.題目分析
我們查閱相關(guān)資料了解到常見的金屬表面缺陷主要有如下幾種,其分別是:細(xì)裂紋(crazing),表面雜質(zhì)(inclusion),斑點(diǎn)(patches),麻點(diǎn)(pitted surface),軋入氧化皮(rolled-in scale)與劃痕(scratches)。其分別對(duì)應(yīng)圖(a)-圖(f)。

我們只考慮其中的三種類型:表面斑點(diǎn)(圖b),表面軋入氧化皮(圖(e))與表面劃痕(圖(f))。
圖像處理的主要步驟有:對(duì)比度增強(qiáng),濾波處理,閾值分割,形態(tài)學(xué)處理,特征提取,分類訓(xùn)練,缺陷位置大小計(jì)算及GUI集成操作顯示。
Step.1:對(duì)比度增強(qiáng)
由于照明方式等緣故,我們發(fā)現(xiàn)原始圖像中的金屬表面缺陷和整個(gè)金屬表面背景之間的灰度差較小,灰度范圍較小,因而其對(duì)比度較低,金屬缺陷并不明顯,這不利于圖像的后期處理,我們需要使用一些方法來增加圖像的對(duì)比度。常見的對(duì)比度增強(qiáng)方法有對(duì)數(shù)變換,冪律變換,灰度級(jí)分層,灰度歸一化,對(duì)比度拉伸,直方圖均衡化,直方圖規(guī)定化等??紤]到不同照片的背景光強(qiáng)并不相同,所以恒定參數(shù)的方法(如對(duì)數(shù)變換,冪律變換,灰度級(jí)分層,對(duì)比度拉伸)并不對(duì)所有圖片適用,故我們考慮使用灰度歸一化和直方圖均衡化。
Step.2:濾波處理
拍攝照片時(shí),在采集過程將會(huì)不可避免的引入各種噪聲,包括高斯噪聲和椒鹽噪聲等。同時(shí),金屬表面本身就具有一定的紋理。噪聲和紋理將一定程度上將金屬表面缺陷掩蓋,從而導(dǎo)致會(huì)提取中產(chǎn)生錯(cuò)誤,我們需要先對(duì)圖像進(jìn)行濾波處理以減少后續(xù)誤檢測(cè)。濾波方法主要分為空域?yàn)V波與頻域?yàn)V波,且二者的關(guān)系滿足卷積定理。其中空域?yàn)V波主要有均值濾波,中值濾波,高斯濾波與雙邊濾波;頻率濾波注意有傅里葉變換濾波,離散余弦變換濾波與小波變換濾波。這些算法雖然可以減少噪聲,但是也會(huì)濾除部分細(xì)節(jié)信息,導(dǎo)致某些缺陷細(xì)節(jié)的丟失。所有我們需要尋找新的濾波算法來實(shí)現(xiàn)。
Step.3:閾值分割
我們得到濾波圖像后,還需要進(jìn)行二值化閾值處理,從而恰當(dāng)提取出缺陷信息。傳統(tǒng)的閾值分割需要確定閾值,但對(duì)于不同復(fù)雜的金屬缺陷圖片,我們無法對(duì)所有的圖片使用相同的閾值,我們擬使用全局/局部優(yōu)化閾值分割,自動(dòng)確定最佳的閾值。
Step.4:形態(tài)學(xué)處理
受限于原圖質(zhì)量與圖像閾值分割算法,二值圖像中某些應(yīng)該連通的區(qū)域可能被閾值分割了,例如劃痕缺陷由于在某處灰度值較低而被錯(cuò)誤分割,導(dǎo)致一條劃痕可能會(huì)被分離為多個(gè)線段。故我們需要進(jìn)行閉運(yùn)算來連接臨近物體。同時(shí),圖片中某些缺陷較大(例如劃痕寬度較大),在后續(xù)邊緣檢測(cè)后,一條直線的兩個(gè)邊緣相距較大,直線提取算法會(huì)誤將同一根線作為兩根相互平行劃痕。故我們還需要對(duì)缺陷進(jìn)行細(xì)化操作。
Step.5: 特征提取
該部分可以使用兩種方法,一種是基于通用的特征提取算法(例如HOG, LBP, Haar算法等);另一種是基于我們所要檢測(cè)的特定金屬缺陷進(jìn)行特定的特征來直接對(duì)劃痕進(jìn)行分類。我將分別對(duì)這兩種方法進(jìn)行測(cè)試。
Step.6: 分類訓(xùn)練
如果我們使用了通用的特征提取算法,我們將要對(duì)其進(jìn)行分類監(jiān)督訓(xùn)練,常用的監(jiān)督學(xué)習(xí)算法包括:K臨近算法(KNN),樸素貝葉斯算法,決策樹算法,支持向量機(jī)(svm),邏輯回歸等。由于支持向量機(jī)具有優(yōu)秀的泛化能力,且在小樣本訓(xùn)練集能夠得到比其他算法好的多的效果[6],我們擬選擇支持向量機(jī)算法。
Step.7: 缺陷位置大小計(jì)算
我們提取到缺陷后,需要不同特征來表征缺陷的大小與位置。對(duì)與’軋入氧化皮’,我們使用’軋入氧化皮’個(gè)數(shù)來表征缺陷大小,用其質(zhì)心表征其位置;對(duì)于斑點(diǎn),我們使用斑點(diǎn)中的面積占整個(gè)圖片的比例來表征缺陷大小。對(duì)于劃痕,我們使用劃痕的兩個(gè)端點(diǎn)來表征缺陷位置,用劃痕長度標(biāo)準(zhǔn)缺陷大小。
Step.8: GUI設(shè)計(jì)
為了方便用戶使用,我們?cè)O(shè)計(jì)了GUI界面,能夠選擇電腦中的圖片,且能在點(diǎn)擊’圖像處理’后顯示提取到的缺陷信息(類型與位置大小),對(duì)于劃痕長度,我們能夠讓用戶輸入相機(jī)的焦距與物距長度,從而根據(jù)幾何光學(xué)知識(shí)計(jì)算出實(shí)際劃痕大小,并將每個(gè)劃痕的像面大小與實(shí)際大小顯示出來。同時(shí)GUI能夠讓用戶通過按鍵前往數(shù)據(jù)集的下載網(wǎng)站。
二、源代碼
//作品概述:
本代碼主要功能是實(shí)現(xiàn)金屬表面三種缺陷的檢測(cè)、分類及測(cè)量,并使用GUI進(jìn)行封裝以便于用戶使用。
該GUI可以導(dǎo)入電腦中的灰度圖片,之后進(jìn)行處理,能確定缺陷的種類,將檢測(cè)到的缺陷標(biāo)注在原圖上,
并能夠測(cè)量不同缺陷的大小(不同缺陷衡量標(biāo)準(zhǔn)不同)。
------------------------------------------------------------------------------------------
//重要函數(shù)簡(jiǎn)介:
#pushbutton1_Callback(hObject, eventdata,handles):
按鍵1(即'圖像處理'按鍵)的回調(diào)函數(shù),包含全部圖像處理算法
#pushbutton2_Callback(hObject, eventdata,handles):
按鍵2(即'圖片導(dǎo)入'按鍵)的回調(diào)函數(shù),主要是圖片的導(dǎo)入
#Ga(theta,num):圖像的Garbor卷積核的初始化
#filterimage(a6,Gaborfiter):Garbor濾波算法
#thres(image):灰度圖的最大熵閾值分割算法
#location():'軋入氧化皮'缺陷的定位及顯示
#houghtran():對(duì)于'劃痕'缺陷的霍夫圓檢測(cè)
#lbp(varargin):網(wǎng)上的'局部二值模式'特征提取算法
#svm.m:獨(dú)立m文件,用于所有金屬缺陷照片的LBP特征提取和SVM(支持向量機(jī))監(jiān)督學(xué)習(xí)算法的訓(xùn)練與測(cè)試
--------------------------------------------------------------------------------------------
%}
%%
function varargout = app(varargin)
%GUI頁面主函數(shù),MATLAB提供,無需修改
gui_Singleton = 1;
gui_State = struct('gui_Name', ? ? ? mfilename, ...
? ? ? ? ? ? ? ? ? 'gui_Singleton', ?gui_Singleton, ...
? ? ? ? ? ? ? ? ? 'gui_OpeningFcn', @app_OpeningFcn, ...
? ? ? ? ? ? ? ? ? 'gui_OutputFcn', ?@app_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 app_OpeningFcn(hObject, eventdata, handles, varargin)
% GUI初始化函數(shù)
%修改設(shè)置背景
%modified by:Faust.Cao
ha=axes('units','normalized','pos',[0 0 1 1]);
uistack(ha,'down');
%設(shè)置程序的背景圖為back.jpg
ii=imread('C:\Users\lenovo\Desktop\金屬表面缺陷分類與測(cè)量GUI系統(tǒng)\金屬表面缺陷分類與測(cè)量系統(tǒng)\back.jpg');
image(ii);
colormap gray
set(ha,'handlevisibility','off','visible','off');
handles.output = hObject;
guidata(hObject, handles);
%%
function varargout = app_OutputFcn(hObject, eventdata, handles)
% GUI輸出函數(shù),MATLAB提供,無需修改
varargout{1} = handles.output;
%%
function pushbutton1_Callback(hObject, eventdata, handles)
% 按鍵1(即'圖像處理'按鍵)的回調(diào)函數(shù),包含全部圖像處理算法
global a5;%全局變量
global svmModel;%全局變量,從svm.m文件調(diào)用
axis off;%去除axes坐標(biāo),完整顯示圖片
a6=a5;
a=str2double(get(handles.edit1,'string'));%讀取用戶輸入的焦距
b=str2double(get(handles.edit2,'string'));%讀取用戶輸入的物距
d=a/(b-a);%由高斯公式計(jì)算垂軸放大率
ma=max(max(a6));
mi=min(min(a6));
%對(duì)比度增強(qiáng),將灰度映射為[0,255]
for ii=1:200
? ?for jj=1:200
? ? ? ?a6(ii,jj)=255*double(a6(ii,jj)-mi)./double(ma-mi);
? ?end
end
%圖像濾波
ab=filterimage(a6);
%圖像最大熵閾值分割
ss=thres(ab);
ab1=im2bw(ab,ss/255);
[B,L]=bwboundaries(ab1);%二值圖邊緣坐標(biāo)提取
[x,y]=size(B);
mm=0;
%尋找最大提取區(qū)域
for i=1:x
? ?ll=length(B{i});
? ?if ll>mm
? ? ?mm=ll;
? ?end
end
%判斷是否是'軋入氧化皮'缺陷
if mm<120
set(handles.text8,'string','缺陷是軋入氧化皮');%在text8文本框處輸出缺陷類型
[xc,yc]=findcenter(B,ab);%求各提取區(qū)域的質(zhì)心位置
axes(handles.axes2);%設(shè)置在axes2處顯示
imshow(a6);
hold on;
plot(yc+12,xc+12,'*');%加上濾波時(shí)失去的邊界
[dd,bb]=size(xc);
tex=['一共有',num2str(dd),'個(gè)以上的點(diǎn)'];
set(handles.text10,'string',tex);%在text10文本框處輸出缺陷信息
%不是'軋入氧化皮'缺陷,繼續(xù)判斷
else
?%原圖與二值圖進(jìn)行掩模處理,注意二者大小不同,故要先剔除原圖邊緣
?a6(1:12,:)=[];
?a6(177:188,:)=[];
?a6(:,1:12)=[];
?a6(:,177:188)=[];
?mu1=uint8(ab1).*a6;
?mu2=uint8(1-ab1).*a6;
?t0=mu1(mu1~=0);
?m1=mean(t0);
?t1=mu2(mu2~=0);
?m2=mean(t1);
?%判斷缺陷是斑點(diǎn)還是劃痕:斑點(diǎn)比背景暗,劃痕比背景涼;將掩模與背景剩余均值比較
?%也可以先提取圖像的LBP(局部二值模式)特征,再使用SVM訓(xùn)練的結(jié)果來進(jìn)行分類
?if m1<m2+20
? ?set(handles.text8,'string','缺陷是斑點(diǎn)');
? ?
? ?all=bwarea(ab1);%計(jì)算斑點(diǎn)面積
? ?pro=100*all/176/176;%計(jì)算所占百分比
? ?tex=['斑點(diǎn)所占面積比為',num2str(pro),'%'];
? ?set(handles.text10,'string',tex);
? ?axes(handles.axes2);
? ?imshow(a6);
? ?hold on;
? ?%標(biāo)注出斑點(diǎn)邊界
? ?for k = 1:length(B)
? ? ?boundary = B{k};
? ? ?plot(boundary(:,2), boundary(:,1), 'r', 'LineWidth', 2)
? ?end
? ?
?%缺陷是劃痕
?else ?
? ?a6=adapthisteq(a6);%自適應(yīng)直方圖均衡化再次加強(qiáng)對(duì)比度
? ?ss=thres(a6);
? ?ab1=im2bw(a6,ss/255);
? ?
? ?ab1=imclose(ab1,strel('square',6));%對(duì)二值圖做閉運(yùn)算,將斷開部分連接
? ?ab1=bwmorph(ab1,'thin',5);%對(duì)二值圖再進(jìn)行細(xì)化
? ?ab1=edge(ab1,'Canny');%使用Canny算子邊緣提取
? ?set(handles.text8,'string','缺陷是劃痕');
? ?axes(handles.axes2);
? ?imshow(a6);
? ?hold on;
? ?
? ?%往下是劃痕提取的后續(xù)處理與顯示
? ?[point,ang]=houghtran( ab1 );%對(duì)處理好的二值圖進(jìn)行霍夫直線檢測(cè)
? ?cen=zeros(length(ang),2);
? ?po=zeros(length(ang),4);
? ?an=zeros(length(ang),1);
? ?thm=mean(abs(ang));
? %判斷劃痕是橫線還是豎線(直線與y軸夾角)
? ?if abs(thm)<45%豎線
? ? ? ?thm=40;
? ?else%橫線
? ? ? ?thm=60;
? ?end
? ?
? ?le=length(cen);
? ?%求取每根直線的中點(diǎn)位置
? ?for kk=1:le
? ? ? ?cen(kk,1)=(point(kk,1)+point(kk,3))/2;
? ? ? ?cen(kk,2)=(point(kk,2)+point(kk,4))/2;
? ? ? ?point(kk,5)=cen(kk,1);
? ? ? ?point(kk,6)=cen(kk,2);
? ?end
? ?%按中點(diǎn)對(duì)直線進(jìn)行排序
? ?if thm==40%如果是豎線,按橫坐標(biāo)排序
? ? ? ?point=sortrows(point,5);
? ?end
三、運(yùn)行結(jié)果
