《老郑MATLAB15题作业讲解23504.pdf》由会员分享,可在线阅读,更多相关《老郑MATLAB15题作业讲解23504.pdf(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 2 题-直方图的不同图下的图像效果比较 代码:img=imread(D:Lena.bmp);subplot(231),imshow(img);title(图1);subplot(234),imhist(img);title(图1的直方图);img=imread(D:Peppers.bmp);subplot(232),imshow(img);title(图2);subplot(235),imhist(img);title(图2的直方图);img=imread(D:Cameraman.bmp);subplot(233),imshow(img);title(图3);subplot(236),im
2、hist(img);title(图3的直方图);效果图:第 6 题-动态范围-线性动态范围调整效果例 线性调整:线性调整是将输入图像灰度值的动态范围按线性关系公式拉伸扩展至指定范围或整个动态范围。可突出感兴趣目标,抑制不感兴趣的目标。在实际运算中,原图像 f(x,y)的灰度范围为a,b,使变换后图像 g(x,y)的灰度扩展为c,d,则采用下述线性变换来实现:cayxfabcdyxg),(),(线性灰度变换对图像每个灰度范围作线性拉伸,将有效地改善图像视觉效果。代码:A=imread(D:Lena.bmp,bmp);%读入图像 B=imadjust(A,0.1,0.8,0,1);%灰度调整 im
3、write(B,D:LenaTZ.bmp);%图像保存 subplot(2,2,1);imshow(A);title(原图);%显示调整前后图像及其直方图 subplot(2,2,2);imhist(A);title(原图的直方图);subplot(2,2,3);imshow(B);title(线性调整后);subplot(2,2,4);imhist(B);title(调整后直方图);效果图:第 10 题-基于灰度调色板的伪彩色方法例 伪彩色处理:根据特定的准则将灰度图像转换为索引图像,或者将彩色图像转换成给定彩色分布的图像的过程.灰度级彩色变换法伪彩色处理 关键技术:调色板的编码方法 在一个
4、预定的调色板中查找该数值所对应的颜色 代码:I1=imread(D:LenaRGB.bmp);subplot(121);imshow(I1);title(原图);I=rgb2gray(I1);subplot(122);imshow(I);title(灰度处理后);x=grayslice(a,256);figure,imshow(a,hot(256);title(伪彩色图像);效果图:第 14 题-图像的镜像例 代码:%镜像变换 A=imread(D:LenaRGB.bmp);height,width,dim=size(A);tform=maketform(affine,-1 0 0;0 1 0
5、;width 0 1);%定义水平镜像变换矩阵 B=imtransform(A,tform,nearest);tform2=maketform(affine,1 0 0;0-1 0;0 height 1);%定义垂直镜像变换矩阵 C=imtransform(A,tform2,nearest);subplot(1,3,1),imshow(A);title(原图像);subplot(1,3,2),imshow(B);title(水平镜像);subplot(1,3,3),imshow(C);title(竖直镜像);效果图:第 18 题-基于局部均值的图像缩小方法 原理:计算采样间隔,得到i和j,求出
6、相临两个采样点之间所包含的原图像的子块,即为:jjiijjiijjiijjiijiffffF,1)1(,1)1(1)1(,1)1(),((5)利用),(),(jiFjig的均值,求出缩小的图像.例 2 如上例子,由式(5)可以将图像 F 分块为:464544434241363534333231262524232221161514131211 ffffffffffffffffffffffffF (6)再由),(),(jiFjig得均值,得到缩小的图像为:342414332313322212312111ggggggggggggG (7)式中:),(jig为式(6)各子块的均值,如4)(323122
7、2121ffffg 例 3 若图像为 242016123834231915113733221814103632211713393531F 按照以上例子缩小的比例.采用等间隔采样和采用局部均值采样得到缩小的图像分别为:242321201917121139383735G 342321181715121139363533G 代码:function y=resize(a,mul1,mul2)m,n=size(a)m1=m*mul1;n1=n*mul2;for i=1:m1;for j=1:n1;b(i,j)=a(round(i/mul1),round(j/mul2);end end y=b;I=imr
8、ead(D:Lena.bmp);subplot(211),imshow(I);title(原图);J=resize(I,0.5,0.3);subplot(212),imshow(J);title(局部缩小后);效果图:第 22 题-利用错切实现图像的旋转 原理:错切(shear)是一种使对象形状发生变化的变换.经过错切的对象好像是由已经相互滑动的内部夹层组成.常用的错切变换有两种:改变 x 坐标值和改变 y 坐标值.代码:H=1;%索引pix中第一个元素,即高度 W=2;%索引pix中第二个元素,即宽度 jiaodu=0;%要旋转的角度,旋转方向为顺时针 img=imread(D:Lena.b
9、mp);%这里v为原图像的高度,u为原图像的宽度 subplot(121);imshow(img);%这里y为变换后图像的高度,x为变换后图像的宽度 title(原图);v u=size(img);h=v;%原图像的高度 w=u;%原图像的宽度 pro=w/h;%宽高比%虽然这段程序是本人写的,不过这个仿射变换系数还是不太好表述,暂时是本人现在的理解。%仿射变换系数,变换后图像的倾斜强度。取值区间为(0,1)为图像向右上错切;取0时不变换图像;取1时为垂直错切,不显图像;大于1时向左下错切图像%区间为(-1,0)为向左上错切图像;为-1时垂直错切,不显图像;小于-1时为右下错切图像。系数过大或
10、过小处理时间会很长,再大/再小就会报错 aff_cof=0.15;theta=jiaodu/180*pi;rot1=cos(theta)-sin(theta)0;sin(theta)cos(theta)0;0 0 1;%旋转变换矩阵 rot2=1 aff_cof*pro 0;aff_cof*(1/pro)1 0;0 0 1;%错切变换矩阵 rot=rot2*rot1;%联合变换矩阵 inv_rot=inv(rot);pix1=1 1 1*rot;%变换后图像左上点的坐标 pix2=1 u 1*rot;%变换后图像右上点的坐标 pix3=v 1 1*rot;%变换后图像左下点的坐标 pix4=v
11、 u 1*rot;%变换后图像右下点的坐标 height=round(max(abs(pix1(H)-pix4(H)+0.5 abs(pix2(H)-pix3(H)+0.5);%变换后图像的高度 width=round(max(abs(pix1(W)-pix4(W)+0.5 abs(pix2(W)-pix3(W)+0.5);%变换后图像的宽度 imgn=zeros(height,width);delta_y=abs(min(pix1(H)pix2(H)pix3(H)pix4(H);%取得y方向的负轴超出的偏移量 delta_x=abs(min(pix1(W)pix2(W)pix3(W)pix4
12、(W);%取得x方向的负轴超出的偏移量 for y=1-delta_y:height-delta_y for x=1-delta_x:width-delta_x pix=y x 1*inv_rot;%用变换后图像的点的坐标去寻找原图像点的坐标%否则有些变换后的图像的像素点无法完全填充 if pix(H)=0.5&pix(W)=0.5&pix(H)=v&pix(W)h(1,j1+1)z0=z(1,j1);%z0为临时变量 z(1,j1)=z(1,j1+1);z(1,j1+1)=z0;end end end%最小方差已经求出,即h(1,1),对应z(1,1)这个向量,即对应的方差最小的模板 y(i
13、,j)=mean(z(1,1);%中心像素获得最小方差模板对应的均值%y(i,j)=median(z(1,1);%中心像素获得最小方差模板对应的中值 end end 主函数:I=imread(D:LenaRGB.bmp);I=rgb2gray(I);e f=size(I);%J=imnoise(I,salt&pepper,0.030);J=imnoise(I,gaussian,0,0.0002);l=grayminvariance(J);%灰度最小方差的均值滤波器 subplot(1,2,1),imshow(J),title(原图处理);subplot(1,2,2),imshow(uint8(
14、l),title(灰度最小方差的均值滤波);效果图:第 30 题-图像锐化处理-一阶微分算子(垂直水平)的应用例 原理:垂直微分算子的设计思想与水平方向相同,通过一个可以检测出垂直方向上的像素值的变化模板来实现。代码:I=imread(D:Lena.bmp);subplot(121),imshow(I);title(原始图像);II=eye(514,514);for i=2:513 for j=2:513 II(i,j)=I(i-1,j-1);end end II(2:513,1)=I(:,2);II(2:513,514)=I(:,511);II(1,:)=II(3,:);II(514,:)=
15、II(512,:);IX=zeros(512,512);IY=zeros(512,512);H1=-1 0 1-1 0 1-1 0 1;H2=-1-1-1 0 0 0 1 1 1;for i=2:513 for j=2:513 Block1=II(i-1:i+1,j-1:j+1);X1=Block1(:);sum1=sum(X1.*H1);sum2=sum(X1.*H2);IX(i,j)=sum1;IY(i,j)=sum2;end end IX=-IX;IY=-IY;subplot(122),imshow(IX,0 511);title(一阶垂直锐化);效果图:第 34 题-图像锐化处理-二阶
16、微分算子 Lapacian算子应用例 原理:Laplacian算子是线性二阶微分算子,由于灰度均匀的区域或斜坡中间二阶差分为 0,所以 laplacian算子在这一区域对图像的不起作用或者说作用很少,而对于图像的斜坡或低灰度侧形成的下冲和在斜坡顶或高灰度侧形成的上冲部分,laplacian表现出很强的突出边缘的功能。laplacian算子是利用边缘像素灰度值两旁的灰度值形成的屋顶状变化来对图像进行锐化。代码:a=imread(D:Lena.bmp);h=0-1 0-1 5-1 0-1 0;j=conv2(a,h,same);subplot(1,2,1);imshow(a);title(原始图像
17、);subplot(1,2,2);imshow(j,);title(Laplacian算子锐化后图像);效果图:第 38 题-基于图像灰度分布的阈值图像分割方法-灰度直方图的峰谷方法 原理:峰谷法又称状态法。状态法首先统计最简单图像的灰度直方图,若呈双峰且有明显的谷,则可以将谷所对应的灰度 t 作为阈值。通过二值化处理,将目标分割出来。特点:适用于目标和背景的灰度差较大,直方图有明显谷的情况。方法简单,但会受到噪声的干扰。改进:取均值、平滑等。代码:I=imread(D:Lena.bmp);subplot(221),imshow(I);title(原图);subplot(223),imhist
18、(I);title(原图的直方图);newI=im2bw(I,150/255);subplot(222),imshow(newI);title(分割后的图像);subplot(224),imhist(newI);title(分割后的灰度直方图);效果图:t t 第 42 题-最大熵方法进行灰度图像分割 原理:阈值分割是图像处理中的基本方法。常用的阈值分割法有最小误差阈值法,最大类别方差法及最大熵法等。以往提出的大部分熵阈值分割方法都是基于图像的一维灰度直方图的,之后有学者将其推广到二维的情形,也有人将模糊性引入最大熵原则,提出模糊 C 分类的最大熵原则,以获得最佳分割阈值。该方法有较好的适应性
19、,不需要先验知识,且对于非理想双峰直方图的图像也可进行分割。但由于该方法用穷尽搜索寻找全局最优解,因此计算复杂,耗时长,影响此算法的实际应用和推广。目前,一些学者尝试将进化算法和最大熵图像分割方法相结合,以缩短运算时间,降低计算复杂性,提高算法的实际应用价值。代码:%-基于最大熵准则的图像分割-I=imread(D:Lena.bmp);h=imhist(I);h1=h;len=length(h);%求出所有的可能灰度 m,n=size(I);h1=(h1+eps)/(m*n);%算出各灰度点出现的概率%-具体算法-for i=1:(len-1)if h(i)=0 P1=sum(h(1:i)/(
20、m*n);P2=sum(h(i+1):len)/(m*n);else continue;end H1(i)=-(sum(h1(1:i).*log10(h1(i+1);H2(i)=-(sum(h1(i+1):len).*log10(h1(i+1):len);H(i)=(1/P1)*H1(i)+H2(i)*(1/P2)+log10(P1*P2);end m1=max(H);%获得最大熵%-subplot(121),imshow(I,border,tight);title(原图);I1=im2bw(I,m1/255);%阈值分割 I1=mat2gray(I1);subplot(122),imshow
21、(I1,border,tight);title(分割后);效果图:第 50 题-综合边缘检测法在边缘检测中的应用 代码:I=imread(D:Lena.bmp);%读取原始图像 subplot(221),imshow(I);title(原图);BW1=edge(I,roberts);%Roberts算子边缘检测 subplot(222),imshow(BW1);title(Roberts 算 子 边缘检测);BW2=edge(I,prewitt);%Prewitt算子边缘检测 subplot(223),imshow(BW2);title(Prewitt算子边缘检测);BW3=edge(I,so
22、bel);%Sobel算子边缘检测 subplot(224),imshow(BW3);title(Sobel 算 子 边 缘检测);BW4=edge(I,log);%LOG算子边缘检测 figure;subplot(221),imshow(BW4);title(LOG算子边缘检测);BW5=edge(I,canny);%Canny算子边缘检测 subplot(222),imshow(BW5);title(Canny算子边缘检测);BW6=edge(I,zerocross);%过零点方法边缘检测 subplot(223),imshow(BW6);title(过零点方法边缘检测);BW7=edge
23、(I,zerocross,0);%过零点阈值取零边缘检测 subplot(224),imshow(BW7);title(过零点阈值取零边缘检测);效果图:第 54 题-腐蚀与膨胀效果举例 膨胀原理:膨胀:将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。利用它可以填补物体中的空洞。B 对 X 膨胀所产生的二值图像 D 是满足以下条件的点(x,y)的集合:如果 B 的原点平移到点(x,y),那么它与 X 的交集非空。方法:可以使用 imdilate函数进行图像膨胀,imdilate函数需要两个基本输入参数,即待处理的输入图像和结构元素对象。结构元素对象可以是 strel函数返回的对
24、象,也可以是一个自己定义的表示结构元素邻域的二进制矩阵。此外,imdilate还可以接受两个可选参数:PADOPT(padopt)影响输出图片的大小、PACKOPT(packopt).说明输入图像是否为打包的二值图像(二进制图像)。规则:超出图像边界的像素值定义为该数据类型允许的最小值,对于二进制图像,这些像素值设置为 0;对于灰度图像,unit8类型的最小值也为 0。代码:BW=zeros(90,100);BW(40:60,40:70)=10;SE=strel(square,30);BW2=imdilate(BW,SE);subplot(121);imshow(BW);title(原图);s
25、ubplot(122);imshow(BW2);title(膨胀后);效果图:腐蚀原理:腐蚀:一种消除边界点,使边界向内部收缩的过程。利用它可以消除小而且无意义的物体。B 对 X 腐蚀所产生的二值图像 E 是满足以下条件的点(x,y)的集合:如果 B 的原点平移到点(x,y),那么 B 将完全包含于 X 中。方法:可以使用 imerode函数进行图像腐蚀。imerode函数需要两个基本输入参数:待处理的输入图像以及结构元素对象。此外,imerode函数还可以接受 3个可选参数:PADOPT(padopt)影响输出图片的大小、PACKOPT(packopt).说明输入图像是否为打包的二值图像(二
26、进制图像)。M 指定原始图像的行数。规则:超出图像边界的像素值定义为该数据类型允许的最大值,对于二进制图像,这些像素值设置为 1;对于灰度图像,unit8类型的最小值也为 255。代码:BW1=imread(D:Cameraman.bmp);SE=strel(arbitrary,eye(5);BW2=imerode(BW1,SE);subplot(121);imshow(BW1);title(原图);subplot(122);imshow(BW2);title(腐蚀后);效果图:第 58 题-白平衡处理方法应用例 原理:这个算法是通过对图片的 ycbcr色空间的分析来确定参考白点的,所以次算法
27、可以说是自适应白平衡算法。本算法选择参考白点的阀值是动态变化的,所以对于不同的图片,其阀值也不同。通过对图片的 cbcr坐标空间的分析,我们可以看到一个接近白色的区域(near-white region)是包含着参考白点的。通过这个思路,我们可以通过对图片分区,然后找出参考白点,然后在通过 von kvies model来调整图片时期实现白平衡。这样,这个算法就包括了两个步骤了:寻找参考白点,白点调整。寻找参考白点:为了确定一个接近白色的区域,我们就必须把 RGB色空间转换成YCbCr色空间。色空间转换后,就是计算 Cb、Cr 的均值 Mb、Mr;然后通过下式计算 Cb、Cr 的均方差 Db、
28、Dr:为了提高算法的稳健性,将图片分为几个区域并且计算每个区域的 Mb、Mr、Db、Dr,如果一个区域的 Db,Dr 太小,那么这个区域就没有足够的色彩变化,就可以丢弃掉了。这样可以避免大面积的统一色调对结果的影响。接下来就可以通过下面的关系式得到接近白色区域的所有像素点了:根据亮度值,我们选择接近白色区域中的 10%的候选参考白点最为参考白点。在白点确定后,就可以从参考白点中得到信道增益的值了。为了维持整幅图片的亮度不变,亮度的最大值被用来得到信道增益。所以信道增益不及和参考白点有关还与亮度的最大值有关,其表达式如下:其中是整幅图片像素的亮度最大值,、和是参考白点的 RGB信道的均值。最后,
29、根据 von-kvies model来调整图片,使其达到白平衡的效果。调整的表达式如下:其中 RGB是图片的像素点的三个信道值,是调整之后的图片的像素点的三个信道值。代码:im=imread(D:LenaRGB.bmp);im2=im;im1=rgb2ycbcr(im);%将 图 片 的 RGB 值 转 换 成YCbCr值%Lu=im1(:,:,1);Cb=im1(:,:,2);Cr=im1(:,:,3);x y z=size(im);tst=zeros(x,y);%计算Cb、Cr的均值Mb、Mr%Mb=mean(mean(Cb);Mr=mean(mean(Cr);%计算Cb、Cr的均方差%D
30、b=sum(sum(Cb-Mb)/(x*y);Dr=sum(sum(Cr-Mr)/(x*y);%根据阀值的要求提取出near-white区域的像素点%cnt=1;for i=1:x for j=1:y b1=Cb(i,j)-(Mb+Db*sign(Mb);b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr);if(b1abs(1.5*Db)&b2abs(1.5*Dr)Ciny(cnt)=Lu(i,j);tst(i,j)=Lu(i,j);cnt=cnt+1;end end end cnt=cnt-1;iy=sort(Ciny,descend);%将提取出的像素点从亮度值大的点到小的点依次
31、排列%nn=round(cnt/10);Ciny2(1:nn)=iy(1:nn);%提取出near-white区域中10%的亮度值较大的像素点做参考白点%提取出参考白点的RGB三信道的值%mn=min(Ciny2);for i=1:x for j=1:y if tst(i,j)mn tst(i,j)=0;else tst(i,j)=1;end end end R=im(:,:,1);G=im(:,:,2);B=im(:,:,3);R=double(R).*tst;G=double(G).*tst;B=double(B).*tst;%计算参考白点的RGB的均值%Rav=mean(mean(R);
32、Gav=mean(mean(G);Bav=mean(mean(B);Ymax=double(max(max(Lu)/15;%计算出图片的亮度的最大值%计算出RGB三信道的增益%Rgain=Ymax/Rav;Ggain=Ymax/Gav;Bgain=Ymax/Bav;%通过增益调整图片的RGB三信道%im(:,:,1)=im(:,:,1)*Rgain;im(:,:,2)=im(:,:,2)*Ggain;im(:,:,3)=im(:,:,3)*Bgain;%显示图片%subplot(1,2,1);imshow(im2),title(原图);subplot(1,2,2);imshow(im),title(白平衡后的效果图);效果图: