设为首页 加入收藏

TOP

12.5.1 新建图像识别M文件
2013-10-07 15:13:17 来源: 作者: 【 】 浏览:67
Tags:12.5.1 新建 图像 识别 文件

12.5  图像识别应用综合实例

本实例中,要求使用Visual C++(www.cppentry.com)和MATLAB进行混合编程(www.cppentry.com),实现对给定的文字图像进行识别,能够识别出文字的基本轮廓。该实例使用MATLAB的M文件编辑器建立M文件,文字识别的关键过程和算法使用MATLAB编写程序,界面使用Visual C++(www.cppentry.com)设计开发。在两者的接口上,通过使用MATLAB中提供的COM组件创建工具,将图像识别的M文件创建为COM组件,然后在Visual C++(www.cppentry.com)环境中创建工程,通过COM接口访问COM组件中的接口函数,实现文字图像的识别。具体过程如下。

12.5.1  新建图像识别M文件

新建文件名为FuncTextRecog.m的M文件,在该文件中输入以下程序语句:

  1. function []= FuncTextRecog()  
  2. [FileName,PathName] = uigetfile('*.*','选择二值图像文件');  
  3. imfile = strcat(PathName,FileName);  
  4. I0=imread(imfile);  
  5. I=im2bw(I0,0.4);        %将I0图像的格式转换为二值图  
  6. [y0 x0]=size(I);            %将图像I的像素尺寸分别赋值给y0、x0  
  7. Range=sum((~I)');  
  8. Hy=0;  
  9. for j=1:y0  
  10.     if (Range(j)>=1)  
  11.         HyHy=Hy+1;  
  12.     end  
  13. end  
  14. RangeX=sum((~I));  
  15. Wx=0;  
  16. for i=1:x0  
  17.     if (RangeX(i)>=1)  
  18.         WxWx=Wx+1;  
  19.     end  
  20. end  
  21. Amp=24/Hy;              % 将文字图像归一化到24像素点的高度  
  22. I=imresize(I,Amp);  
  23. [y x]=size(I);  
  24. %I=bwmorph(~I,'skel',Inf);  
  25. %I=~I;  
  26. tic  
  27. %====== 基本结构的定义和检测 =======%  
  28. % 第一类:竖(V);左斜(L);右斜(R);突变(P)  
  29. % 第二类:左半圆弧(C);右半圆弧(Q)  
  30. % 第三类:结构待定(T);  
  31. %=====================================%  
  32. Left=zeros(1,y);        % 左端轮廓检测  
  33. for j=1:y  
  34.         i=1;  
  35.     while ((i<=x)&&(I(j,i)==1))  
  36.         ii=i+1;  
  37.     end  
  38.     if (i<=x)            
  39.         Left(j)=i;  
  40.     end      
  41. end  
  42. for j=1:y-1  
  43.     LeftD(j)=Left(j+1)-Left(j);  
  44. end  
  45. %========== 结构特征提取 =============%  
  46. j=1;  
  47. while ((Left(j)<1)&&(j<y))  
  48.        jj=j+1;         
  49. end   
  50. Y1=j;  
  51. j=y;  
  52. while ((Left(j)<1)&&(j>1))  
  53.        jj=j-1;  
  54. end   
  55. Y2=j-1;      % 去掉急剧变化的两端  
  56. %============== 右边 ==================%  
  57. Right=zeros(1,y);         % 左端轮廓检测  
  58. for j=1:y  
  59.         i=x;  
  60.     while ((i>=1)&&(I(j,i)==1))  
  61.         ii=i-1;  
  62.     end  
  63.     if (i>=1)            
  64.         Right(j)=i;  
  65.     end      
  66. end  
  67. for j=1:y-1  
  68.     RightD(j)=Right(j+1)-Right(j);  
  69. end  
  70. %=======顶端轮廓检测================%  
  71. Top=zeros(1,x);           
  72. for i=1:x  
  73.         j=1;  
  74.     while ((j<=y)&&(I(j,i)==1))  
  75.         jj=j+1;  
  76.     end  
  77.     if (j<=y)            
  78.         Top(i)=j;  
  79.     end      
  80. end  
  81. for i=1:x-1  
  82.     TopD(i)=Top(i+1)-Top(i);  
  83. end  
  84. i=1;  
  85. while ((Top(i)<1)&&(i<x))  
  86.        ii=i+1;         
  87. end   
  88. X1=i;  
  89. i=x;  
  90. while ((Top(i)<1)&&(i>1))  
  91.        ii=i-1;  
  92. end   
  93. X2=i-1;      % 去掉急剧变化的两端  
  94. %=========底部轮廓检测===============%  
  95. Bottom=zeros(1,x);         
  96. for i=1:x  
  97.         j=y;  
  98.     while ((j>=1)&&(I(j,i)==1))  
  99.         jj=j-1;  
  100.     end  
  101.     if (j>=1)  
  102.         Bottom(i)=j;  
  103.     end      
  104. end  
  105. for i=1:x-1  
  106.     BottomD(i)=Bottom(i+1)-Bottom(i);  
  107. end  
  108. %数字 1的宽度特征%  
  109. Width=zeros(1,y);  
  110. for j=1:y  
  111.     Width(j)=Right(j)-Left(j);  
  112. end      
  113. W=max(Width);  
  114. Po=0; % 用于检测笔画  
  115. Ne=0;  
  116. NS=0;%笔画数  
  117. for i=X1+4:X2-4  
  118.     for j=1:y-1  
  119.         if ((I(j+1,i)-I(j,i))>0) % 由黑到白  
  120.             PoPo=Po+1;  
  121.             if ((Po>=2)&&(j<=fix(0.7*y)))  
  122.                 Po=3;  
  123.             end      
  124.         else if  ((I(j+1,i)-I(j,i))<0) % 由白到黑   
  125.                   NeNe=Ne+1;  
  126.                   if ((Ne>=2)&&(j<=fix(0.7*y)))  
  127.                        Ne=3;  
  128.                   end         
  129.               end  
  130.           end                     
  131.       end  
  132.       NS=[NS max(Po,Ne)];  
  133.       Po=0;   
  134.       Ne=0;  
  135.   end  
  136.  Comp=max(NS);   
  137. %======轮廓结构特征的提取======%  
  138. if (min(W,Wx)>10)  
  139.     StrokeT=StrDetect01(TopD,X1,X2,3,6);        % 检测顶部基本结构  
  140.     StrokeL=StrDetect01(LeftD,Y1,Y2,3,5);       % 检测左边基本结构  
  141.     StrokeR=StrDetect01(RightD,Y1,Y2,3,5);      % 检测右边基本结构  
  142.     StrokeB=StrDetect01(BottomD,X1,X2,3,6);     % 检测底部基本结构  
  143. %========== 识别 ==========%  
  144.     Digit=Recognition(StrokeT,StrokeL,StrokeR,StrokeB,Comp)  
  145. else  
  146.     Digit='1' 
  147. end      
  148. t=toc 
  149. % 以下代码显示识别出来的文字的各个部分轮廓  
  150. px=(1:x);  
  151. py=(1:y);  
  152. figure(1);  
  153. imshow(I);          %在图像1中显示图像I  
  154. figure(2);  
  155. plot(Left);grid         %在图像2中标注左轮廓  
  156. title('左轮廓');  
  157. figure(3);  
  158. plot(Top);grid      %在图像3中标注上轮廓  
  159. title('上轮廓');  
  160. figure(4);  
  161. plot(Right);grid    %在图像4中标注右轮廓  
  162. title('右轮廓');  
  163. figure(5);  
  164. plot(Width);grid    %在图像5中标注宽度  
  165. title('宽度');  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇12.5.2 在MATLAB下创建COM组件(1.. 下一篇12.5.3 Visual C++单击工程中调用..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: