Abstract:字符串識別最重要的是字符串定位以及字符串分割。例如做車牌識別,車牌字符定位和分割是最難的部分。對於一張字符串的圖像,首先必須要定位出字符串的邊界,然後分別對字符串進行單個切割,單個分割出來的字符再做識別。 下面就介紹字符串定位和字符串分割的方法。
1. 字符串定位
下面先看一幅手寫字圖片
我們需要做的是找出整個字符的邊界然後對圖片進行切割。
對於一張
這樣就統計出每一列或者每一行的1的個數。下圖爲統計圖:
這下我們可以定義出左邊界、右邊界、上邊界、下邊界。這樣就可以切割出字符串的邊界如下圖所示:
xfenge.m
function [ix,iy]=xfenge(goal1)
[m,n]=size(goal1);
ix(m)=0;
xx=0;j=1;
for x=1:m
for y=1:n
if goal1(x,y)==1;
xx=1;
end
end
if xx==1
ix(j)=x;
j=j+1;
end
end
ix=ix(1);
iy(m)=0;
xx=0;j=1;
for x=m:-1:1
for y=n:-1:1
if goal1(x,y)==1;
xx=1;
end
end
if xx==1
iy(j)=x;
j=j+1;
end
end
iy=iy(1);
yfenge.m
function [jx,jy]=yfenge(goal1)
[m,n]=size(goal1);
jx(m)=0;
xx=0;j=1;
for y=1:n
for x=1:m
if goal1(x,y)==1;
xx=1;
end
end
if xx==1
jx(j)=y;
j=j+1;
end
end
jx=jx(1);
jy(m)=0;
xx=0;j=1;
for y=n:-1:1
for x=m:-1:1
if goal1(x,y)==1;
xx=1;
end
end
if xx==1
jy(j)=y;
j=j+1;
end
end
jy=jy(1);
2. 字符分割
對於字符分割我們只看X方向,對於X我們可以看到很多斷點,如下所示
我們可以統計出斷點的位置來對不同字符進行分割,兩個段點之間能進行確定一個字符。當然這個只是針對未粘連的字符,但是對於粘連字符斷點可以設置一個小的閾值來當做斷點。這個需要根據實際處理的字符串來判斷。下面給出結果和代碼:
I=imread('24.jpg');
figure(1)
imshow(I)
I=rgb2gray(I);
I=1-im2bw(I);
[ix1,iy1]=xfenge(I);
[jx1,jy1]=yfenge(I);
goal=I(ix1:iy1,jx1:jy1);
goal=[zeros(size(goal,1),2) goal zeros(size(goal,1),2)];
a=sum(goal);
label=find(a>0);
summ=0;
j=1;
for i=1:length(label)-1
if (label(i+1)-label(i))>1
KK(j)=label(i);
JJ(j)=label(i+1);
summ=summ+1;
j=j+1;
end
end
%figure(2)
JJ=[3 JJ];
KK=[KK size(goal,2)-2];
summ=summ+1;
figure(2)
for i=1:summ
subplot(1,summ,i);
II=goal(:,JJ(i)-2:KK(i)+2);
II=imresize(II,[25,18]);
imshow(II);
hold on
end
車牌等字符串定位分割也可以採用類似的方法。