MATLAB 数字图像处理---车牌简单识别【亲测有效】

文章内容:利用 MATLAB 对图像进行简单处理,包括图像的模糊、锐化、和直方图均衡化;对图像进行边缘检测;并对利用 MATLAB 对图像中的数字提取识别

目录

  • 1 MATLAB 对图像进行简单处理
    • 1.1 模糊、锐化、和直方图均衡化
      • 1.1.1 代码
      • 1.1.2 运算结果
    • 1.2 边缘检测
      • 1.2.1 代码
      • 1.2.2 运算结果
  • 2 对图像中的数字提取识别---车牌简单识别
    • 2.1 对图像中的数字提取
      • 2.1.1 代码
      • 2.1.2 运算结果
    • 2.2 对图像中的数字识别
      • 2.2.1 代码
      • 2.2.2 识别结果
  • 3 总结

实验环境:MATLAB2020
MALTAB2020安装链接:https://mp.weixin.qq.com/s/Yo9VkjJnKB53qEgLb-Wvow

1 MATLAB 对图像进行简单处理

1.1 模糊、锐化、和直方图均衡化

1.1.1 代码

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('均衡化后直方图');

注意:代码第一行的文件目录是我使用的图片的位置,读者需要自己准备好图片并将代码中的目录改掉。

1.1.2 运算结果

  • 此为进行处理的原始图像:

  • 进行图像灰度化并把图像的大小进行调整为原来的一半,得到图像:

  • 对图像分别进行均值滤波器模糊、拉普拉斯算子锐化处理,得到的结果如下图:
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第1张图片
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第2张图片

  • 对图像进行直方图均衡化操作,得到的原始图像直方图、均衡化后的图像以及直方图如下所示:
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第3张图片
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第4张图片

1.2 边缘检测

1.2.1 代码

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('边缘增强后的图像');

1.2.2 运算结果

  • 可以得到Laplace算子处理得到的边缘:
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第5张图片
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第6张图片

  • 利用 Sobel 算子获得的图像的水平和垂直边缘。并得到两个方向的合成图像,它表示图像的综合边缘信息。



    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第7张图片
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第8张图片
    从图中可以看出,图像用 Sobel 算子进行边缘增强后整个图像很暗,为了更清晰地表现图像的轮廓信息,对合成边缘中的边缘像素进行了增强处理,获得最后一幅所示边缘增强的结果,它由 4 个灰度级来表示。

2 对图像中的数字提取识别—车牌简单识别

数字标识部位分割,通过像素位置定位出图像中的数字。

2.1 对图像中的数字提取

2.1.1 代码

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生成的图像中可以直接查看某点的像素坐标
点击“数据提示”标志,在图像中点击即可查看该点的坐标。如下图:
在这里插入图片描述

2.1.2 运算结果

  • 通过计算,得到图像的灰度图和二值化图像如下图所示:

    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第9张图片

  • 对具有数字标示的部位进行分割的结果如下图:
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第10张图片

  • 对数字部分区域进行闭运算得到的结果如下图:
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第11张图片

  • 将每个字符分割出来,用二值化表示,对每个数字图像进行膨胀操作,以将修正数字区域的边界毛刺并画出分割的结果得到5个数字的图像如下图:
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第12张图片

2.2 对图像中的数字识别

通过对每个提取的数字与模版进行相关运算,得到它们之间的相关系数,然后对数字进行判断识别。

实现不同字符的识别
提前准备好 0-9 十个数字的标准数字模板,寻找与拍摄图片中的数字字体相同的标准模板。
小技巧:可以在 Word 里寻找相似的字体,将数字打出来再放大截屏获取。

比如下面这样的模板:
在这里插入图片描述

2.2.1 代码

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;

2.2.2 识别结果

通过与模板逐个进行相关运算,比较出相关系数最大的字符,即可得到识别结果。

  • 进行相关运算的代码:
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
  • 运算结果:
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第13张图片

  • 相关系数结果比较:
    MATLAB 数字图像处理---车牌简单识别【亲测有效】_第14张图片
    可以看出,对第一个数字 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

运算结果:MATLAB 数字图像处理---车牌简单识别【亲测有效】_第15张图片
相关系数结果比较:
MATLAB 数字图像处理---车牌简单识别【亲测有效】_第16张图片
所以第二个数字为 1。

  • 同理,我们可以识别出其他几个数字分别为:3、0、1。
    所以目标图像中的五个数字为:61301。

3 总结

对于图片中的其他字符,比如英文字母、汉字、或者其他符号的识别,其实与上面的数字提取识别大同小异。原理都是类似的,通过像素位置定位提取,再与模板进行相似比较。这样可能需要的模板更多,只适用于工作量比较小的情况,所以对与一些大工程识别,还需要更深入更复杂的解决方法,读者可以关注这方面的现况与发展,继续学习。
文章内容如有错误或疑问,敬请读者斧正。

你可能感兴趣的:(MATLAB,matlab,图像处理,计算机视觉)