图像分割、边缘检测(车牌识别)例子一PSPANstyle=mso-no-proof:yeslang=EN-US?xml:namespaceprefix=vns=urn:schemas-microsoft-com:vml/v:shapestyle=WIDTH:401.25pt;HEIGHT:372pt;VISIBILITY:visible;mso-wrap-style:squareid=图片_x0020_10type=#_x0000_t75o:spid=_x0000_i1025v:imagedatao:title=src=file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image007.png/PDIVclass=blockcodeBLOCKQUOTEPstyle=MARGIN:0cm0cm0ptclass=MsoNormalSPANstyle=mso-no-proof:yeslang=EN-USv:shapestyle=WIDTH:401.25pt;HEIGHT:372pt;VISIBILITY:visible;mso-wrap-style:squareid=图片_x0020_10type=#_x0000_t75o:spid=_x0000_i1025v:imagedatao:title=src=file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image007.png/v:imagedata/v:shape/SPAN/PMatlab代码%function[d]=main()closeallclc%清空命令窗口的所有输入和输出,类似于清屏%自动弹出提示框读入图像[filename,filepath]=uigetfile('.jpg','输入一个需要识别的车牌图像');%直接自动读入%file=strcat(filepath,filename);%strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名I=imread(file);figure('name','原图'),imshow(I);title('原图')%图像增强%h=ones(5,5)/25;%过滤器h%I=imfilter(I,h);%真彩色增强%figure('name','真彩色增强');imshow(I);title('真彩色增强');I1=rgb2gray(I);%RGB图像转灰度图像figure('name','灰度处理前'),subplot(1,2,1),imshow(I1);title('灰度处理前的灰度图');subplot(1,2,2),imhist(I1);title('灰度处理前的灰度图直方图');%线性灰度变换I1=imadjust(I1,[0.3,0.7],[]);figure('name','灰度处理后'),subplot(1,2,1),imshow(I1);title('灰度处理后的灰度图');subplot(1,2,2),imhist(I1);title('灰度处理后的灰度图直方图');%进行中值滤波I1=medfilt2(I1);figure,imshow(I1);title('中值滤波');%边缘检测:sobel,roberts,canny,prewitt等I2=edge(I1,'roberts',0.25,'both');%边缘检测算法,强度小于阈值0.15的边缘被省略掉,'both'两个方向检测(缺省默认)figure('name','边缘检测'),imshow(I2);title('robert算子边缘检测')se=[1;1;1];I3=imerode(I2,se);%腐蚀Imerode(X,SE).其中X是待处理的图像,SE是结构元素对象figure('name','腐蚀后图像'),imshow(I3);title('腐蚀后的图像');se=strel('rectangle',[20,20]);%25X25的矩形strel???I4=imclose(I3,se);%用25*25的矩形对图像进行闭运算(先膨胀后腐蚀)有平滑边界作用figure('name','平滑处理'),imshow(I4);title('平滑图像的轮廓');I5=bwareaopen(I4,1000);%从二进制图像中移除所有少于2000像素的连接对象,消失的是连续的白色像素数量少于2000的字符figure('name','移除小对象'),imshow(I5);title('从对象中移除小对象');[y,x,z]=size(I5);%y是行数,x是列数,z是维数myI=double(I5);%转成双精度型tic%开始计时Blue_y=zeros(y,1);%zeros(M,N)表示的是M行*N列的全0矩阵fori=1:yforj=1:xif(myI(i,j,1)==1)%%判断蓝色像素Blue_y(i,1)=Blue_y(i,1)+1;%蓝色像素点统计endendend[tempMaxY]=max(Blue_y);%Y方向车牌区域确定[tempMaxY]临时变量MaxYPY1=MaxY;%以下为找车牌Y方向最小值while((Blue_y(PY1,1)=5)&&(PY11))%%为什么判断蓝色像素点=5(才算蓝色)????PY1=PY1-1;endPY2=MaxY;%以下为找车牌Y方向最大值???难道最大值不是MaxY????while((Blue_y(PY2,1)=5)&&(PY2y))PY2=PY2+1;end%IY=I(PY1:PY2,:,:);%%%%%%%%%%%%%%%%%X方向%%%%%%%%%Blue_x=zeros(1,x);%进一步确定x方向的车牌区域forj=1:xfori=PY1:PY2%只需扫描的行if(myI(i,j,1)==1)%%判断蓝色像素Blue_x(1,j)=Blue_x(1,j)+1;%蓝色像素点统计endendendPX1=1;%以下为找车牌X方向最小值while((Blue_x(1,PX1)3)&&(PX1x))%%为什么判断蓝色像素点3(不算蓝色?)????PX1=PX1+1;endPX2=x;%以下为找车牌X方向最大值while((Blue_x(1,PX2)3)&&(PX2PX1))PX2=PX2-1;endPY1=PY1-2;%对车牌区域的校正为什么要这么+-???PX1=PX1-2;PX2=PX2+3;PY2=PY2+10;dw=I(PY1:PY2-8,PX1:PX2,:);%裁剪图像toc%t=toc;%停止计时%figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');figure('name','定位剪切后的彩色车牌图像'),%subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')imwrite(dw,'dw.jpg');%直接自动读入%[filename,filepath]=uigetfile('dw.jpg','输入一个定位裁剪后的车牌图像');%jpg=strcat(filepath,filename);%strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名a=imread('dw.jpg');b=rgb2gray(a);imwrite(b,'1.车牌灰度图像.jpg');figure('name','车牌处理');subplot(3,2,1),imshow(b),title('1.车牌灰度图像')%g_max=double(max(max(b)));%以下作阈值化(灰度图转二值图)%g_min=double(min(min(b)));%max(a)求的每列的最大值,是一维数据;max(max(a))是求这一维数据的最大值。%T=round(g_max-(g_max-g_min)/2);%T为二值化的阈值round:取整为最近的整数%[m,n]=size(b);%m:b的行向量数n:b的列向量数%d=(double(b)=T);%d:二值图像%imwrite(d,'2.车牌二值图像.jpg');%线性灰度变换b=imadjust(b,[0.3,0.7],[]);subplot(3,2,2),imshow(b);title('2.线性灰度处理后的灰度图');%进行二值化处理d=im2bw(b,0.4);%将灰度图像进行二值化处理imwrite(d,'2.车牌二值图像.jpg');subplot(3,2,3),imshow(d),title('3.车牌二值图像');%显示二值化图像%进行中值滤波d=medfilt2(d);imwrite(d,'4.均值滤波后.jpg');subplot(3,2,4),imshow(d);title('4.中值滤波后');%均值滤波%h=fspecial('average',3);%d=im2bw(round(filter2(h,d)));%滤波后,im2bw():将图像转成二值图像(可以不用round函数也是一样的)%imwrite(d,'4.均值滤波后.jpg');%subplot(3,2,4),imshow(d),title('4.均值滤波后')%某些图像进行操作%膨胀或腐蚀???感觉没什么效果咧???%se=strel('square',3);%使用一个3X3的正方形结果元素对象对创建的图像进行膨胀%'line'/'diamond'/'ball'/'square'/'dish'...线/菱形/球/正方形/圆se=eye(2);%eye(n)返回n乘n单一矩阵;单位矩阵[m,n]=size(d);ifbwarea(d)/m/n=0.365%函数bwarea计算目标物的面积,单位是像素;bwarea/m/n即为单个像素??d=imerode(d,se);%腐蚀elseifbwarea(d)/m/n=0.235d=imdilate(d,se);%膨胀endimopen(d,se);%se=eye(7);%imopen(d,se);imwrite(d,'5.膨胀或腐蚀处理后.jpg');subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')%寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割d=qiege(d);%调用qiege()子程序[m,n]=size(d);figure,subplot(2,1,1),imshow(d),title(n)%k1=1;k2=1;j=1;s=sum(d);%sum(x)就是竖向相加,求每列的和,结果是行向量;sum(x,2)表示矩阵x的横向相加,求每行的和,结果是列向量。sum(X(:))表示矩阵求和whilej~=n%%%%%什么原理???whiles(j)==0%%无文字???为什么???j=j+1;endk1=j;whiles(j)~=0&&j=n-1j=j+1;endk2=j-1;ifk2-k1=round(n/6.5)[val,num]=min(sum(d(:,[k1+5:k2-5])));d(:,k1+num+5)=0;%分割endend%再切割%d=qiege(d);%切割出7个字符y1=10;y2=0.25;flag=0;word1=[];whileflag==0%flag为自定义,以便标记循环用[m,n]=size(d);%left=1;wide=0;whilesum(d(:,wide+1))~=0%二值图像:黑色像素代表感兴趣的对象而白色像素代表背景。逻辑矩阵只包括0(显示为黑色)和1(显示为白色)wide=wide+1