-1-Matlab在图像处理与目标识别方面的应用实验作者:林健(北京理工大学计算机科学技术学院)指导教师:尚斐(北京理工大学医学图像实验室)Website::yumenlj@126.comQQ:71424-2-一、染色体识别与统计待处理的图像如下所示。图像有明显的噪音,部分染色体有断开和粘连的情况。要识别其中的染色体并统计其数目,我们采用Matlab平台提供的一些图像处理函数。基本方法如下:1、读取待处理的图像,将其转化为灰度图像,然后反白处理。I=imread('chrimage.bmp');I2=rgb2gray(I);s=size(I2);I4=255*ones(s(1),s(2),'uint8');I5=imsubtract(I4,I2);2、对图像进行中值滤波去除噪音。经试验,如果采用3×3的卷积因子,噪音不能较好地去除,染色体附近毛糙严重。而5×5和7×7的卷积因子能取得较好的效果。图示滤噪前后的效果对比。I3=medfilt2(I5,[55]);3、将图像转化为二值图像。经试验,采用门限值为0.3附近时没有染色体断开和粘连(如下左图),便于后期统计。I3=imadjust(I3);bw=im2bw(I3,0.3);-3-在此步骤,如果使用graythresh函数自动寻找门限,得到的图像染色体断开的比较多(如下中图),此时可以将白色区域膨胀,使断开的的染色体连接(如下右图)。level=graythresh(I3);bw=im2bw(I3,level);se=strel('disk',5);bw=imclose(bw,se);两种方法相比,前者对染色体面积的计算比较准确,后者对不同图像的适应性较强。下面的步骤将基于前一种方法。4、去除图像中面积过小的,可以肯定不是染色体的杂点。这些杂点一部分是滤噪没有滤去的染色体附近的小毛糙,一部分是图像边缘亮度差异产生的。bw=bwareaopen(bw,10);5、标记连通的区域,以便统计染色体数量与面积。[labeled,numObjects]=bwlabel(bw,4);6、用颜色标记每一个染色体,以便直观显示。此时染色体的断开与粘连问题已基本被解决。最终效果如下图。RGB_label=label2rgb(labeled,@spring,'c','shuffle');7、统计被标记的染色体区域的面积分布,显示染色体总数。统计总数为46,与人工数出数目的相同。-4-chrdata=regionprops(labeled,'basic')allchrs=[chrdata.Area];num=size(allchrs)nbins=20;figure,hist(allchrs,nbins);title(num(2))010020030040050060070000.511.522.533.544.5546至此,染色体识别与统计完成。此方法采用Matlab已有的函数,简单且快捷。但缺点是此程序是专为这一幅待处理图像写的,诸如门限、滤噪方法的特定性强。同时没有经过大量同类待处理图像的测试,系统通用性不强。不过作为实验,了解提取与分析目标图像中的有效信息的基本方法,是足够的。*参考文献:1、CorrectingNonuniformIllumination,Matlab7.0Demos,TheMathWorks.-5-二、汽车牌照定位与字符识别待处理的图像如下所示。图像整体比较清晰干净,车牌方向端正,字体清楚,与周围颜色的反差较大。要定位汽车牌照并识别其中的字符,我们采用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);-6-4、此时车牌所在白色连通域已清晰可见,但在黑色区域以外,是一个更大的白色连通域,将车牌所在连通域包围了。有必要将其填充。bw=imfill(bw,[11]);5、查找连通域边界。同时保留此图形,以备后面在它上面做标记。[B,L]=bwboundaries(bw,4);imshow(label2rgb(L,@jet,[.5.5.5]))holdonfork=1:length(B)boundary=B{k};plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)end6、找出所有连通域中最可能是车牌的那一个。判断的标准是:测得该车牌的长宽比约为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');%循环历遍每个连通域的边界fork=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的连通域ifmetric=0.9&&metric=1.1centroid=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)]);-7-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(Cthresh);-8-对照左右两图,可以说明字符“P”被识别和定位了。同样的方法,可以识别和定位其它字符。这种方法总体上比较容易理解,Matlab的函数隐藏了傅立叶变换等复杂的计算。缺点:在定位车牌方面,程序专门按本题给定图像的特点设计,没有普适性。字符识别方面,仅能识别与给定模板基本一致的字符。车牌大小、角度、光线、完整性、清晰度发生变化后,就无法识别了。同时对于“8”与“B”这样相似的字符,识别时常常混淆。*参考文献:1、ApplicationsoftheFourierTransform,Matlab7.0HelpDocuments,TheMathWorks.2、IdentifyingRoundObjects,Matlab7.0Demos,TheMathWorks.-9-三、基于BP神经网络识别字符的简单实验汽车牌照定位与字符识别是目标自动识别的一个典型问题。车牌由有限的字母和数字组成,采用固定的印刷字体和排列顺序。在车牌自动识别系统中,因自然因素或采样因素使得原本规则的印刷体字符产生畸变,给字符识别来了很大困难。BP神经网络算法是把一组样本输入输出问题转化为一个非线性优化问题,并通过梯度算法利用迭代运算求解权值的一种学习方法。采用BP网络进行分类,并附加线性感知器来实现单字符的有效识别,算法简便,识别率高,可适用于多种高噪声环境中的印刷体字符识别。下面的实验引自《神经网络模型及其MATLAB仿真程序设计》一书P94~98,简单起见,只对含有单独数字的图片样本进行识别,不涉及从照片中定位车牌,分割字符等前期处理。我在保持基本算法思想不变的前提下,对原书程序及其叙述做了一定的修改。Matlab源程序略。一、BP神经网络结构分析:按照BP神经网络设计方法选用两层BP网络。其输入节点数为16×16=256,隐层传输函数为Sigmoid函数。假设用一个输出节点表示10个数字,则输出层传输函数为pureline,隐层节点数为)10~1(1256aa,取25。二、神经网络仿真程序设计:1、构造训练样本集,并构成训练所需的输入矢量和目标矢量:准备10组,每组10个(0~9)数字bmp图片作为训练样本。其中1组为清晰的,这里使用MicrosoftVisualC#编程生成。另9组是在清晰样本的基础上,用Matlab添加'salt&pepper'、'gaussian'等噪音制作成的(下图示以“5”为例)。这些图片经过一定的预处理,取出其最大有效区域,归一为16×16的二值图像,作为输入矢量。2、构造BP神经网络,并根据训练样本集形成的输入矢量和目标矢量,对BP网络进行训练。训练的误差性能曲线如图:05010015020025030010-410-310-210-1100101102300EpochsTraining-BlueGoal-BlackPerformanceis0.000989527,Goalis0.001-10-3、对BP神经网络进行仿真。用不同的方法生成测试样本图像,存于另外的bmp文件中,测试结果如下:测试样本识别情况与训练样本完全相同测试20个样本(2组0~9,皆是训练样本的复本),100%正确与训练样本用相同的噪音算法生成测试20个样本(2组0~9,分别加'salt&pepper'、'gaussian'噪音),60%正确在清晰的训练样本基础上用MicrosoftWindows画图工具手工加入杂点测试20个样本(2组0~9,分别用“喷枪”加黑色与白色随机杂点),35%正确为提高识别率,可以增加训练样本,或通过增加字体的特征向量等途径来解决。由于涉及较多的理论,这里不再深入讨论。*参考文献:1、周开利等,《神经网络模型及其MATLAB仿真程序设计》,清华大学出版社,2005.2、张兴会等,基于神经网络的车牌照自动识别系统,仪器仪表学报,第22卷第3期增刊,2001.