天天看點

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

直接進入正題!

本文程式的功能可實作的效果如下圖所示👇

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

這個程式可以大緻分為GUI界面的設計優化以及車牌識别功能的代碼實作,下面給大家一一介紹

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

一、GUI界面的設計優化

首先給大家介紹什麼是GUI,GUI 為圖形使用者界面(Graphical User Interface,簡稱 GUI,又稱圖形使用者接口)是指采用圖形方式顯示的計算機操作使用者界面,是MATLAB使用者可視化互動式的工具,運用GUI生成的操作界面使用者可以不用浏覽繁冗的代碼而進行操作。像效果圖所示,我們可以直接通過簡單的按鍵就可以實作程式的功能,美觀并且簡潔。下面分步介紹:

第一步:在指令行輸入“guide”指令

輸入後會出現一個這樣的界面,點選“Blank GUI”後就可以開始設計自己想要的gui界面。

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統
matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

第二步:添加按鈕及坐标軸

在這一步中可以按照個人需求在左側添加元素,該系統隻需一定數量的坐标軸和按鈕,坐标軸是為了在代碼中可以把圖檔插入進去。通過白色邊框右下角的黑點我們可以設定GUI界面的大小。

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

(添加所需元素後)

在沒有運作的時候,axes是看不見坐标軸的,運作的時候會變成下圖這個樣子👇。

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

我們可以看到每個axes都有坐标軸,為了美觀,我們可以把坐标軸給隐藏掉,右鍵axes1控件,View Callbacks——>CreateFcn,然後在該控件的CreateFcn函數下面輸入下面四行代碼:

set(gca,'XColor',get(gca,'Color'));% 這兩行代碼功能:将坐标軸和坐标刻度轉為白色set(gca,'YColor',get(gca,'Color'));set(gca,'XTickLabel',[]); % 這兩行代碼功能:去除坐标刻度set(gca,'YTickLabel',[]);
           
matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

(逐一處理後的GUI界面)

第三步:按鈕名稱設定及關閉按鈕名稱的設定在guide指令中輕按兩下按鈕,就會彈出來一個界面👇。

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

在String中直接修改想要的名稱即可。最後,關閉GUI界面則在對應按鈕的代碼行,輸入“close”即可。在第二步設計結束後,MATLAB會自動生成結構代碼,此時這需要将功能實作的代碼整合到結構中去就可以了。

我們先把GUI界面按鈕1設定為載入圖像。

