logo资料库

数字图像处理大实验(汽车车牌定位与字符识别).doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
实 验 报 告 课程名称 数字图像处理 题 目 汽车车牌定位与字符识别
汽车车牌定位与字符识别 一、 实验目的: 1、巩固理论课上所学的知识。 2、锻炼动手能力、激发研究潜能,增强理论联系实际的能力。 二、 设计原理与步骤: 定位汽车车牌并识别其中的字符,采用 Matlab 平台提供的一些图像处理函 数,以傅立叶变换通过字符模板与待处理的图像匹配为核心思想。基本方法如下: 1、读取待处理的图像,将其转化为二值图像。 2、去除图像中不是车牌的区域。 3、为定位车牌,将白色区域膨胀,腐蚀去无关的小物件,包括车牌字符。 4、此时车牌所在白色连通域已清晰可见,但一个更大的连通域将车牌所在 连通域包围了,需将其填充。 5、查找连通域边界。同时保留此图形,以备后面在它上面做标记。 6、找出所有连通域中最可能是车牌的那一个。 判断的标准是:测得该车牌的长宽比约为 X:1,其面积和周长存在关系: (X × L × L)/(2 × (X + 1) × L)2 ≈ 1/Y , 以 此 为 特 征 , 取 metric=Y*area/perimeter^2 作为连通域的匹配度,它越接近 1,说明对 应的连通域越有可能是 X:1 的矩形。 7、将车牌图像反白处理,并扩充为 256×256 的方阵,以便傅立叶变换中矩 阵旋转运算的进行。 8、从文件读取一个字符模板。对图像计算傅立叶描述子,用预先定义好的 决策函数对描述子进行计算。变换后的图像中,亮度的高低指示相应区 域与模板的匹配程度。 9、确定一个合适的门限,显示亮度大于该门限的点,也就是与模板的匹配 程度最高的位置。 10、对照图片,可以说明相应字符被识别和定位了。 三、实验记录及分析: 待处理的图像如下所示。图像整体比较清晰干净,车牌方向端正,字体清楚, 与周围颜色的反差较大。读取待处理的图像,将其转化为二值图像。 经试验,采用门限值为 0.2 附近时车牌字符最为清楚,杂点最少。 I = imread('car.jpg'); I2 = rgb2gray(I); I4 = im2bw(I2, 0.2); 1
原 始 图 像 二 值 图 像 原始图像 二值图像 去除图像中面积过小的,可以肯定不是车牌的区域。为定位车牌,将白色区 域膨胀,腐蚀去无关的小物件,包括车牌字符。此时车牌所在白色连通域已清晰 可见,但在黑色区域以外,是一个更大的白色连通域,将车牌所在连通域包围了。 有必要将其填充。查找连通域边界。同时保留此图形,以备后面在它上面做标记。 bw = imfill(bw,[1 1]); [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 从对象中移除小对象 平滑图像的轮廓 找出所有连通域中最可能是车牌的那一个。判断的标准是:测得该车牌的长 宽比约为 4.5:1,其面积和周长存在关系:(4.5×L×L)/(2×(4.5+1)×L)2≈ 1/27,以此为特征,取 metric=27*area/perimeter^2 作为连通域的匹配度,它 越接近 1,说明对应的连通域越有可能是 4.5:1 的矩形。 % 找到每个连通域的质心 stats = regionprops(L,'Area','Centroid'); % 循环历遍每个连通域的边界 2
% 找到每个连通域的质心 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 1.38 % 显示匹配度字串 text(boundary(1,2)-35,boundary(1,1)+13,... metric_string,'Color','g',... 'FontSize',14,'FontWeight','bold');end 图示为找到的各个连通区域,中部被标记“○”的矩形匹配度为 1.00,是最 可能的区域。下边是由它确定的二值图像中的车牌区域: 2.06 1.00 0.65 二值图像中的车牌区域 3
将车牌图像反白处理,并扩充为 256×256 的方阵(如下左图),以便下面傅 立叶变换中矩阵旋转运算的进行。 goal=~goal;goal(256,256)=0;figure;imshow(goal); 从文件读取一个字符模板(以“P”为例,模板图像 直接从上述二值图像 中截取得到)。对图像计算傅立叶描述子,用预先定义好的决策函数对描述子进 行计算。变换后的图像中,亮度的高低指示相应区域与模板的匹配程度(如下中 图)。 w = imread('P.bmp');w = ~w; C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256))); 通过检查 C 的最大值,试验确定一个合适的门限(这里 240 比较合适),显 示亮度大于该门限的点,也就是与模板的匹配程度最高的位置(如下右图)。 thresh = 240;figure;imshow(C > thresh); 车牌图像反白处理 变换后的图像 确定定位点 对照左右两图,可以说明字符“P”被识别和定位了。同样的方法,可以识 别和定位其它字符。如: 识别“B” : w = imread('B.bmp'); w = ~w; C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256))); thresh = 290; 识别“4” : w = imread('4.bmp'); w = ~w; C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256))); thresh = 200; 识别“2” : w = imread('2.bmp'); w = ~w; C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256))); thresh = 250; 4
识别“B” 识别“4” 识别“2” 识别“M” : w = imread('M.bmp'); w = ~w; C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256))); thresh = 265; 识别“8” : w = imread('8.bmp'); w = ~w; C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256))); thresh = 250; 识别“M” 识别“8” 由图可见,该程序对于“8”与“B”这样相似的字符,识别时常常混淆。 5
四、 参考文献: [1] 冈萨雷斯.数字图像处理(第二版).电子工业出版社,2007.8 [2] 郁梅等.基于视觉的车辆牌照检测,计算机应用研究,1999(5),P65~67 [3] 刘阳.等.数字图象处理应用于车辆牌照的识别.辽宁大学学报.2004 [4] 宋建才.汽车牌照识别技术研究[J].工业控制计算机,2004,44~45 [5] Applications of the Fourier Transform, Matlab 7.0 Help Documents, The MathWorks. 五、 附录: 实验源程序: %读取待处理的图像,将其转化为二值图像。 %通过设定亮度阈值将真彩色转换成二值图像。 %删除二值图像 bw 中面积小于 500 的图像。 I = imread('car.jpg'); figure(1),imshow(I); title('原始图像'); I2 = rgb2gray(I); I4 = im2bw(I2, 0.2) ; figure(2),imshow(I4); title('二值图像'); bw = bwareaopen(I4, 500); figure(3),imshow(bw); title('从对象中移除小对象'); se = strel('disk',15); bw = imclose(bw,se); figure(4),imshow(bw); title('平滑图像的轮廓'); bw = imfill(bw,[1 1]); [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 % 找到每个连通域的质心 %创建圆盘半径 15。 %对图像实现闭运算,平滑图像的轮廓。 %孔填充处理 6
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 goal = ~goal; goal(256,256) = 0; figure(5); imshow(goal); w = imread('P.bmp'); w = ~w; C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256))); thresh = 240; figure(6); imshow(C > thresh); 7
分享到:
收藏