MATLAB大作业 下载本文

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');