文章内容:
利用 MATLAB 对图像进行简单处理,包括图像的模糊、锐化、和直方图均衡化;对图像进行边缘检测;并对利用 MATLAB 对图像中的数字提取识别。
实验环境:MATLAB2020
MALTAB2020安装链接:https://mp.weixin.qq.com/s/Yo9VkjJnKB53qEgLb-Wvow
I=imread('E:\Desktop\课程\轨道信号与设备\DZYYT1011.JPG');
figure,imshow(I),title('原始图像');
I1=rgb2gray(I);
I1=imresize(I1,0.5);
figure,imshow(I1),title('灰度图像');
h=ones(5,5)/25;
I2=imfilter(I1,h);
figure,imshow(I2),title('模糊处理');
J=double(I1);
h1=fspecial('laplacian');
I3=filter2(h1,J);
figure,imshow(I3),title('锐化处理');
I4 = histeq(I1,256);
figure,imhist(I1),title('原图像直方图');
figure,imshow(I4),title('均衡化处理');
figure,imhist(I4),title('均衡化后直方图');
注意
:代码第一行的文件目录是我使用的图片的位置,读者需要自己准备好图片并将代码中的目录改掉。
此为进行处理的原始图像:
进行图像灰度化并把图像的大小进行调整为原来的一半,得到图像:
I=imread('E:\Desktop\课程\轨道信号与设备\DZYYT1011.JPG');
I1=rgb2gray(I);
I1=imresize(I1,0.5);
J=double(I1);
H=[0 1 0;1 -4 1;0 1 0];
J=conv2(J,H,'same');
J=double(I1)-J;
subplot(1,2,1);
imshow(I1),title('灰度图像');
subplot(1,2,2);
imshow(J),title('Laplace算子边缘检测');
G1 = [-1 -2 -1;0 0 0;1 2 1];
G2 = G1';
Iedge=I1;
I2x = filter2(G1,Iedge);
I2y = filter2(G2,Iedge);
I2=abs(I2x+I2y);
I22 = mat2gray(I2);
figure,imshow(mat2gray(abs(I2x))),title('水平方向边缘')
figure,imshow(mat2gray(abs(I2y))),title('垂直方向边缘')
figure,imshow(I22),title('合成边缘')
IFB=im2bw(I22,0.08);
figure,imshow(IFB),title('合成边缘二值图像')
[m n]=size(I22);
I2_edge=I22;
for i=1:m
for j=1:n
if I2_edge(i,j)>0.15
I2_edge(i,j)=1;
else if I2_edge(i,j)>0.06
I2_edge(i,j)=0.5;
end
end
end
end
figure,imshow(I2_edge),title('边缘增强后的图像');
利用 Sobel 算子获得的图像的水平和垂直边缘。并得到两个方向的合成图像,它表示图像的综合边缘信息。
从图中可以看出,图像用 Sobel 算子进行边缘增强后整个图像很暗,为了更清晰地表现图像的轮廓信息,对合成边缘中的边缘像素进行了增强处理,获得最后一幅所示边缘增强的结果,它由 4 个灰度级来表示。
数字标识部位分割,通过像素位置定位出图像中的数字。
I=imread('E:\Desktop\课程\轨道信号与设备\DZYYT1011.JPG');
I1=rgb2gray(I);
I1=imresize(I1,1);
figure,imshow(I1),title('灰度图像');
I2=im2bw(I1,graythresh(I1));
figure,imshow(I2),title('二值图像');
I3=I2(2294:2330,1859:1964);
I3=imresize(I3,10);
figure,imshow(I3),title('数字部分特征提取');
A=I3;ED_type='disk';
se=strel(ED_type,12);
I4=imclose(A,se);
figure,imshow(I4),title('闭运算的结果');
figure;
J1=I4(4:320,29:214);
J1=imresize(J1,[312,179]);
A=J1;ED_type='disk';
se=strel(ED_type,8);
A=imdilate(A,se);
subplot(1,5,1),imshow(A),title('第1个数字');
J2=I4(19:330,260:410);
J2=imresize(J2,[312,179]);
A=J2;ED_type='disk';
se=strel(ED_type,8);
A=imdilate(A,se);
subplot(1,5,2),imshow(A),title('第2个数字');
J3=I4(22:335,450:635);
J3=imresize(J3,[312,179]);
A=J3;ED_type='disk';
se=strel(ED_type,8);
A=imdilate(A,se);
subplot(1,5,3),imshow(A),title('第3个数字');
J4=I4(38:347,683:860);
J4=imresize(J4,[312,179]);
A=J4;ED_type='disk';
se=strel(ED_type,8);
A=imdilate(A,se);
subplot(1,5,4),imshow(A),title('第4个数字');
J5=I4(55:363,910:1050);
J5=imresize(J5,[312,179]);
A=J5;ED_type='disk';
se=strel(ED_type,8);
A=imdilate(A,se);
subplot(1,5,5),imshow(A),title('第5个数字');
注意
:代码中的数字部分特征提取及分别对每个数字的提取时,选取的像素范围需要根据自己的图片中数字的像素位置进行修改。
比如代码中第7行的"I3=I2(2294:2330,1859:1964);
"。
指数字部分 I3 在 I2 内的位置范围,其中的四个数据是由两组像素坐标组成,读者可以自己分析四个数据分别对应哪种坐标。
小技巧
:在MATLAB生成的图像中可以直接查看某点的像素坐标
点击“数据提示”标志,在图像中点击即可查看该点的坐标。如下图:
通过对每个提取的数字与模版进行相关运算,得到它们之间的相关系数,然后对数字进行判断识别。
实现不同字符的识别
提前准备好 0-9 十个数字的标准数字模板,寻找与拍摄图片中的数字字体相同的标准模板。
小技巧:可以在 Word 里寻找相似的字体,将数字打出来再放大截屏获取。
B=imread('E:\Desktop\课程\轨道信号与设备\0.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K0=B;
B=imread('E:\Desktop\课程\轨道信号与设备\1.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K1=B;
B=imread(' E:\Desktop\课程\轨道信号与设备\2.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K2=B;
B=imread(' E:\Desktop\课程\轨道信号与设备\3.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K3=B;
B=imread(' E:\Desktop\课程\轨道信号与设备\4.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K4=B;
B=imread(' E:\Desktop\课程\轨道信号与设备\5.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K5=B;
B=imread(' E:\Desktop\课程\轨道信号与设备\6.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K6=B;
B=imread(' E:\Desktop\课程\轨道信号与设备\7.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K7=B;
B=imread(' E:\Desktop\课程\轨道信号与设备\8.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K8=B;
B=imread(' E:\Desktop\课程\轨道信号与设备\9.jpg');
B=rgb2gray(B);
B=imresize(im2bw(B,graythresh(B)),[312,179]);
K9=B;
通过与模板逐个进行相关运算,比较出相关系数最大的字符,即可得到识别结果。
k=zeros(1,10);
k(1)=corr2(J1,K0);
k(2)=corr2(J1,K1);
k(3)=corr2(J1,K2);
k(4)=corr2(J1,K3);
k(5)=corr2(J1,K4);
k(6)=corr2(J1,K5);
k(7)=corr2(J1,K6);
k(8)=corr2(J1,K7);
k(9)=corr2(J1,K8);
k(10)=corr2(J1,K9);
m=max(k);
n=find(k==m)-1
相关系数结果比较:
可以看出,对第一个数字 J1 与十个模版进行逐一进行相关运算,得到他们之间的相关系数数组 K,求出其中相关系数最大的数对应的 K 序号,就可以识别出图片中此数字是几。比如上述程序识别出第一个数字是 6。
用同样的方法可以得到:
k=zeros(1,10);
k(1)=corr2(J2,K0);
k(2)=corr2(J2,K1);
k(3)=corr2(J2,K2);
k(4)=corr2(J2,K3);
k(5)=corr2(J2,K4);
k(6)=corr2(J2,K5);
k(7)=corr2(J2,K6);
k(8)=corr2(J2,K7);
k(9)=corr2(J2,K8);
k(10)=corr2(J2,K9);
m=max(k);
n=find(k==m)-1
对于图片中的其他字符,比如英文字母、汉字、或者其他符号的识别,其实与上面的数字提取识别大同小异。原理都是类似的,通过像素位置定位提取,再与模板进行相似比较。这样可能需要的模板更多,只适用于工作量比较小的情况,所以对与一些大工程识别,还需要更深入更复杂的解决方法,读者可以关注这方面的现况与发展,继续学习。
文章内容如有错误或疑问,敬请读者斧正。