车牌匹配的MATLAB实现
HYPERLINK \l "_Toc282113516" 摘要 1
HYPERLINK \l "_Toc282113517" 关键字 1
HYPERLINK \l "_Toc282113518" 概述 2
HYPERLINK \l "_Toc282113519" 1、灰度匹配 2
HYPERLINK \l "_Toc282113520" 2、特征匹配 3
HYPERLINK \l "_Toc282113521" 3、比较 3
HYPERLINK \l "_Toc282113522" 设计思想 3
HYPERLINK \l "_Toc282113523" 程序流程图: 4
HYPERLINK \l "_Toc282113524" 实验结果: 5
HYPERLINK \l "_Toc282113525" 采用GUI界面完成效果展示 6
HYPERLINK \l "_Toc282113526" 参考文献 11
车牌匹配的MATLAB实现
摘要
图像配准是数字图像处理的一个很重要的环节,配准的好坏直接影响着后续的操作,同时图像配准也有着很广泛的应用。现在研究图像配准的人越来越多,配准的质量也越来越高,基于图像配准通常分为直接对图像像素的配准和对图像特征的配准,相比较而言。基于像素的配准稳定性高,思想简单易于实现,但是耗时太大,而基于特征点的配准虽然速度有明显的提高但是稳定性又受到制约。本文利用图像间像素间的相关应用于车牌的配准,同时利用了时域与频域的关系简化了计算加快了速度,并用MATLAB软件的GUI界面像读者展示了实验结果。
关键字:配准 MATLAB 相关 GUI
Abstract:Image registration is a very important aspect of digital image processing, the registration will have a direct impact on subsequent operations, besides image registration also has a very wide range of applications. Nowadays more and more people do the research about the image registration, also with the high quality, comparatively, image registration is usually divided into pixels-based registration directly and image features-based registration. Pixel-based registration is high stable, easy to implement with simple thought, but is consuming too much time, the image features-based registration’s speed is significantly improved ,however, the stability has been constrained, In this paper, the correlation of pixels between the images are used in the license plate registration, we also taking advantages of the relationship between time domain and frequency domain simplifies the calculation and accelerated, we also shows the experimental results with the GUI interface of MATLAB software to the reader.
Keywords:registration MATLAB related GUI
概述
图像匹配是图像处理的一个很重要的问题,在很多行业有着广泛的用途,例如工业检测,交通管理,遥感测量等领域都有着广泛的用途;图像匹配是指通过一定的匹配算法在两幅或多幅图像之间识别同名点,简单点说,图像匹配就是找到两幅图像之间的空间位置关系。随着经济的发展,汽车的数量越来越大,因此,在很多情况下常常需要对汽车的图像进行处理,例如在交通管理领域,就常常需要锁定汽车车牌的位置,然后再此基础上进行进一步的处理,本文就试图利用图像匹配的方法匹配并锁定车牌的位置,匹配的思想采用像素的灰度匹配,并利用傅里叶变换与相关之间的关系,通过对图像进行傅里叶变换找出两副图像间的相关情况,由此将车牌的位置从图片中提取出来。图像匹配就是在基准图像中,找出待匹配的图像所对应的位置,换言之,在待配准图像中将会有一部分和基准图像相似度较高的区域,图像匹配主要可分为以灰度为基础的匹配和以特征为基础的匹配:
1、灰度匹配
灰度匹配的基本思想:以统计的观点将图像看成是二维信号,采用统计相关的方法寻找信号间的相关匹配。利用两个信号的相关函数,评价它们的相似性以确定同名点。灰度匹配通过利用某种相似性度量,如相关函数、协方差函数、差平方和、差绝对值和等测度极值,判定两幅图像中的对应关系。最经典的灰度匹配法是归一化的灰度匹配 法,其基本原理是逐像素的把一个以一定大小的实时图像窗口的灰度矩阵,与参考图像的所有可能的窗口灰度阵列,按某种相似性度量方法进行搜索比较的匹配方法,从理论上说就是采用图像相关技术。 利用灰度信息匹配方法的主要缺陷是计算量太大,因为使用场合一般都有一定的速度要求,所以这些方法很少被使用。现在已经提出了一些相关的快速算法,如幅度排序相关算法,FFT相关算法和分层搜索的序列判断算法等。
2、特征匹配
特征匹配是指通过分别提取两个或多个图像的特征(点、线、面等特征),对特征进行参数描述,然后运用所描述的参数来进行匹配的一种算法。基于特征的匹配所处理的图像一般包含的特征有颜色特征、纹理特征、形状特征、空间位置特征等。特征匹配首先对图像进行预处理来提取其高层次的特征,然后建立两幅图像之间特征的匹配对应关系,通常使用的特征基元有点特征、边缘特征和区域特征。 特征匹配需要用到许多诸如矩阵的运算、梯度的求解、还有傅立叶变换和泰勒展开等数学运算。常用的特征提取与匹配方法有:统计方法、几何法、模型法、信号处理法、边界特征法、傅氏形状描述法、几何参数法、形状不变矩法等。基于图象特征的匹配方法可以克服利用图象灰度信息进行匹配的缺点,由于图象的特征点比较象素点要少很多,大大减少了匹配过程的计算量;同时,特征点的匹配度量值对位置的变化比较敏感,可以大大提高匹配的精确程度;而且,特征点的提取过程可以减少噪声的影响,对灰度变化,图象形变以及遮挡等都有较好的适应能力。所以基于图象特征的匹配在实际中的应用越来越广泛。所使用的特征基元有点特征(明显点,角点,边缘点等),边缘线段等。
3、比较
特征匹配与灰度匹配的区别:灰度匹配是基于像素的,特征匹配则是基于区域的,特征匹配在考虑像素灰度的同时还应考虑诸如空间整体特征、空间关系等因素。特征是图象内容最抽象的描述,与基于灰度的匹配方法相比,特征相对于几何图象和辐射度影响来说更不易变化,但特征提取方法的计算代价通常较大,并且需要一些自由参数和事先按照经验选取的阀值,因而不便于实时应用。同时,在纹理较少的图象区域提取的特征的密度通常比较稀少,使局部特征的提取比较困难。另外,基于特征的匹配方法的相似性度量也比较复杂,往往要以特征属性、启发式方法及阀方法的结合来确定度量方法
设计思想
在本文中,我选择用基于灰度匹配提取车牌位置的思想,首先人为的选择的基准图像是带车牌的原图,待配准图像是车牌,车牌是原图的一个子区域,没有发生旋转,尺度缩放等变换,是一个极为理想的情况,因此我可以利用基准图像和待配准图像间的相关关系进行图像的匹配,讲车牌图像在待原图上滑动,计算出每一点的相关值,相关值最大的那一点一定就是匹配点,自然就找到了位置,但这样的话由于要遍历全图,每一点都要进行计算比较十分的消耗时间,通过比较相关与卷积的关系,我们发现可以发现两幅图像,将其中的一幅图像求镜像,然后再完成两幅图像的卷积得到就是两幅图像的相关,这样我们自然想到先将两幅图像分别进行傅里叶变换,然后再求傅里叶逆变换,这样便完成了求两幅图像相关的计算,这样处理的好处在于,讲时域的卷积转化为频域的乘积,缩短了计算时间,同时,Matlab提供了傅里叶变换与逆变换的系统函数,可以直接调用,简单易行。
具体的步骤可以归纳为:
先得到基准图像和待匹配图像,将彩色图像转化为灰度图像,然后分别对两幅图像求傅里叶变换,计算出两幅图像的尺寸(长和宽);在变换之前,由于图像可以看成是数字信号,根据数字信号处理的知识可知必须先将两幅图像化为同样长度的序列,且必须是2的整数次幂,处理完毕后,将其中一幅图像的傅里叶变换结果取共轭,在本文中选取的是待匹配图像,通过频域相乘再取逆得到了两幅图像的相关系数,此时我只需要找出相关系数的极大值点,其对应的位置很明显就是匹配点,再根据上面计算出来的待匹配图像的尺寸,很容易的确定了车牌所在的区域。
程序流程图:
匹配点确定后,再根据车牌图像的大小便可在原图像中确定车牌的区域。结果如下:
实验结果:(运行代码1)
原始图像(带车牌的基准图像):
检测到的车牌图像(待配准图像):
结果图(锁定车牌区域后的图像):
从实验结果可以看出,采用这种思想可以很好的提取出车牌的位置,完成实验要求,而且耗时较短。
采用GUI界面完成效果展示
MATLAB提供了一种图形用户开发界面,即GUIDE,GUIDE是包含图形对象 ,如窗口,图标,菜单和文本的用户界面。以某种方式选择或者激活这些对象,通常引起动作或发生变化,单机鼠标,标志着对象的选择或者动作。一个优秀的GUI能够非常直观的让用于知道如何操作MATLAB界面,了解设计者的开发意图。令人兴奋的是,对于绝大数使用GUI的计算机用户都知道如何去应用GUI的标准控件,这也为GUI设计提供了广阔的前景。MATLAB的GUI为开发者提供了一个不脱离MATLAB的开发环境,有助于MATLAB程序的GUI的集成。
MATLAB图形用户界面开发环境提供了一系列创建用户图形界面的工具。这些工具极大的简化了GUI设计和生成的过程。本文最后采用GUI为读者更直观的展示实验效果。
GUI界面设计思想:先选中得到一块干净的GUIDE界面(blank GUI);在界面内设计3个按钮,第一个按钮命名为原图,也即是上文提到带车牌的基准图像,这个按钮完成的工作是展示原始图像,第二个按钮命名为车牌位置,即点击该按钮,会得到锁定车牌位置后的图片,该图片就是在原始图片上用红色标记出车牌所在的区域。第三个按钮是退出键,即在完成区域查找后退出该系统,下图为设计好的界面图:
界面设计好后,只需运行就可得到实验界面,顺利得到实验结果,下图为实验结果展示:
通过GUI展示此次实验内容,很容易发现GUI界面的直观简单的特点,即使是对代码完全不懂得读者,也能很容易完成操作观察到结果。
实现代码:
(代码1)
close all;
clear;
TestImage1=imread('car.jpg');
TestImage=rgb2gray(TestImage1);
figure;imshow(TestImage1);
title('原始图像');
PatternImage=imread('chepai.jpg');
PatternImage=rgb2gray(PatternImage);
[PatternHeight,PatternWidth]=size(PatternImage);
[TestHeight,TestWidth]=size(TestImage);
TestHeight2=pow2(nextpow2(TestHeight));
TestWidth2=pow2(nextpow2(TestWidth));
TestImageAddZeros=zeros(TestHeight2,TestWidth2);
PatternImageAddZeros=zeros(TestHeight2,TestWidth2);
TestImageAddZeros(1:TestHeight,1:TestWidth)=TestImage;
PatternImageAddZeros(1:PatternHeight,1:PatternWidth)=PatternImage;
TestImageAddZeros=uint8(TestImageAddZeros);
PatternImageAddZeros=uint8(PatternImageAddZeros);
PatternImageFFT=fft2(PatternImageAddZeros);
TestImageFFT=fft2(TestImageAddZeros);
PatternImageFFT=conj(PatternImageFFT);
ImageFFTResult=PatternImageFFT.*TestImageFFT;
ImageFFTConvResult=ifft2(ImageFFTResult./abs(ImageFFTResult));
[M N]=size(PatternImage);
[MaxValue]=max(ImageFFTConvResult);
[MaxValue,MaxPositionY]=max(MaxValue);
[MaxValue,MaxPositionX]=max(ImageFFTConvResult(:,MaxPositionY));
FindPart=TestImage1(MaxPositionX:MaxPositionX+M-1,MaxPositionY:MaxPositionY+N-1);
TestImage1(MaxPositionX:MaxPositionX+M-1,MaxPositionY:MaxPositionY+N-1)=256;
figure;imshow(FindPart);
title('检测到的车牌');
figure;imshow(TestImage1);
title('车牌的位置');
GUI界面实现代码(代码2)
function varargout = matlabwork2(varargin)
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
im1=imread('car.jpg');
axes(handles.axes1);
imshow(im1)
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close (gcf);
% --- Executes on button press in radiobutton1.
function radiobutton1_Callback(hObject, eventdata, handles)
% hObject handle to radiobutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of radiobutton1
TestImage1=imread('car.jpg');
TestImage=rgb2gray(TestImage1);
PatternImage=imread('chepai.jpg');
PatternImage=rgb2gray(PatternImage);
[PatternHeight,PatternWidth]=size(PatternImage);
[TestHeight,TestWidth]=size(TestImage);
TestHeight2=pow2(nextpow2(TestHeight));
TestWidth2=pow2(nextpow2(TestWidth));
TestImageAddZeros=zeros(TestHeight2,TestWidth2);
PatternImageAddZeros=zeros(TestHeight2,TestWidth2);
TestImageAddZeros(1:TestHeight,1:TestWidth)=TestImage;
PatternImageAddZeros(1:PatternHeight,1:PatternWidth)=PatternImage;
TestImageAddZeros=uint8(TestImageAddZeros);
PatternImageAddZeros=uint8(PatternImageAddZeros);
PatternImageFFT=fft2(PatternImageAddZeros);
TestImageFFT=fft2(TestImageAddZeros);
PatternImageFFT=conj(PatternImageFFT);
ImageFFTResult=PatternImageFFT.*TestImageFFT;
ImageFFTConvResult=ifft2(ImageFFTResult./abs(ImageFFTResult));
[M N]=size(PatternImage);
[MaxValue]=max(ImageFFTConvResult);
[MaxValue,MaxPositionY]=max(MaxValue);
[MaxValue,MaxPositionX]=max(ImageFFTConvResult(:,MaxPositionY));
FindPart=TestImage1(MaxPositionX:MaxPositionX+M-1,MaxPositionY:MaxPositionY+N-1);
TestImage1(MaxPositionX:MaxPositionX+M-1,MaxPositionY:MaxPositionY+N-1)=256;
axes(handles.axes3);
imshow(TestImage1);
参考文献
冈萨雷斯数字图像处理。电子工业出版社,2005.
冈萨雷斯数字图像处理MATLAB版。电子工业出版社,2005.
精通MATLAB6.5.北京:中国水利出版社,2004.
车牌匹配的MATLAB实现.doc