2008年9月14日星期日

Matlab在图像处理与目标识别方面的应用实验

Matlab在图像处理与目标识别方面的应用实验 —— 二、汽车牌照定位与字符识别
作者:林健(北京理工大学计算机科学技术学院)
指导教师:尚斐(北京理工大学医学图像实验室)
对于汽车牌照定位和数字识别,通过高通滤波,得到所有的边缘 ;对边缘细化,找出所有封闭的边缘;对封闭边缘求多边形逼近 ,在逼近后的所有四边形中,找出尺寸与牌照大小相同的 ,牌照被定位。对牌照区域中细化后的图形对象计算傅立叶描述子 ,用预先定义好的决策函数,对描述子进行计算,判断数字是几。
注意,由于BLOG功能的原因,这里无法显示图片 。您可以下载Word原文档(包含m源文件和相关图片) 。下载地址:
http://disk.linjian.cn

二、汽车牌照定位与字符识别

待处理的图像如下所示。图像整体比较清晰干净,车牌方向端正 ,字体清楚,与周围颜色的反差较大。

要定位汽车牌照并识别其中的字符,我们采用Matlab平台提供的一些图像处理函数,以傅立叶变换通过字符模 板与待处理的图像匹配为核心思想。基本方法如下:

1、读取待处理的图像,将其转化为二值图像。经试验 ,采用门限值为0.2附近时车牌字符最为清楚,杂点最少(如下左图)。

I = imread('car.jpg');
I2 = rgb2gray(I);
I4 = im2bw(I2, 0.2);

2、去除图像中面积过小的,可以肯定不是车牌的区域。

bw = bwareaopen(I4, 500);

3、为定位车牌,将白色区域膨胀,腐蚀去无关的小物件 ,包括车牌字符(如下右图)。

se = strel('disk',15);
bw = imclose(bw,se);

4、此时车牌所在白色连通域已清晰可见,但在黑色区域以外 ,是一个更大的白色连通域,将车牌所在连通域包围了 。有必要将其填充。

bw = imfill(bw,[1 1]);

5、查找连通域边界。同时保留此图形,以备后面在它上面做标记。

[B,L] = bwboundaries(bw,4);
imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2),boundary(: ,1),'w','LineWidth',2)
end

6、找出所有连通域中最可能是车牌的那一个。判断的标准是 :测得该车牌的长宽比约为4.5:1,其面积和周长存在关系:(4.5×L×L)/(2× (4.5+1)×L)21/27,以此为特征,取metric=27*area/perimeter ^2作为连通域的匹配度,它越接近1,说明对应的连通域越有可能是4.5:1的矩形。

% 找到每个连通域的质心
stats = regionprops(L,'Area','Centroid ');
% 循环历遍每个连通域的边界
for k = 1:length(B)
% 获取一条边界上的所有点
boundary = B{k};
% 计算边界周长
delta_sq = diff(boundary).^2;
perimeter = sum(sqrt(sum(delta_sq,2)));
% 获取边界所围面积
area = stats(k).Area;
% 计算匹配度
metric = 27*area/perimeter^2;
% 要显示的匹配度字串
metric_string = sprintf('%2.2f',metric);
% 标记出匹配度接近1的连通域
if metric >= 0.9 && metric <= 1.1
centroid = stats(k).Centroid;
plot(centroid(1),centroid(2), 'ko');
% 提取该连通域所对应在二值图像中的矩形区域
goalboundary = boundary;
s = min(goalboundary, [], 1);
e = max(goalboundary, [], 1);
goal = imcrop(I4,[s(2) s(1) e(2)-s(2) e(1)-s(1)]);
end
% 显示匹配度字串
text(boundary(1,2)-35,boundary (1,1)+13,...
metric_string,'Color','g',...

'FontSize',14,'FontWeight', 'bold');

end

图示为找到的各个连通区域,中部被标记“○”的矩形匹配度为0.99,是最可能的区域。下边是由它确定的二值图像中的车牌区域 :

