基於邊緣檢測的車牌定位
阿新 • • 發佈:2019-02-16
剛開始接觸影象處理做的試驗專案,想法比較簡單,限制多弊端較大,對圖片質量要求比較高,如果灰度變化太大又或者預處理後得到的二值影象的連通區域出現與車牌所處區域面積相近,效果就差了很多。影象的預處理是通過增加對比度以及形態學處理得到的。想要得到理想效果需要多次重複操作。
有很多不足之處,還請各位大神指教。
直接上效果圖
下面是matlab實現程式:
close all;clc; I=imread('F:\matlab\MATLAB上機操作\圖形\2.jpg'); %影象預處理 re=license_plate_regulation(I); i2=edge(re,'roberts');%邊緣檢測 imshow(i2); se=[1;1;1];%腐蝕運算元 i3=imerode(i2,se);%此腐蝕可將非車牌區域的噪聲資訊腐蝕掉 figure,imshow(i3); se1=strel('rectangle',[25,25]);%建立25*25的矩形結構元素 i4=imclose(i3,se1);%閉環運算 需要選擇大的運算元 figure,imshow(i4); figure imshow(i4,[]) xlabel('(a)original image') se=strel('disk',7);%產生結構元素,7為多次實驗後的得到的結果 A2=imopen(i4,se);%開運算先腐蝕後膨脹,去掉面積相對車牌小的區域。 figure imshow(A2,[]) xlabel(['(b)Erosion with a disk of radius ',num2str(7)]) %車牌定位 [m,n]=size(A2); z=zeros(40,50); for i=2:m-1%得到車牌的左右邊界 for j=2:n-1 if (A2(i,j+1)<A2(i,j))||(A2(i,j)>A2(i,j-1)) z(j)=j; end end end b1=find(z); jmax=max(b1)+5; jmin=min(b1)-5; z1=zeros(40,50);%得到車牌的上下邊界 for i=2:m-1 for j=2:n-1 if (A2(i+1,j)<A2(i,j))||(A2(i,j)>A2(i-1,j)) z1(i)=i; end end end c1=find(z1); imax=max(c1)+5; imin=min(c1)-5; dw=re(imin:imax,jmin:jmax);%求得車牌區域 figure,imshow(dw)
車牌傾斜矯正函式(摘自《影象處理例項講解》)
function re=license_plate_regulation(I) %讀取原始的車牌影象; I1=rgb2gray(I); I2=wiener2(I1,[5 5]);%對影象進行維納濾波 I3=edge(I2,'sobel','horizontal');%利用sobel運算元,檢測影象邊緣直線 [m,n]=size(I3);%計算影象大小 rou=round(sqrt(m^2+n^2));%獲取rou最大值 theta=180;%獲取theta的最大值 r=zeros(rou,theta);%產生量化初值為0的計數矩陣 for i=1:m for j=1:n if I3(i,j)==1 for k=1:theta ru=round(abs(i*cos(k*3.14/180)+j*sin(k*3.14/180))); r(ru+1,k)=r(ru+1,k)+1; end end end end r_max=r(1,1); for i=1:rou for j=1:theta if r(i,j)>r_max r_max=r(i,j); c=j; end end end if c<=90 rot_theta=-c;%確定旋轉角度 else rot_theta=180-c; end I4=imrotate(I2,rot_theta,'crop');%對圖片進行旋轉,矯正影象 set(0,'defaultFigurePosition',[100,100,1200,450]);%修改圖形影象的預設設定 set(0,'defaultFigureColor',[1 1 1])%修改圖形背景顏色的設定 re=I4;