複雜背景車牌定位

2021-08-25 18:17:50 字數 2668 閱讀 1578

由於車牌號碼多為垂直數字,而車身引入的干擾在水平方向,進行垂直邊緣檢測,即可去除水平方向上顏色區別較大的干擾。該演算法核心之處在於利用了車牌號碼與車身干擾正好垂直的特點,僅在垂直方向檢測邊緣,而對水平的邊緣則不予理會。垂直邊緣檢測,可用roberts

運算元、sobel

運算元、prewitt

運算元,但這些運算元在這裡使用效果都不好。於是作者[1]

提出了採用改進後的邊緣檢測運算元,其實也很簡單,實現起來也不複雜,但效果卻比較理想的,從圖中就可以看出來。演算法流程如下,我這裡在原文的基礎上加入了中值濾波與閉運算,並採用自適應直方圖均衡處理,才能達到下面的效果。演算法流程如下

這是改進後的邊緣檢測運算元,其中d

為字元的畫素寬度,我這裡設為2。

得到二值圖後,就能看到車牌的區域輪廓了,這時通過掃瞄即可得到車牌的具體位置。剩下的就是字元識別工作了。

今天看在文章上看到這個演算法,那麼簡單卻能剔除背景定位車牌,有點不可思議,按照作者的方法寫程式試了一下,效果還是挺不錯的,不過僅對這幅圖有效,對其他的是沒有效果的。在這裡也要感謝作者能提出這種方法,這樣的思路對於強干擾背景下的特徵定位也是很有價值的。這裡給出matlab

**,具體定位與識別方法見參考[1]

,車牌也是從原文中複製過來的。

f=imread('car1.jpg');%f為原圖 i1=rgb2gray(f);%i1灰度圖 i2=histeq(i1);%i2進行直方圖均衡化後的圖 %下面進行邊緣檢測,用改進的roberts演算法 %g(i,j)=sqrt( (f(i,j)-f(i-d,j))^2 + (f(i+d,j)-f(i,j))^2 ) % d設為車牌字元畫素寬度 % ------------------------edge----------------------------- [m, n]=size(i2); i3=zeros(m,n); i2=double(i2); i3=double(i3); d=2; for i=1:m for j=1:n-d if(j<=d) %i3(i,j)=sqrt( (i2(i,j)-0)^2+(i2(i,j+d)-i2(i,j))^2 ); i3(i,j)=0; else i3(i,j)=sqrt( (i2(i,j)-i2(i,j-d))^2+(i2(i,j+d)-i2(i,j))^2 ); end end end %進行歸一化處理,防止處理後資料超過255 maxi3 = max(max(i3)); for i=1:m for j=1:n i3(i,j)=i3(i,j)*255/maxi3; end end i2=uint8(i2); i3=uint8(i3);%i3為邊緣檢測後的圖 % ------------------------edge----------------------------- i3=medfilt2(i3,[3,3]);%對i3進行中值濾波 %i4為自適應直方圖均衡化 t4=graythresh(i3); i4=im2bw(i3,t4); i4=1-i4;%i4取反色 se4=strel('rectangle',[5,5]); i5=imclose(i4,se4);%i5為閉運算後的圖 %-------------------find the boundary--------------------- by1=255-zeros(n,1);%垂直上邊界 by2=zeros(n,1);%垂直下邊界 bx1=255-zeros(m,1);%水平左邊界 bx2=zeros(m,1);%水平右邊界 for i=2:m-1 for j=2:n-1 if( (i5(i-1,j)==1)&&(i5(i,j)==1)&&(i5(i+1,j)==0) )% h up by1(j)=i; end if( (i5(i-1,j)==0)&&(i5(i,j)==0)&&(i5(i+1,j)==1) )% h down by2(j)=i; end if( (i5(i,j)==1)&&(i5(i,j+1)==0) )% v left bx1(i)=j; end if( (i5(i,j)==0)&&(i5(i,j+1)==1) )% v right bx2(i)=j; end end end min(by1);%車牌上邊界 max(by2);%車牌下邊界 min(bx1);%車牌左邊界 max(bx2);%車牌右邊界 i6 = zeros( (max(by2)-min(by1)), (max(bx2)-min(bx1)) );%存放車牌 for i=min(by1):max(by2) for j=min(bx1):max(bx2) i6(i-min(by1)+1,j-min(bx1)+1) = i2(i,j); end end i6=uint8(i6);%i6為車牌影象 figure(1); subplot(331);imshow(f);title('original'); subplot(332);imshow(i1);title('gray'); subplot(333);imshow(i2);title('histeq'); subplot(334);imshow(i3);title('edge+medfilt'); subplot(335);imshow(i4);title('2valueimg'); subplot(336);imshow(i5);title('close'); subplot(337);imshow(i1);title('position');rectangle('position',[min(bx1),min(by1),max(bx2)-min(bx1),max(by2)-min(by1)],'edgecolor',[1,0,0]); subplot(338);imshow(i6);title('car');

參考:

[1]周開軍,陳三寶,徐江陵.複雜背景下的車牌定位和字元分割研究.計算機工程,2007.33(4):198-200.

複雜背景車牌定位

由於車牌號碼多為垂直數字,而車身引入的干擾在水平方向,進行垂直邊緣檢測,即可去除水平方向上顏色區別較大的干擾。該演算法核心之處在於利用了車牌號碼與車身干擾正好垂直的特點,僅在垂直方向檢測邊緣,而對水平的邊緣則不予理會。垂直邊緣檢測,可用 roberts 運算元 sobel 運算元 prewitt 運...

車牌定位(二)

車牌提取 寫在前面的話 python中有很多腐蝕膨脹的整合庫,cv2還是最常用的。這篇文章僅是從底層原理去理解這麼做的意義,供學習理解使用。簡單介紹一下本節,主要是用python繼續對進行預處理,主要是腐蝕膨脹 還有這節就把車牌直接提取 出來啦!常用庫就 path huiimg.png im ima...

Python OpenCV 車牌定位 橫向定位

一.原理 通過對已經縱向定位的車牌進行視窗搜尋,滑動視窗,遍歷視窗內的每一行的跳變點數,若符合則加入候選區域,若最後候選區域為0,則將的高度縮減,因為在進行縱向定位時,背景的變化造成的灰度跳變數也可能大於14 若最後候選區域數大於1,將視窗寬度減少,直到候選區域只有乙個。但該方法的車牌定位時間較長。...