-
这一次是图像处理课的老师留了实验作业,对一副车牌进行处理提取有效信息。(其实明显是老师自己加的特技,然后让我们来重新提取有效信息)
-
下面是原始图像
-
接下来,我们开始去除这些特技。并比对以下这些处理方法中,函数参数的影响。
处理流程
直方图均衡化
- 原始图像中,图像很昏暗,看不清内容。
- 首先,我们提高图像的对比度,使图像更加清晰。
%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);
- 处理对比图
灰度变换
- 我们使用灰度变换,进一步提高图像的亮度。
%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]);
- 处理对比图
中值滤波与均值滤波
- 原图中存在许多椒盐噪声,需要采用滤波方法滤去噪声。
- 采用中值滤波与均值滤波两种方法,对比后,中值滤波的效果最好。
%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]);
- 处理对比图
频域低通滤波
- 这一部分也是为了使得图像更加平滑。(感觉经过前面的处理,这一步的意义不大,就只放代码,不放结果图了)。
% 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);
二值形态学操作
- 由于我们不需要下方字母串信息以及背景,采用二值形态学操作:腐蚀、膨胀,尽可能的缩小这些部分。也为之后提取有效信息打下基础。
% negate image
bg = ~bg;
% imclose
t = imdilate(bg,strel('disk',7));
fc = imerode(t,strel('square',8));
imshow(fc);
孔洞填充
- 为了去除背景部分,对取反后的原始图片使用孔洞填充,得到了除关键信息外的车体背景部分。然后,将得到的车体背景部分与原始图像进行异或操作,再取反,就得到了如下图的结果。
% get the info
ans = ~bitxor(imfill(~fc,'holes'),fc);
figure();
imshow(ans);
连通域标记
- 为了提取上面得到的图片中的关键信息,我们使用连通域标记的方法获取字母、数字的位置信息。
- 我们可以观察上一步骤最后得到的结果图,有如下几个关键点:首先,关键信息区域的字符块的横向长度小于纵向长度;其次,白色噪声部分位于图片横向中线两侧较大距离的位置。根据这两点,我们可以去除掉白色噪声部分。
% 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