function pushbutton1_Callback(hObject, eventdata, handles)%結構代碼[filename pathname]=uigetfile({'*.jpg';'*.bmp'}, 'File Selector');f=imread([pathname '\' filename]);handles.f=f;guidata(hObject, handles);axes(handles.axes1);%将圖像載入到坐标軸1imshow(f);title('原始圖像');
           
matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

二、車牌識别功能實作

再在GUI界面按鈕2設定為處理圖像,在此按鈕中實作了車牌識别功能,下面給大家介紹,該功能的實作分為4個步驟,一是定位藍色車牌區域;二是旋轉圖像;三是剪切藍色車牌圖像;四是分割字元并輸出。

第一步:定位藍色車牌區域

function pushbutton2_Callback(hObject, eventdata, handles)%結構代碼%% 定位藍色區域f=handles.f;gray=3*f(:,:,3)-f(:,:,1)-f(:,:,2);axes(handles.axes2);%将圖像載入到坐标軸2imshow(gray),title('保留藍色色域');%形态學處理level=graythresh(gray); %利用Ostu法擷取圖像的門檻值bw=im2bw(gray,level); %根據Ostu法分割車牌圖像bw1=bwareaopen(bw,500);%删除面積小于500的區域se=strel('cube',15);%建立一個邊長為15的正方形bw2=imclose(bw1,se);%閉運算連使整個車牌區域連接配接在一起
           

定位的功能隻适用于車牌是藍色的非藍色汽車。

第二步:旋轉圖像

畢竟随手一拍

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

,無法確定角度,為了最終識别的效果,添加旋轉的功能。程式應用的是Radon變換,當然也可以使用Hough變換。

%% 車牌矯正(利用radon變換)theta=0:179;r=radon(bw2,theta);[m,n]=size(r);c=0;for i=1:m    for j=1:n        if r(1,1)            r(1,1)=r(i,j);            c=j;        end    endendrot=90-c;fx=imrotate(f,rot,'crop');%旋轉axes(handles.axes3);%将圖像載入到坐标軸3imshow(fx);title('旋轉後的圖像');
           

第三步:剪切藍色車牌圖像在實作過程中我們可以使用regionprops函數(regionprops:用途是get the properties of region,即用來度量圖像區域屬性的函數。),真是非常的友好,功能超級強大,在這就不詳細介紹。

%% 剪切定位車牌區域s1=regionprops(bw2,'BoundingBox','Centroid') ; %擷取車牌矩形區域,即二值圖中值為1的矩形框xy=s1(1).BoundingBox;%擷取車牌矩形區域左上角坐标及矩形的長和寬, xy(1)為矩形框左上角的y坐标,xy(2)為矩形框左上角的x坐标fcrop=f(round(xy(2)):round(xy(2)+xy(4)),round(xy(1)):round(xy(1)+xy(3)),:) ;axes(handles.axes4);%将圖像載入到坐标軸4imshow (fcrop),title('定位剪切後的藍色車牌圖像');
           

第四步:分割字元并輸出到螢幕

想用利用regionprops函數進行字元分割,就必須保證每一個車牌字元通過形态學處理後都分别為單獨的連通區域,由于本文處理的車牌幹擾因素比較多,形态學處理也略微複雜了一些,對于其他幹擾因素較少的圖像來說,簡單處理後就可以使用此函數。在GUI界面中需要将字元逐一分割然後輸出到坐标軸,如果不需要GUI界面就可以直接通過for循環挨個輸出。

%% 分割字元fgray=rgb2gray(fcrop);level2=graythresh(fgray);bw3=im2bw(fgray,level2);% imshow(bw3);title('定位剪切後的二值圖像');se2=strel('line',2,90);se3=strel('cube',4);se4=strel('disk',1);bw3o=bwareaopen(bw3,30);%imshow(bw3o);title('删除小于20面積後的圖像');bw3oe=imerode(bw3o,se4);%imshow(bw3oe);title('二值圖像腐蝕後')bw3oc =imclose(bw3oe,se2);%imshow(bw3oc);title('二值圖像閉運算後');bw4=imclearborder(bw3oc);%imshow(bw4);bw4d=imdilate(bw4,se3);bw4d=imdilate(bw4d,se3);%imshow(bw4d);title('膨脹後的圖像');bw5=bwareaopen(bw4d,400);axes(handles.axes5);imshow(bw5);title('删除小于400後的圖像');  s2=regionprops(bw5,'BoundingBox','Centroid');xy=s2(1).BoundingBox;bw6=fcrop(floor(xy(2)):floor(xy(2)+xy(4)),floor(xy(1)):floor(xy(1)+xy(3)),:);axes(handles.axes6);%将圖像載入到坐标軸6imshow(bw6);title(num2str(1));%此處省略字元2-字元6,代碼相同xy=s2(7).BoundingBox;bw6=fcrop(floor(xy(2)):floor(xy(2)+xy(4)),floor(xy(1)):floor(xy(1)+xy(3)),:);axes(handles.axes12);%将圖像載入到坐标軸12imshow(bw6);title(num2str(7));
           

最後将按鈕3設定為退出系統。

function pushbutton3_Callback(hObject, eventdata, handles)close;
           

在前面提到隐藏坐标軸的方法,在代碼中的實作如下。

%此處為一個坐标軸去除的代碼,其餘方法相同故省略。function axes1_CreateFcn(hObject, eventdata, handles)set(gca,'XColor',get(gca,'Color'));set(gca,'YColor',get(gca,'Color'));set(gca,'XTickLabel',[]); set(gca,'YTickLabel',[]);
           

整個系統從設計到實作到這裡也就結束了,希望大家的學習生活

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

事順利!

matlab imdilate_MATLAB帶gui界面的簡易車牌識别系統

繼續閱讀