se=eye(2); % eye(n)可返回一个2*2单位矩阵 [m,n]=size(d);%图像为二值图像,x,y为坐标
if bwarea(d)/m/n>=0.365 %计算二值图像中对象的总面积 d=imerode(d,se); %实现图形的腐蚀 elseifbwarea(d)/m/n<=0.235
d=imdilate(d,se);%实现图像的膨胀 end
imwrite(d,'5.膨胀或腐蚀处理后.jpg');
figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')
% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割 d=qiege(d); %截掉边界黑色的部分 [m,n]=size(d); %图像已经切割的图像的坐标 figure,subplot(2,1,1),imshow(d),title(n) k1=1; k2=1; s=sum(d); j=1; while j~=n while s(j)==0 j=j+1;
end %扫过的地方全为黑色,则向右移动,直到不是停止
k1=j; %确定截图的左边界 while s(j)~=0 && j<=n-1 j=j+1;
end %继续扫描,扫过的地方不全为黑色,向右移动,直到不是停止 k2=j-1; %确定截图的右边界 if k2-k1>=round(n/6.5)
[val,num]=min(sum(d(:,[k1+5:k2-5])));
d(:,k1+num+5)=0; % k1+num+5列的位置赋值为黑色,分割 end end % 再切割 d=qiege(d); % 切割出 7 个字符
y1=10;y2=0.25;flag=0;word1=[]; while flag==0 [m,n]=size(d); left=1;wide=0;
while sum(d(:,wide+1))~=0 wide=wide+1;
end %扫过的地方不全为黑色,向右移动,直到不是停止
if wide d=qiege(d); else temp=qiege(imcrop(d,[1 1 wide m])); %返回已经切割好的区域 [m,n]=size(temp); all=sum(sum(temp)); two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:))); if two_thirds/all>y2 flag=1;word1=temp; % WORD 1 end d(:,[1:wide])=0;d=qiege(d); end end % 分割出第二个字符 [word2,d]=getword(d);%getword的函数与上面类似,字母、数字和文字在一些细节上需要去区分 % 分割出第三个字符 [word3,d]=getword(d); % 分割出第四个字符 [word4,d]=getword(d); % 分割出第五个字符 [word5,d]=getword(d); % 分割出第六个字符 [word6,d]=getword(d); % 分割出第七个字符 [word7,d]=getword(d); subplot(5,7,1),imshow(word1),title('1'); subplot(5,7,2),imshow(word2),title('2'); subplot(5,7,3),imshow(word3),title('3'); subplot(5,7,4),imshow(word4),title('4'); subplot(5,7,5),imshow(word5),title('5'); subplot(5,7,6),imshow(word6),title('6'); subplot(5,7,7),imshow(word7),title('7'); [m,n]=size(word1); % 将生成的图片归一化大小为 40*20 word1=imresize(word1,[40 20]); word2=imresize(word2,[40 20]); word3=imresize(word3,[40 20]); word4=imresize(word4,[40 20]); word5=imresize(word5,[40 20]); word6=imresize(word6,[40 20]); word7=imresize(word7,[40 20]); subplot(5,7,15),imshow(word1),title('1');