walkie

ORC小节

0
阅读(1580)

回来之后虽然一直被很多邮件打断思路,什么在spartan3E,uClinux如何移植啊,snort如何移植啊,lwip如何实现 socket api的模式啊,还有问Xilinx的老版本软件如何下载,Emac的license如何申请(关于这个问题以及其他Xilinx IP核的申请。大家可以去看我以前的一篇日记,里面讲的很详细),这个错误如何解决啊等等,问题真是无所不有。呵呵。还好有Joshua Lu和Ricky Su帮忙,差不多都解决了。我觉得我有空应该整理一下的。。

 

不过这些都不是我主要的工作,,我主要的工 作还是以下这个,数字识别的项目。

在大概一周之前从Joseph那里转接了这个项目,期间自己又去了解了一些RMB的防伪的特征,发现很多 奇特的东西。

先在MATLAB上实现了一个简单的基于模板的识别的程序(其实是从网上下载,然后做了非常简单的修改之后得到 的>_< )另外再感叹一句,MATLAB真是强大。

以下是这个代码的详细解析,大家也可以去我的OpenHW项目Digital Vision on FPGA的更新中下载pdf版本。

 

imagen=imread('scanner.bmp');
 %把图片 读进来


%*-*-*消除噪声*-*-*-*
if length(size(imagen))==3 %RGB image
    imagen=rgb2gray(imagen);
end
imagen = medfilt2(imagen);
[f c]=size(imagen);
imagen (1,1)=255;
imagen (f,1)=255;
imagen (1,c)=255;
imagen (f,c)=255;


[fl re]=lines(re);  imgn=~fl; imshow(fl); pause(1)

有数字的那一行读出来。
比如本来整张图效果如下。


经过这个lines函数之后 出来的效果如下:


L= bwlabel(imgn);
%   The elements of L are integer values greater than or equal to 0.  The
%   pixels labeled 0 are the background.  The pixels labeled 1 make up one
%   object, the pixels labeled 2 make up a second object, and so on.
或者说这只是标号,一行数字中,把第一个数字的字体部分象素用1标记,第二个数字的字体部分用象素2标记,以此类推。

 

mx=max(max(L));
通 过这个简单的算式就可以得到这一行中具体有多少个数字了。

 BW = edge(double(imgn),'sobel');
   [imx,imy]=size(BW);
再把轮廓画出来,那么接下来就是通过模板比较法比较出最后的数字了。


 for n=1:mx
        [r,c] = find(L==n);
        rc = [r c];
        [sx sy]=size(rc);
        n1=zeros(imx,imy);
        for i=1:sx
            x1=rc(i,1);
            y1=rc(i,2);
            n1(x1,y1)=255;
        end
        %*-*-*-*-*-END Calculating connected components*-*-*-*-*
        n1=~n1;
        n1=~clip(n1);
        img_r=same_dim(n1);%Transf. to size 42 X 24
        %*-*Uncomment line below to see letters one by one*-*-*-*
        %        imshow(img_r);pause(1)
        %*-*-*-*-*-*-*-*
        letter=read_letter(img_r);%img to text
        word=[word letter];
    end
这是模板比较的整个代码,

 

 

 [r,c] = find(L==n);
%FIND   Find indices of nonzero elements.
%   I = FIND(X) returns the linear indices corresponding to
%   the nonzero entries of the array X
找出第n个数字的图像所占的所有的点的坐标。

 rc = [r c];
变成坐标。

 

 

 [sx sy]=size(rc);
        n1=zeros(imx,imy);
        for i=1:sx
            x1=rc(i,1);
            y1=rc(i,2);
            n1(x1,y1)=255;
        end
先创建一个空的,这一行的所有的数据的一个数组,值均为0
然后将第一个数字 所占的所有的点都负值为255

 

 

n1=~n1;
n1=~clip(n1);
img_r=same_dim(n1);%Transf. to size 42 X 24
imshow(img_r);pause(1)
先把所有的数字图像的大小都归一到42*42的大小,这 样有利于比较。
如果我们把现在这个数字读出来,我们会发现是这样的。



接下来就是比较了。

 letter=read_letter(img_r);
通 过这个函数,我们从刚刚的图像的数字就可以变成char的数字。
这个函数其实内部只是做了一个相关性的比较。36个模板各个比较一次,然后找出相 关性最大的那个,就认为是那个字母或者数字。
read_letter()函数的具体实现如下:
%%%%%%%%%%%%%%%%%
comp=[];
load templates
for n=1:36
    sem=corr2(templates{1,n},imagn);
    comp=[comp sem];
end
vd=find(comp==max(comp));
if vd==1
    letter='A';
elseif vd==2
    letter='B';
elseif vd==3
    letter='C';
elseif vd==4
    letter='D';
…………