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

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