www.pudn.com > CharCut.rar > CharCut.m


%************************************************************* 
% FileName: fun147.m 
% function: 分割图像中的有效数字,抗噪声,抗直线,斜线,粘连字符分割,旋转角度最大支持5度 
%   date: (对算法进行了修改,主要使用了波动系数处理粘连字符) 
% programor:  
% ************************************************************ 
function fun147() 
clc,clear; 
 
T1=1;                                       % 在这里设置波动系数,处理粘连字符 (暂时不考虑) 
T2=4;                                       % 在这里设置分割长度参数,具体是指字符宽度(计数单位是像素个数) 
T3=50;                                      % 方法选择参数,对于直线噪声的处理 
T4=8;                                       % 在这里设置字符的高度,小于这个值返回为空,没有字符 
T5=6;                                       % 在向量中插入0的索引,及时进行断点分离   
 
FilePath=['e:\work\picture\CutGejc1.bmp'];    
% I=imread(FilePath);                         % 整图     
% [I,X]=imread(FilePath); 
% save data0808 I X, 
% imfinfo(FilePath),pause, 
I=imread(FilePath);                         % 读入数据 
I_2bit=sub1(I);                             % 输入图像,输出二值化的图像 
I_2bit=FilterNoise(I_2bit);                % 去噪声 
% imshow(I_2bit),pause, 
 
LineSum1=sum(I_2bit,2),                     % 按行求和,得到一个列的数组 
LineSum2=sub2(LineSum1);                    % 在这里进行差分操作,可以减少由于竖线引起的误差 
LineSum3=sub3(LineSum2);                    % 确保信息的连续性 
 
LineSum3_new=Add0Index(LineSum3,T5); 
% xx=[LineSum1,LineSum2,LineSum3],pause, 
LineSum4_1=sub4(LineSum1);                    % 每个行位置对应一个长度信息,选出最大的一个 
LineSum4_2=sub4(LineSum3);                    % 每个行位置对应一个长度信息,选出最大的一个 
LineSum4_2_2=sub4(LineSum3_new);              % 插入一些 0 
% xx1=[LineSum1,LineSum2,LineSum3,LineSum3_new,LineSum4_1], 
% xx2=[LineSum1,LineSum2,LineSum3,LineSum3_new,LineSum4_2,LineSum4_2_2], 
% save ktb xx1 xx2,pause, 
MaxLen1=max(LineSum4_1),                                % 62 
MaxLen2=max(LineSum4_2_2),pause,                          % 57 
 
if MaxLen1<=T3 
    LineSum4=LineSum4_1; 
    MaxLen=MaxLen1; 
else 
    LineSum4=LineSum4_2_2; 
    MaxLen=MaxLen2; 
end 
 
if MaxLen=(T2/2));              % 这里获得了字符的左边界,要求字符的宽度至少为 2 
ChaNum=length(Index1), 
SavePath=['E:\work\picture\ImSub\ImSub']; 
for k=1:ChaNum 
    i=num2str(k); 
    Left=Index1(k)-3; 
    Right=Left+ColSum4(Index1(k))+3; 
    Temp=ImSub(:,Left:Right); 
    FileName=[SavePath i '.bmp']; 
    imwrite(Temp,FileName); 
end 
 
return 
 
% ************************************************************ 
% sub1,输入为 8 整型,输出为 doubel  
function  xx=sub1(I) 
% I=rgb2gray(I);                   % 真彩图像时要进行转换 
I=double(I); 
[m,n]=size(I); 
% T=sum(sum(I))/(m*n); 
T=150;                            %  设置二值化的阈值 
IndexMax=find(I>T); 
IndexMin=find(I=8                                     % 判断的是原来的图像.但参数为1时,相当于去角 
           If(i,j)=1; 
        end 
    end 
end 
 
xx=If; 
 
return 
%********************************************************************* 
function xx=FilterNoise(I) 
[m,n]=size(I); 
I(1,:)=0; 
I(m,:)=0; 
I(:,1)=0; 
I(:,n)=0; 
[m1,n1]=find(I); 
tt=length(m1); 
temp=[m1,n1]; 
temp(1:10,:); 
for k=2:length(m1)-2 
       i=m1(k); 
       j=n1(k); 
        x1=i-1; 
        y1=j-1; 
        x2=x1+2; 
        y2=y1+2;                       % 模板为 3 
                 
        ImSub=I(x1:x2,y1:y2); 
        Tsum=sum(sum(ImSub)); 
        if Tsum<=2                      % 存在两个点时,可进行擦除 
           I(i,j)=0; 
        end 
end 
    xx=I;   
return