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