图像处理之车牌处理

Posted by 周宝航 on May 2, 2018
  • 这一次是图像处理课的老师留了实验作业,对一副车牌进行处理提取有效信息。(其实明显是老师自己加的特技,然后让我们来重新提取有效信息)

  • 下面是原始图像 Alt text

  • 接下来,我们开始去除这些特技。并比对以下这些处理方法中,函数参数的影响。

处理流程

直方图均衡化

  • 原始图像中,图像很昏暗,看不清内容。
  • 首先,我们提高图像的对比度,使图像更加清晰。
%histeq args test
args = [24:10:64];
figure();
subplot(2,3,1);
imshow(im);
title('Original Image');
for i = 1:size(args,2)
   subplot(2,3,i+1);
   imshow(histeq(im, args(1,i)));
   title(sprintf('Grey series %d', args(1,i)));
End
J = histeq(im);
  • 处理对比图 Alt text

灰度变换

  • 我们使用灰度变换,进一步提高图像的亮度。
%Grey level transformation
figure();
args = [0.7:0.1:1.1];
subplot(2,3,1);
imshow(J);
title('Original Image');
for i = 1:size(args,2)
   subplot(2,3,i+1);
   imshow(imadjust(J, stretchlim(J), [0 1], args(1,i)));
   title(sprintf('gamma %.1f', args(1,i)));
End
g = imadjust(J, stretchlim(J), [0.2 1]);
  • 处理对比图 Alt text

中值滤波与均值滤波

  • 原图中存在许多椒盐噪声,需要采用滤波方法滤去噪声。
  • 采用中值滤波与均值滤波两种方法,对比后,中值滤波的效果最好。
%medfilter compare averagefilter
figure();
subplot(1,3,1);
imshow(g);
title('Original Image');
subplot(1,3,2);
imshow(filter2(fspecial('average',3),g)/255);
title('average filter');
subplot(1,3,3);
imshow(medfilt2(g,[3 3]));
title('median filter');
g = medfilt2(g,[3 3]);
  • 处理对比图 Alt text

频域低通滤波

  • 这一部分也是为了使得图像更加平滑。(感觉经过前面的处理,这一步的意义不大,就只放代码,不放结果图了)。
% frequency field process
figure();
subplot(1,2,1);
imshow(g);
title('Original Image');
subplot(1,2,2);
fg = imfreqfilt(g, imidealflpf(g, 800));
imshow(fg);
title('Filtered Image');

关键函数:
function out=imfreqfilt(I,ff) 
    f=fft2(double(I));
    s=fftshift(f); 
    out=s.*ff;
    out=ifftshift(out);  
    out=ifft2(out);
    out=abs(out);
    out=out/max(out(:));
End
function out=imidealflpf(I, freq)
    [M,N]=size(I);  
    out=ones(M,N);  
    for i=1:M  
        for j=1:N  
            if (sqrt(((i-M/2)^2+(j-N/2)^2))>freq)  
                out(i,j)=0;  
            end  
        end  
End

图像二值化

  • 对于信息提取,我们最终都要在二值图像中提取信息。
  • 使用大津法将原始图像变为二值图像。
% binarization
figure();
n = graythresh(fg);
bg = im2bw(fg,n);
imshow(bg);

Alt text

二值形态学操作

  • 由于我们不需要下方字母串信息以及背景,采用二值形态学操作:腐蚀、膨胀,尽可能的缩小这些部分。也为之后提取有效信息打下基础。
% negate image
bg = ~bg;
% imclose
t = imdilate(bg,strel('disk',7));
fc = imerode(t,strel('square',8));
imshow(fc);

Alt text

孔洞填充

  • 为了去除背景部分,对取反后的原始图片使用孔洞填充,得到了除关键信息外的车体背景部分。然后,将得到的车体背景部分与原始图像进行异或操作,再取反,就得到了如下图的结果。
% get the info
ans = ~bitxor(imfill(~fc,'holes'),fc);
figure();
imshow(ans);

Alt text

连通域标记

  • 为了提取上面得到的图片中的关键信息,我们使用连通域标记的方法获取字母、数字的位置信息。
  • 我们可以观察上一步骤最后得到的结果图,有如下几个关键点:首先,关键信息区域的字符块的横向长度小于纵向长度;其次,白色噪声部分位于图片横向中线两侧较大距离的位置。根据这两点,我们可以去除掉白色噪声部分。
% clear the small noise
rec = regionprops(bwlabel(ans,8),'basic');
figure,imshow(ans);
for i=1:size(rec, 1)
    if (abs(rec(i).BoundingBox(1,1) - size(im,1))>200)
        if (rec(i).BoundingBox(1,3)/rec(i).BoundingBox(1,4) > 1.62)
           rectangle('Position',rec(i).BoundingBox,'FaceColor',[0 0 0]);
        end
    end
end

处理结果

Alt text

Matlab代码下载