7、将车牌图像反白处理,并扩充为256×256的方阵(如下左图),以便下面傅立叶变换中矩阵旋转 运算的进行。

goal = ~goal;
goal(256,256) = 0;
figure;
imshow(goal);

8、从文件读取一个字符模板(以“P”为例,模板图像 直接从上述二值图像中截取得到)。对图像计算傅立叶描述子,用预先定义好的决策函数对描述子进行 计算。变换后的图像中,亮度的高低指示相应区域与模板的匹配程度 (如下中图)。

w = imread('P.bmp');
w = ~w;
C=real(ifft2(fft2(goal).*fft2 (rot90(w,2),256,256)));

9、通过检查C的最大值,试验确定一个合适的门限(这里240比较合适) ,显示亮度大于该门限的点,也就是与模板的匹配程度最高的位置 (如下右图)。

thresh = 240;
figure;
imshow(C > thresh);

对照左右两图,可以说明字符“P”被识别和定位了。同样的方法,可以识别和定位其它字符。

这种方法总体上比较容易理解,Matlab的函数隐藏了傅立叶变换等复杂的计算。缺点 :在定位车牌方面,程序专门按本题给定图像的特点设计 ,没有普适性。字符识别方面,仅能识别与给定模板基本一致的字符 。车牌大小、角度、光线、完整性、清晰度发生变化后 ,就无法识别了。同时对于“8”与“B”这样相似的字符 ,识别时常常混淆。

* 参考文献:

1Applications of the Fourier Transform, Matlab 7.0 Help Documents, The MathWorks.

2Identifying Round Objects, Matlab 7.0 Demos, The MathWorks.

没有评论:

发表评论

欢迎访问、交流!对本博客有何建议,请
来信告知!
本博内容来源于网络,如有不当或侵犯权益,请来信告知,将及时撤除!
如引用博客内容、论文,请注明原作者!

Google一下本博客

  • 《Getting Things Done》读书笔记 - 本文来自 inertial 原创投稿。 我第一次听说《Getting Things Done》这本书的时候误以为它和世面上的那些成功学书籍没什么区别,后来在不少书中看到了这个名字,也看见了很多人的推荐,由此产生了很大的兴趣。上个月正好有不少空闲,就抽时间把这本书读完了。 本来打算读英文原版,但是原版的生...
    5 年前
  • [原]Linux下编译使用boost库 - Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。Boost由于其对跨平台的强调,对标准C++的强调,与...
    6 年前
  • [原]猎头、培训与咨询的价值(2)【补1】——北漂18年(93) - 【上期用手机写的,同时用语音输入转化成文字,错字较多,经好友霍师傅提醒本期重写,并增加一部分新内容】 简单谈下我对猎头、培训与咨询的看法。三样都干过,算是有些浅见。 猎头 简单的说就是人才中介。虽然在公司看来是可以直接解决现有企业问题的一个直接方法,但很多时候都不太管用。 猎头费一般是人才的一个月月...
    6 年前
  • OpenCV統計應用-Mahalanobis距離 - Mahalanobis距離是一個可以準確找出資料分布上面極端值(Outliers)的統計方法,使用線性迴歸的概念,也就是說他使用的是共變數矩陣以及該資料分布的平均數來找尋極端值的產生,而可以讓一群資料系統具有穩健性(Robust),去除不必要的雜訊訊息,這邊拿前面共變數矩陣的資料為例,並且新增了兩個點座標向量來做...
    15 年前
  • 努力推进模式识别实际产品的开发与应用 - Salu 无论是手写体识别、文档处理、人脸识别、基于内容的图片搜索、嵌入人工智能的搜索技术、虚拟网络社区、还是其它相关新科技下的信息整合领域,现在都在努力实用化。 前两年、即使现在还有很多人在抱怨说人脸的方法都不能用,但是就今年出现的和正在做的有关人脸识别实际应用的各种形式的产品可以说如雨后春笋。这是一个趋...
    16 年前