MATLAB图像处理(实例+代码)

合集下载

用matlab实现数字图像处理几个简单例子

用matlab实现数字图像处理几个简单例子

实验报告实验一图像的傅里叶变换(旋转性质)实验二图像的代数运算实验三filter2实现均值滤波实验四图像的缩放朱锦璐04085122实验一图像的傅里叶变换(旋转性质)一、实验内容对图(1.1)的图像做旋转,观察原图的傅里叶频谱和旋转后的傅里叶频谱的对应关系。

图(1.1)二、实验原理首先借助极坐标变换x=rcosθ,y=rsinθ,u=wcosϕ,v=wsinϕ,,将f(x,y)和F(u,v)转换为f(r,θ)和F(w,ϕ).f(x,y) <=> F(u,v)f(rcosθ,rsinθ)<=> F(wcosϕ,wsinϕ)经过变换得f( r,θ+θ。

)<=>F(w,ϕ+θ。

)上式表明,对f(x,y)旋转一个角度θ。

对应于将其傅里叶变换F(u,v)也旋转相同的角度θ。

F(u,v)到f(x,y)也是一样。

三、实验方法及程序选取一幅图像,进行离散傅里叶变换,在对其进行一定角度的旋转,进行离散傅里叶变换。

>> I=zeros(256,256); %构造原始图像I(88:168,120:136)=1; %图像范围256*256,前一值是纵向比,后一值是横向比figure(1);imshow(I); %求原始图像的傅里叶频谱J=fft2(I);F=abs(J);J1=fftshift(F);figure(2)imshow(J1,[5 50])J=imrotate(I,45,'bilinear','crop'); %将图像逆时针旋转45°figure(3);imshow(J) %求旋转后的图像的傅里叶频谱J1=fft2(J);F=abs(J1);J2=fftshift(F);figure(4)imshow(J2,[5 50])四、实验结果与分析实验结果如下图所示(1.2)原图像(1.3)傅里叶频谱(1.4)旋转45°后的图像(1.5)旋转后的傅里叶频谱以下为放大的图(1.6)原图像(1.7)傅里叶频谱(1.8)旋转45°后的图像(1.9)旋转后的傅里叶频谱由实验结果可知1、从旋转性质来考虑,图(1.8)是图(1.6)逆时针旋转45°后的图像,对比图(1.7)和图(1.9)可知,频域图像也逆时针旋转了45°2、从尺寸变换性质来考虑,如图(1.6)和图(1.7)、图(1.8)和图(1.9)可知,原图像和其傅里叶变换后的图像角度相差90°,由此可知,时域中的信号被压缩,到频域中的信号就被拉伸。

数字图像处理及matlab实现源代码【1】

数字图像处理及matlab实现源代码【1】

% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-*%{% (一)图像文件的读/写A=imread('drum.jpg'); % 读入图像imshow(A); % 显示图像imwrite(A,'drum.jpg');info=imfinfo('drum.jpg') % 查询图像文件信息% 用colorbar函数将颜色条添加到坐标轴对象中RGB=imread('drum.jpg');I=rgb2gray(RGB); % 把RGB图像转换成灰度图像h=[1 2 1;0 0 0;-1 -2 -1];I2=filter2(h,I);imshow(I2,[]);colorbar('vert') % 将颜色条添加到坐标轴对象中% wrap函数将图像作为纹理进行映射A=imread('4.jpg');imshow(A);I=rgb2gray(RGB);[x,y,z]=sphere;warp(x,y,z,I); % 用warp函数将图像作为纹理进行映射%}% subimage函数实现一个图形窗口中显示多幅图像RGB=imread('drum.jpg');I=rgb2gray(RGB);subplot(1,2,1);subimage(RGB); % subimage函数实现一个图形窗口中显示多幅图像subplot(1,2,2),subimage(I);% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-*% (二)图像处理的基本操作% ----------------图像代数运算------------------%{% imadd函数实现两幅图像的相加或给一幅图像加上一个常数% 给图像每个像素都增加亮度I=imread('4.jpg');J=imadd(I,100); % 给图像增加亮度subplot(1,2,1),imshow(I);title('原图');subplot(1,2,2),imshow(J);title('增加亮度图');%% imsubtract函数实现将一幅图像从另一个图像中减去或减去一个常数I=imread('drum.jpg');J=imsubtract(I,100); % 给图像减去亮度subplot(1,2,1),imshow(I);%% immultiply实现两幅图像的相乘或者一幅图像的亮度缩放I=imread('drum.jpg');J=immultiply(I,2); % 进行亮度缩放subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%% imdivide函数实现两幅图像的除法或一幅图像的亮度缩放I=imread('4.jpg');J=imdivide(I,0.5); % 图像的亮度缩放subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%}% ----------------图像的空间域操作------------------%{% imresize函数实现图像的缩放J=imread('4.jpg');subplot(1,2,1),imshow(J);title('原图');X1=imresize(J,0.2); % 对图像进行缩放subplot(1,2,2),imshow(X1);title('缩放图');%% imrotate函数实现图像的旋转I=imread('drum.jpg');J=imrotate(I,50,'bilinear'); % 对图像进行旋转subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%% imcrop函数实现图像的剪切I=imread('drum.jpg');I2=imcrop(I,[1 100 130 112]); % 对图像进行剪切subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(I2);%}% ----------------特定区域处理------------------%{% roipoly函数用于选择图像中的多边形区域I=imread('4.jpg');c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];BW=roipoly(I,c,r); % roipoly函数选择图像中的多边形区域subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(BW);%% roicolor函数式对RGB图像和灰度图像实现按灰度或亮度值选择区域进行处理a=imread('4.jpg');subplot(2,2,1),imshow(a);I=rgb2gray(a);BW=roicolor(I,128,225); % 按灰度值选择的区域subplot(2,2,4),imshow(BW);%% ploy2mask 函数转化指定的多边形区域为二值掩模x=[63 186 54 190 63];y=[60 60 209 204 601];bw=poly2mask(x,y,256,256); % 转化指定的多边形区域为二值掩模imshow(bw);hold onplot(x,y,'r','LineWidth',2);hold off%% roifilt2函数实现区域滤波a=imread('4.jpg');I=rgb2gray(a);c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];BW=roipoly(I,c,r); % roipoly函数选择图像中的多边形区域h=fspecial('unsharp');J=roifilt2(h,I,BW); % 区域滤波subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%% roifill函数实现对特定区域进行填充a=imread('4.jpg');I=rgb2gray(a);c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];J=roifill(I,c,r); % 对特定区域进行填充subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%}% ----------------图像变换------------------%{% fft2 和ifft2函数分别是计算二维的快速傅里叶变换和反变换f=zeros(100,100);subplot(1,2,1);imshow(f);f(20:70,40:60)=1;subplot(1,2,2);imshow(f);F=fft2(f); % 计算二维的快速傅里叶变换F2=log(abs(F));% 对幅值对对数figure;subplot(1,2,1),imshow(F),colorbar;subplot(1,2,2),imshow(F2),colorbar;%% fftsshift 函数实现了补零操作和改变图像显示象限f=zeros(100,100);subplot(2,2,1),imshow(f);title('f')f(10:70,40:60)=1;subplot(2,2,2),imshow(f);title('f取后')F=fft2(f,256,256);subplot(2,2,3),imshow(F);title('F')F2=fftshift(F); % 实现补零操作subplot(2,2,4),imshow(F2);title('F2')figure,imshow(log(abs(F2)));title('log(|F2|)')%% dct2 函数采用基于快速傅里叶变换的算法,用于实现较大输入矩阵的离散余弦变换% idct2 函数实现图像的二维逆离散余弦变换RGB=imread('drum.jpg');I=rgb2gray(RGB);J=dct2(I); % 对I进行离散余弦变换imshow(log(abs(J))),title('对原图离散后取对数'),colorbar;J(abs(J)<10)=0;K=idct2(J); % 图像的二维逆离散余弦变换figure,imshow(I),title('原灰度图')figure,imshow(K,[0,255]);title('逆离散变换');%% dctmtx 函数用于实现较小输入矩阵的离散余弦变figure;RGB=imread('4.jpg');I=rgb2gray(RGB);subplot(3,2,1),imshow(I),title('原灰度图');I=im2double(I);subplot(3,2,2),imshow(I),title('取双精度后');T=dctmtx(8); % 离散余弦变换subplot(3,2,3),imshow(I),title('离散余弦变换后');B=blkproc(I,[8,8],'P1*x*P2',T,T');subplot(3,2,4),imshow(B),title('blkproc作用I后的B');mask=[ 1 1 1 1 0 0 0 01 1 1 0 0 0 0 01 1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0 ];B2=blkproc(B,[8,8],'P1.*x',mask);subplot(3,2,5),imshow(B2),title('blkproc作用B后的B2');I2=blkproc(B2,[8,8],'P1*x*P2',T',T);subplot(3,2,6),imshow(I2),title('blkproc作用B2后的I2');%% edge函数用于提取图像的边缘RGB=imread('4.jpg');I=rgb2gray(RGB);BW=edge(I);imshow(I);figure,imshow(BW);%% radon 函数用来计算指定方向上图像矩阵的投影RGB=imread('4.jpg');I=rgb2gray(RGB);BW=edge(I);theta=0:179;[R,XP]=radon(BW,theta); % 图像矩阵的投影figure,imagesc(theta,XP,R);colormap(hot);xlabel('\theta(degrees)');ylabel('x\prime');title('R_{\theta}(x\prime)');colorbar;%}% ----------------图像增强、分割和编码------------------%{% imhist 函数产生图像的直方图A=imread('4.jpg');B=rgb2gray(A);subplot(2,1,1),imshow(B);subplot(2,1,2),imhist(B);%% histeq 函数用于对图像的直方图均衡化A=imread('4.jpg');B=rgb2gray(A);subplot(2,1,1),imshow(B);subplot(2,1,2),imhist(B);C=histeq(B); % 对图像B进行均衡化figure;subplot(2,1,1),imshow(C);subplot(2,1,2),imhist(C);%% filter2 函数实现均值滤波a=imread('4.jpg');I=rgb2gray(a);subplot(2,2,1),imshow(I);K1=filter2(fspecial('average',3),I)/255; % 3*3的均值滤波K2=filter2(fspecial('average',5),I)/255; % 5*5的均值滤波K3=filter2(fspecial('average',7),I)/255; % 7*7的均值滤波subplot(2,2,2),imshow(K1);subplot(2,2,3),imshow(K2);subplot(2,2,4),imshow(K3);%% wiener2 函数实现Wiener(维纳)滤波a=imread('4.jpg');I=rgb2gray(a);subplot(2,2,1),imshow(I);K1=wiener2(I,[3,3]); % 3*3 wiener滤波K2=wiener2(I,[5,5]); % 5*5 wiener滤波K3=wiener2(I,[7,7]); % 7*7 wiener滤波subplot(2,2,2),imshow(K1);subplot(2,2,3),imshow(K2);subplot(2,2,4),imshow(K3);%% medfilt2 函数实现中值滤波a=imread('4.jpg');I=rgb2gray(a);subplot(2,2,1),imshow(I);K1=medfilt2(I,[3,3]); % 3*3 中值滤波K2=medfilt2(I,[5,5]); % 5*5 中值滤波K3=medfilt2(I,[7,7]); % 7*7 中值滤波subplot(2,2,2),imshow(K1);subplot(2,2,3),imshow(K2);subplot(2,2,4),imshow(K3);%}% ----------------图像模糊及复原------------------%{% deconvwnr 函数:使用维纳滤波器I=imread('qier.jpg');imshow(I);% 对图像进行模糊处理LEN=31;THETA=11;PSF1=fspecial('motion',LEN,THETA); % 运动模糊PSF2=fspecial('gaussian',10,5); % 高斯模糊Blurred1=imfilter(I,PSF1,'circular','conv'); % 得到运动模糊图像Blurred2=imfilter(I,PSF2,'conv'); % 得到高斯噪声模糊图像figure;subplot(1,2,1);imshow(Blurred1);title('Blurred1--"motion"'); subplot(1,2,2);imshow(Blurred2);title('Blurred2--"gaussian"');% 对模糊图像加噪声V=0.002;BlurredNoisy1=imnoise(Blurred1,'gaussian',0,V); % 加高斯噪声BlurredNoisy2=imnoise(Blurred2,'gaussian',0,V); % 加高斯噪声figure;subplot(1,2,1);imshow(BlurredNoisy1);title('BlurredNoisy1'); subplot(1,2,2);imshow(BlurredNoisy2);title('BlurredNoisy2');% 进行维纳滤波wnr1=deconvwnr(Blurred1,PSF1); % 维纳滤波wnr2=deconvwnr(Blurred2,PSF2); % 维纳滤波figure;subplot(1,2,1);imshow(wnr1);title('Restored1,True PSF'); subplot(1,2,2);imshow(wnr2);title('Restored2,True PSF');%% deconvreg函数:使用约束最小二乘滤波器I=imread('qier.jpg');imshow(I);% 对图像进行模糊处理LEN=31;THETA=11;PSF1=fspecial('motion',LEN,THETA); % 运动模糊PSF2=fspecial('gaussian',10,5); % 高斯模糊Blurred1=imfilter(I,PSF1,'circular','conv'); % 得到运动模糊图像Blurred2=imfilter(I,PSF2,'conv'); % 得到高斯噪声模糊图像figure;subplot(1,2,1);imshow(Blurred1);title('Blurred1--"motion"');subplot(1,2,2);imshow(Blurred2);title('Blurred2--"gaussian"');% 对模糊图像加噪声V=0.002;BlurredNoisy1=imnoise(Blurred1,'gaussian',0,V); % 加高斯噪声BlurredNoisy2=imnoise(Blurred2,'gaussian',0,V); % 加高斯噪声figure;subplot(1,2,1);imshow(BlurredNoisy1);title('BlurredNoisy1');subplot(1,2,2);imshow(BlurredNoisy2);title('BlurredNoisy2');NP=V*prod(size(I));reg1=deconvreg(BlurredNoisy1,PSF1,NP); % 约束最小二乘滤波reg2=deconvreg(BlurredNoisy2,PSF2,NP); % 约束最小二乘滤波figure;subplot(1,2,1);imshow(reg1);title('Restored1 with NP');subplot(1,2,2);imshow(reg2);title('Restored2 with NP');%% deconvlucy函数:使用Lucy-Richardson滤波器I=imread('qier.jpg');imshow(I);% 对图像进行模糊处理LEN=31;THETA=11;PSF1=fspecial('motion',LEN,THETA); % 运动模糊PSF2=fspecial('gaussian',10,5); % 高斯模糊Blurred1=imfilter(I,PSF1,'circular','conv'); % 得到运动模糊图像Blurred2=imfilter(I,PSF2,'conv'); % 得到高斯噪声模糊图像figure;subplot(1,2,1);imshow(Blurred1);title('Blurred1--"motion"');subplot(1,2,2);imshow(Blurred2);title('Blurred2--"gaussian"');% 对模糊图像加噪声V=0.002;BlurredNoisy1=imnoise(Blurred1,'gaussian',0,V); % 加高斯噪声BlurredNoisy2=imnoise(Blurred2,'gaussian',0,V); % 加高斯噪声figure;subplot(1,2,1);imshow(BlurredNoisy1);title('BlurredNoisy1');subplot(1,2,2);imshow(BlurredNoisy2);title('BlurredNoisy2');luc1=deconvlucy(BlurredNoisy1,PSF1,5); % 使用Lucy-Richardson滤波luc2=deconvlucy(BlurredNoisy1,PSF1,15); % 使用Lucy-Richardson滤波figure;subplot(1,2,1);imshow(luc1);title('Restored Image,NUMIT=5'); subplot(1,2,2);imshow(luc2);title('Restored Image,NUMIT=15');%}% deconvblind 函数:使用盲卷积算法a=imread('4.jpg');I=rgb2gray(a);figure;imshow(I);title('Original Image');PSF=fspecial('motion',13,45); % 运动模糊figure;imshow(PSF);Blurred=imfilter(I,PSF,'circ','conv'); % 得到运动模糊图像figure;imshow(Blurred);title('Blurred Image');INITPSF=ones(size(PSF));[J,P]=deconvblind(Blurred,INITPSF,30); % 使用盲卷积figure;imshow(J);figure;imshow(P,[],'notruesize');% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-* %{% 对图像进行减采样a=imread('lena.jpg');%subplot(1,4,1);figure;imshow(a);title('原图');b=rgb2gray(a);%subplot(1,4,2);figure;imshow(b);title('原图的灰度图');[wid,hei]=size(b);%---4倍减采样----quartimg=zeros(wid/2+1,hei/2+1);i1=1;j1=1;for i=1:2:widfor j=1:2:heiquartimg(i1,j1)=b(i,j);j1=j1+1;endi1=i1+1;j1=1;end%subplot(1,4,3);figure;imshow(uint8(quartimg));title('4倍减采样')% ---16倍减采样---quanrtimg=zeros(wid/4+1,hei/4+1);i1=1;j1=1;for i=1:4:widfor j=1:4:heiquanrtimg(i1,j1)=b(i,j);j1=j1+1;endi1=i1+1;j1=1;end%subplot(1,4,4);.figure;imshow(uint8(quanrtimg));title('16倍减采样');%}% 图像类型% 将图像转换为256级灰度图像,64级灰度图像,32级灰度图像,8级灰度图像,2级灰度图像a=imread('4.jpg');%figure;subplot(2,3,1);imshow(a);title('原图');b=rgb2gray(a); % 这是256灰度级的图像%figure;subplot(2,3,2);imshow(b);title('原图的灰度图像');[wid,hei]=size(b);img64=zeros(wid,hei);img32=zeros(wid,hei);img8=zeros(wid,hei);img2=zeros(wid,hei);for i=1:widfor j=j:heiimg64(i,j)=floor(b(i,j)/4); % 转化为64灰度级endend%figure;subplot(2,3,3);imshow(uint8(img64),[0,63]);title('64级灰度图像');for i=1:widfor j=1:heiimg32(i,j)=floor(b(i,j)/8);% 转化为32灰度级endend%figure;subplot(2,3,4);imshow(uint8(img32),[0,31]);title('32级灰度图像');for i=1:widfor j=1:heiimg8(i,j)=floor(b(i,j)/32);% 转化为8灰度级endend%figure;subplot(2,3,5);imshow(uint8(img8),[0,7]);title('8级灰度图像');for i=1:widfor j=1:heiimg2(i,j)=floor(b(i,j)/128);% 转化为2灰度级endend%figure;subplot(2,3,6);imshow(uint8(img2),[0,1]);title('2级灰度图像');% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-* %{% ------------------ 图像的点运算------------------I=imread('lena.jpg');figure;subplot(1,3,1);imshow(I);title('原图的灰度图');J=imadjust(I,[0.3;0.6],[0.1;0.9]); % 设置灰度变换的范围subplot(1,3,2);imshow(J);title('线性扩展');I1=double(I); % 将图像转换为double类型I2=I1/255; % 归一化此图像C=2; % 非线性扩展函数的参数K=C*log(1+I2); % 对图像的对数变换subplot(1,3,3);imshow(K);title('非线性扩展');M=255-I;figure;subplot(1,3,1);imshow(M);title('灰度倒置');N1=im2bw(I,0.4); % 将此图像二值化,阈值为0.4N2=im2bw(I,0.7); % 将此图像二值化,阈值为0.7 subplot(1,3,2);imshow(N1);title('二值化阈值0.4');subplot(1,3,3);imshow(N2);title('二值化阈值0.7');%}%{% ------------------ 图像的代数运算------------------% 将两幅图像进行加法运算I=imread('lena.jpg');I=rgb2gray(I);J=imread('rice.png');% 以下把两幅图转化为大小一样for i=1:size(I)for j=size(J):size(I)J(i,j)=0;endendI=im2double(I); % 将图像转化为double型J=im2double(J);% imshow(I);figure;imshow(J);K=I+0.3*J; % 将两幅图像相加subplot(1,3,1);imshow(I);title('人物图');subplot(1,3,2);imshow(J);title('背景图');subplot(1,3,3);imshow(K);title('相加后的图');imwrite(K,'i_lena1.jpg');%%% 将两幅图像做减运算,分离背景与原图A=imread('i_lena1.jpg');B=imread('rice.png');% 以下把两幅图转化为大小一样for i=1:size(A)for j=size(B):size(A)B(i,j)=0;endendC=A-0.3*B;a=imread('lena.jpg');subplot(2,2,1);imshow(a);title('原图图');subplot(2,2,2);imshow(A);title('混合图');subplot(2,2,3);imshow(B);title('背景图');subplot(2,2,4);imshow(C);title('分离后的图');%% 设置掩模,需要保留下来的区域,掩模图像的值为1,否则为0 A=imread('drum.jpg');A=rgb2gray(A);A=im2double(A);sizeA=size(A);subplot(1,2,1);imshow(A);title('原图');B=zeros(sizeA(1),sizeA(2)); % 设置模板B(100:400,100:500)=1;K=A.*B; % 两幅图像相乘subplot(1,2,2);imshow(K);title('局部图');%}%{% ------------------ 图像的缩放------------------A=imread('drum.jpg');B1=imresize(A,1.5); % 比例放大1.5杯,默认采用的是最近邻法进行线性插值B2=imresize(A,[420 384]); % 非比例放大到420:384C1=imresize(A,0.7); % 比例缩小0.7倍C2=imresize(A,[150 180]); % 非比例缩小到150:180figure;imshow(B1);title('比例放大图');figure;imshow(B2);title('非比例放大图');figure;imshow(C1);title('比例缩小图');figure;imshow(C2);title('非比例缩小图');% 检测非比例缩放得到的图片是否能还原到原图a=size(A)d=imresize(C2,[a(1),a(2)]);figure;imshow(d);%}% ------------------ 图像的旋转------------------I=imread('drum.jpg');J=imrotate(I,45); % 图像进行逆时针旋转,默认采用最近邻插值法进行插值处理K=imrotate(I,90); % 默认旋转出界的部分不被截出subplot(1,3,1);imshow(I);subplot(1,3,2);imshow(J);subplot(1,3,3);imshow(K);% 检测旋转后的图像是否失真P=imrotate(K,270);figure;imshow(P);。

matlab图像处理各种程序代码

matlab图像处理各种程序代码

图像变换(傅立叶变换), 图像增强, 边缘检测, 滤波, 图像压缩等.实验工具:MA TLAB软件课程设计时间:2008年12月实验部分1. 图像变换程序代码及说明clear allN=100;f=zeros(50,50); %产生一个50*50的全0数组f(15:35,23:28)=1;%定义图像数组,从15行到35行,23列到28列附值为1,为白色,其他区域为黑色figure(1) %创建窗口的图形对象,句柄为1imshow(f,'notruesize') %显示图像fF=fft2(f,N,N); %在二维傅立叶变换前把f截断或者添加0,使其成为N*N的数组F2=fftshift(abs(F)); %把傅立叶变换的零频率部分移到频谱的中间figure(2)x=1:N;y=1:N; %定义x和y的范围mesh(x,y,F2(x,y));colormap(gray);colorbar%绘制立体网状图,将图形对象的色度改为灰度图像,colorbar给坐标轴添加色彩条%构建一个类似于figure(1)的矩形函数N=200;f=zeros(100,100);f(30:70,45:55)=1;%定义图像数组,从30行到70行,45列到55列附值为1,为白色,其他区域为黑色imshow(f,'notruesize');%然后对f进行二维快速傅立叶变换:以下列出你自己编写的代码…N=200;f=zeros(100,100);f(30:70,45:55)=1;imshow(f,'notruesize');title('原始图像');F=fft2(f,N,N); %对图像f进行二维快速傅立叶变换grid on %打开网格线axis on %打开坐标轴imshow(F,[-1,5],'notruesize'); %显示傅立叶变换后的图像,图像数据的值域为[-1,5] x=1:N;y=1:N;title('二维快速傅立叶变换后的图像');mesh(abs(F)); %绘制F的频谱图title('傅立叶变换后的频谱图');%然后对上述二维快速傅立叶变换提高分辨率:要提高二维快速傅立叶变换的分辨率,在采样率一定的情况下,增大采样点数N即可。

(完整版)数字图像处理MATLAB程序【完整版】

(完整版)数字图像处理MATLAB程序【完整版】

第一部分数字图像处理实验一图像的点运算实验1.1 直方图一.实验目的1.熟悉matlab图像处理工具箱及直方图函数的使用;2.理解和掌握直方图原理和方法;二.实验设备1.PC机一台;2.软件matlab。

三.程序设计在matlab环境中,程序首先读取图像,然后调用直方图函数,设置相关参数,再输出处理后的图像。

I=imread('cameraman.tif');%读取图像subplot(1,2,1),imshow(I) %输出图像title('原始图像') %在原始图像中加标题subplot(1,2,2),imhist(I) %输出原图直方图title('原始图像直方图') %在原图直方图上加标题四.实验步骤1. 启动matlab双击桌面matlab图标启动matlab环境;2. 在matlab命令窗口中输入相应程序。

书写程序时,首先读取图像,一般调用matlab自带的图像,如:cameraman图像;再调用相应的直方图函数,设置参数;最后输出处理后的图像;3.浏览源程序并理解含义;4.运行,观察显示结果;5.结束运行,退出;五.实验结果观察图像matlab环境下的直方图分布。

(a)原始图像 (b)原始图像直方图六.实验报告要求1、给出实验原理过程及实现代码;2、输入一幅灰度图像,给出其灰度直方图结果,并进行灰度直方图分布原理分析。

实验1.2 灰度均衡一.实验目的1.熟悉matlab图像处理工具箱中灰度均衡函数的使用;2.理解和掌握灰度均衡原理和实现方法;二.实验设备1.PC机一台;2.软件matlab;三.程序设计在matlab环境中,程序首先读取图像,然后调用灰度均衡函数,设置相关参数,再输出处理后的图像。

I=imread('cameraman.tif');%读取图像subplot(2,2,1),imshow(I) %输出图像title('原始图像') %在原始图像中加标题subplot(2,2,3),imhist(I) %输出原图直方图title('原始图像直方图') %在原图直方图上加标题a=histeq(I,256); %直方图均衡化,灰度级为256subplot(2,2,2),imshow(a) %输出均衡化后图像title('均衡化后图像') %在均衡化后图像中加标题subplot(2,2,4),imhist(a) %输出均衡化后直方图title('均衡化后图像直方图') %在均衡化后直方图上加标题四.实验步骤1. 启动matlab双击桌面matlab图标启动matlab环境;2. 在matlab命令窗口中输入相应程序。

Matlab在图像处理中的应用与技巧

Matlab在图像处理中的应用与技巧

Matlab在图像处理中的应用与技巧引言图像处理是计算机科学领域中的一个重要分支,通过对图像进行处理和分析,可以获得许多有价值的信息。

而MATLAB作为一个强大的计算软件,具备了丰富的图像处理函数和工具箱,可以帮助我们实现各种复杂的图像处理任务。

本文将介绍MATLAB在图像处理中的应用与技巧,帮助读者更好地利用MATLAB进行图像处理。

一、图像的读取与显示在MATLAB中,可以使用imread函数读取图像文件。

例如,要读取一张名为"image.jpg"的图像文件,可以使用以下代码:```MATLABimage = imread('image.jpg');```而imshow函数则可以将图像显示在窗口中,例如:```MATLABimshow(image);```通过这两个简单的函数,我们可以很方便地读取和显示图像。

二、图像的基本处理1.图像的缩放在图像处理过程中,经常需要将图像进行缩放。

MATLAB提供了imresize函数来实现图像的缩放,例如:```MATLABnew_image = imresize(image, [height, width]);```其中,height和width分别表示缩放后图像的高度和宽度。

2.图像的灰度化有时候我们只关注图像的亮度信息,而忽略了彩色信息。

此时可以将图像转换为灰度图像,MATLAB提供了rgb2gray函数来实现图像的灰度化,例如:```MATLABgray_image = rgb2gray(image);```gray_image即为灰度图像。

3.图像的旋转有时候我们需要将图像进行旋转,MATLAB提供了imrotate函数来实现图像的旋转,例如:```MATLABrotated_image = imrotate(image, angle);```其中,angle表示旋转的角度。

三、图像的增强处理1.图像的边缘检测在许多图像处理任务中,边缘是重要的特征之一。

利用Matlab进行图像处理与图像识别的实例

利用Matlab进行图像处理与图像识别的实例

利用Matlab进行图像处理与图像识别的实例引言:在现代科技的发展中,图像处理和图像识别成为了热门的研究领域。

利用计算机视觉技术对图像进行处理和分析,可以广泛应用于医学影像、安防监控、人脸识别等领域。

而Matlab作为一款功能强大的科学计算软件,提供了丰富的图像处理和识别工具箱,极大地便利了研究者在图像领域的工作。

本文将通过几个实例来介绍如何利用Matlab进行图像处理和图像识别。

一、Matlab中的图像处理工具箱Matlab提供了大量的图像处理函数和工具箱,方便用户进行图像的处理和分析。

其中,图像处理工具箱是最常用的一部分。

通过该工具箱,用户可以对图像进行滤波、增强、分割等操作。

例如,可以用imfilter函数进行均值滤波,用imadjust函数对图像进行直方图均衡化。

图像处理工具箱的使用非常简单,只需要调用相应的函数并传入参数即可。

二、实例1:图像滤波图像滤波是图像处理中常用的操作之一。

通过滤波可以去除图像中的噪声或者增强图像的细节。

在Matlab中,可以使用不同的滤波函数来实现不同的效果。

下面以均值滤波和中值滤波为例来介绍。

1. 均值滤波均值滤波是一种简单的线性滤波方法。

在Matlab中,可以使用imfilter函数来进行均值滤波。

例如,对一张灰度图像进行均值滤波的代码如下:```img = imread('image.jpg');h = fspecial('average', [3 3]);filtered_img = imfilter(img, h, 'replicate');```上述代码中,imread函数用于读取图像,fspecial函数用于创建一个3x3的均值滤波模板,imfilter函数用于对图像进行滤波操作。

'replicate'参数表示在边界处使用边界像素值进行补充。

2. 中值滤波中值滤波是一种非线性滤波方法,常用于去除椒盐噪声。

matlab图像处理基础实例

matlab图像处理基础实例

matlab图像处理基础实例·边缘检测(edge)边缘检测时先要把其他格式图像转化为灰度图像>> f=imread('');>> a=rgb2gray(f);>> [g,t]=edge(a,'canny');>> imshow(g)·剪贴(imcrop)、subplot等imfinfo colormap subimageimadd imsubtract immultiply imdivide imresize imrotate(旋转)>> a=imread('');>> b=imcrop(a,[75 68 130 112]);% I2 = IMCROP(I,RECT)% RECT is a 4-element vector with the form [XMIN YMIN WIDTH HEIGHT]; % subplot(121)⼀⾏两列的显⽰,当前显⽰第⼀个图⽚>> subplot(121);imshow(a);>> subplot(122);imshow(b);·roipoly选择图像中的多边形区域>> a=imread('');>> c=[200 250 278 248 199 172];>> r=[21 21 75 121 121 75];>> b=roipoly(a,c,r);>> subplot(121);imshow(a);>> subplot(122);imshow(b);·roicolor按灰度值选择的区域>> a=imread('');>> i=rgb2gray(a);>> b=roicolor(i,128,255);>> subplot(121);imshow(a);>> subplot(122);imshow(b);·转化指定的多边形区域为⼆值掩膜poly2mask>> x=[63 186 54 190 63];>> y=[60 60 209 204 60];>> b=poly2mask(x,y,256,256); >> imshow(b);>> holdCurrent plot held>> plot(x,y,'b','LineWidth',2)·roifilt2区域滤波a=imread('');i=rgb2gray(a);c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];b=roipoly(i,c,r);h=fspecial('unsharp');j=roifilt2(h,i,b);subplot(121),imshow(i);subplot(122),imshow(j);·roifill区域填充>> a=imread('');>> i=rgb2gray(a);>> c=[200 250 278 248 199 172]; >> r=[21 21 75 121 121 75]; >> j=roifill(i,c,r); >> subplot(211);imshow(i);>> subplot(212);imshow(j);·FFT变换f=zeros(100,100);f(20:70,40:60)=1;imshow(f);F=fft2(f);F2=log(abs(F));imshow(F2),colorbar·补零操作和改变图像的显⽰象限f=zeros(100,100);f(20:70,40:60)=1;subplot(121);imshow(f);F=fft2(f,256,256);F2=fftshift(F);subplot(122);imshow(log(abs(F2)))·离散余弦变换(dct)>> a=imread('');>> i=rgb2gray(a);>> j=dct2(i);>> subplot(131);imshow(log(abs(j))),colorbar >> j(abs(j)<10)=0;>> k=idct2(j);>> subplot(132);imshow(i);>> subplot(133);imshow(k,[0,255]);info=imfinfo('')%显⽰图像信息·edge提取图像的边缘canny prewitt sobelradon函数⽤来计算指定⽅向上图像矩阵的投影>> a=imread('');>> i=rgb2gray(a);>> b=edge(i);>> theta=0:179;>> [r,xp]=radon(b,theta);>> figure,imagesc(theta,xp,r);colormap(hot); >> xlabel('\theta(degrees)'); >> ylabel('x\prime');>> title('r_{\theta}(x\prime)');>> colorbar·filter2均值滤波>> a=imread('');>> i=rgb2gray(a);>> imshow(i)>> k1=filter2(fspecial('average',3),i)/255;%3*3 >> k2=filter2(fspecial('average',5),i)/255;%5*5 >> k3=filter2(fspecial('average',7),i)/255;%7*7 >> figure,imshow(k1)>> figure,imshow(k2)>> figure,imshow(k3)wiener2滤波eg:k=wiener(I,[3,3]))medfilt2中值滤波同上deconvwnr维纳滤波马赫带效应(同等差⾊带条)·减采样>> a=imread('');>> b=rgb2gray(a);>> [wid,hei]=size(b);>> quarting=zeros(wid/2+1,hei/2+1); >> i1=1;j1=1;>> for i=1:2:widfor j=1:2:heiquarting(i1,j1)=b(i,j);j1=j1+1;endi1=i1+1;j1=1;end>> figure>> imshow(uint8(quarting))>> title('4倍减采样')>> quarting=zeros(wid/4+1,hei/4+1); i1=1;j1=1;for i=1:4:widfor j=1:4:heiquarting(i1,j1)=b(i,j);j1=j1+1;endi1=i1+1;j1=1;end>> figure,imshow(uint8(quarting)); title('16倍减采样')结论:在采⽤不同的减采样过程中,其图像的清晰度和尺⼨均发⽣了变化灰度级转化>> a=imread('');>> b=rgb2gray(a);>> figure;imshow(b)>> [wid,hei]=size(b);>> img2=zeros(wid,hei);>> for i=1:widfor j=1:heiimg2(i,j)=floor(b(i,j)/128);endend>> figure;imshow(uint8(img2),[0,2]) %2级灰度图像图像的基本运算>> i=imread('');>> figure;subplot(231);imshow(i);>> title('原图');>> j=imadjust(i,[.3;.6],[.1 .9]);%Adjust image intensity values or colormap图像灰度值或colormap调整% J = IMADJUST(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT])>> subplot(232);imshow(j);title('线性扩展');>> i1=double(i);i2=i1/255;c=2;k=c*log(1+i2);>> subplot(233);imshow(k);>> title('⾮线性扩展');>> m=255-i;>> subplot(234);imshow(m)>> title('灰度倒置')>> n1=im2bw(i,.4);n2=im2bw(i,.7);>> subplot(235);imshow(n1);title('⼆值化阈值')>> subplot(236);imshow(n2);title('⼆值化阈值')图像的代数运算加。

MATLAB图像处理技术与实例展示

MATLAB图像处理技术与实例展示

MATLAB图像处理技术与实例展示引言图像处理是一门涉及数字图像处理和计算机视觉的重要学科,它在日常生活中的应用范围非常广泛。

MATLAB作为一种强大的数值计算和可视化工具,提供了许多图像处理的函数和工具箱,能够帮助实现各种图像处理任务。

本文将介绍一些常用的MATLAB图像处理技术,并提供相应的实例展示。

一、图像加噪与去噪图像加噪是指在原始图像上添加一些随机扰动,使原始图像的细节模糊或失真。

在实际应用中,图像往往会受到各种因素的影响,如传感器噪声、压缩噪声等。

为了恢复原始图像的质量,需要进行去噪处理。

MATLAB提供了许多图像加噪和去噪的函数和工具箱。

例如,使用imnoise函数可以在图像上添加高斯噪声、椒盐噪声等。

而使用imnlmfilt函数可以实现非局部均值去噪算法,通过对邻域像素的均值进行补偿,可以有效降低噪声。

实例展示:下面以一个简单的实例展示图像去噪的过程。

首先,我们使用imnoise函数在一张原始图像上添加高斯噪声:```MATLABI = imread('original_image.jpg');noisy_image = imnoise(I, 'gaussian', 0, 0.02);```然后,我们使用imnlmfilt函数对添加噪声的图像进行去噪处理:```MATLABdenoised_image = imnlmfilt(noisy_image);```最后,我们可以将原始图像、添加噪声的图像和去噪后的图像进行对比,以评估去噪效果。

二、图像增强图像增强是指通过一系列的处理方法,改善图像的质量和视觉效果,使图像更加清晰、鲜艳。

图像增强的方法有很多,其中包括直方图均衡化、对比度增强、锐化等。

在MATLAB中,可以使用histeq函数实现直方图均衡化,通过重新分布图像灰度级的分布,增强图像的对比度和细节。

而使用imadjust函数可以进行对比度增强,通过调整图像对比度和亮度来增强图像的视觉效果。

图像处理实例(含Matlab代码)

图像处理实例(含Matlab代码)

1. 图像一的细胞计数
将该图形进行一系列处理,计算得到途中清晰可见细胞的个数。 转为灰度图,二值化,中值滤波,图像取反,计数,再次中值滤 波,再次计数
1. 图像一的细胞计数
clear;close all; Image = imread('1.jpg'); figure,imshow(Image),title('原图'); Image=rgb2gray(Image); figure,imshow(Image),title('灰度图'); Theshold = graythresh(Image); Image_BW = im2bw(Image,Theshold); Reverse_Image_BW22=~Image_BW; figure,imshow(Image_BW),title('二值化图像'); Image_BW_medfilt= medfilt2(Image_BW,[3 3]); figure,imshow(Image_BW_medfilt),title('中值滤波后的二值化图像'); Reverse_Image_BW = ~Image_BW_medfilt; figure,imshow(Reverse_Image_BW),title('图象取反'); Image_BW_medfilt2= medfilt2(Reverse_Image_BW,[20 20]); figure,imshow(Image_BW_medfilt2),title('第二次中值滤波的二值化图像'); [Label, Number]=bwlabel(Image_BW_medfilt,8);Number [Label, Number]=bwlabel(Image_BW_medfilt2,8);Number

matlab图像处理的几个实例

matlab图像处理的几个实例

Matlab图像处理的几个实例(初学者用)1.图像的基本信息及其加减乘除clear,clc;P=imread('yjx.jpg');whos PQ=imread('dt.jpg');P=im2double(P);Q=im2double(Q);gg1=im2bw(P,0.3);gg2=im2bw(P,0.5);gg3=im2bw(P,0.8);K=imadd(gg1,gg2);L=imsubtract(gg2,gg3);cf=immultiply(P,Q);sf=imdivide(Q,P);subplot(421),imshow(P),title('郁金香原图');subplot(422),imshow(gg1),title('0.3');subplot(423),imshow(gg2),title('0.5');subplot(424),imshow(gg3),title('0.8');subplot(425),imshow(K),title('0.3+0.5');subplot(426),imshow(L),title('0.5-0.3');subplot(427),imshow(cf),title('P*Q');subplot(428),imshow(sf),title('P/Q');2.图像缩放clear,clc;I=imread('dt.jpg');A=imresize(I,0.1,'nearest');B=imresize(I,0.4,'bilinear');C=imresize(I,0.7,'bicubic');D=imresize(I,[100,200]);F=imresize(I,[400,100]);figuresubplot(321),imshow(I),title('原图');subplot(322),imshow(A),title('最邻近插值');subplot(323),imshow(B),title('双线性插值');subplot(324),imshow(C),title('二次立方插值');subplot(325),imshow(D),title('水平缩放与垂直缩放比例为2:1'); subplot(326),imshow(F),title('水平缩放与垂直缩放比例为1:4');灰度变换、直方图变换clear,clc;fg=imread('fg.jpg');zl=imread('zl.jpg');hfg=rgb2gray(fg);fg1=double(hfg);out1=255*(fg1/255).^0.7;out1(find(out1>255))=255;fg1=uint8(fg1);out1=uint8(out1);img=rgb2gray(zl);[harm,x]=imhist(img);J=histeq(hfg,harm);figuresubplot(421),imshow(fg1),title('复古灰度图');subplot(422),imhist(fg1),title('复古灰度图的直方图');subplot(423),imshow(out1),title('对复古灰度图像进行幂次变换'); subplot(424),imhist(out1),title('幂次变换图像的直方图');subplot(425),imshow(img),title('朱莉');subplot(426),imhist(img),title('朱莉图像对应的直方图');subplot(427),imshow(J),title('直方图变换后的复古图');subplot(428),imhist(J),title('直方图变换后的复古图对应的直方图');傅里叶变换、频域滤波1.傅里叶变换clear,clc;rgb=imread('zl.jpg');rgb=imresize(rgb,0.7,'bilinear');rgb=im2double(rgb);fR=rgb(:,:,1);fG=rgb(:,:,2);fB=rgb(:,:,3);flyfR=fft2(fR);flyfG=fft2(fG);flyfB=fft2(fB);Frgb(:,:,1)=flyfR;Frgb(:,:,2)=flyfG;Frgb(:,:,3)=flyfB;tzR=fftshift(flyfR);tzG=fftshift(flyfG);tzB=fftshift(flyfB);tzF(:,:,1)=tzR;tzF(:,:,2)=tzG;tzF(:,:,3)=tzB;iflyfR=ifft2(flyfR);iflyfG=ifft2(flyfG);iflyfB=ifft2(flyfB);out(:,:,1)=iflyfR;out(:,:,2)=iflyfG;out(:,:,3)=iflyfB;figuresubplot(221),imshow(rgb),title('原图');subplot(222),imshow(Frgb),title('图像频谱');subplot(223),imshow(tzF),title('调整中心后的图像频谱'); subplot(224),imshow(out),title('逆变换得到的原图');2.频域滤波clear,clc;I=rgb2gray(imread('ml.jpg'));J=imnoise(I,'gaussian',0.1);Jzz1=medfilt2(J,[3 3]);Jzz2=medfilt2(J,[10 10]);XJ=imnoise(I,'salt & pepper');f=im2double(XJ);g=fft2(f);g=fftshift(g);[M,N]=size(g);nn=2;d0=50;m=fix(M/2);n=fix(M/2);for i=1:Mfor j=1:Nd=sqrt((i-m)^2+(j-n)^2);h1=1/(1+0.414*(d/d0)^(2*nn));result1(i,j)=h1*g(i,j);endendresult1=ifftshift(result1);J2=ifft2(result1);J3=im2uint8(real(J2));figuresubplot(231),imshow(I),title('原图的灰度图像');subplot(232),imshow(J),title('加高斯噪声');subplot(233),imshow(Jzz1),title('模板3*3中值滤波后的图像'); subplot(234),imshow(Jzz2),title('模板10*10中值滤波后的图像'); subplot(235),imshow(J3),title('低通滤波图');彩色图像处理clear,clc;rgb=imread('yjx.jpg');fR=rgb(:,:,1);fG=rgb(:,:,2);fB=rgb(:,:,3);R=rgb;R(:,:,[2 3])=0;G=rgb;G(:,:,[1 3])=0;B=rgb;B(:,:,[1 2])=0;yiq=rgb2ntsc(rgb);fY=yiq(:,:,1);fI=yiq(:,:,2);fQ=yiq(:,:,3);fR=histeq(fR,256);fG=histeq(fG,256);fB=histeq(fB,256);RGB=cat(3,fR,fG,fB);figuresubplot(341),imshow(rgb),title('原图');subplot(342),imshow(R),title('图像的红色分量');subplot(343),imshow(G),title('图像的绿色分量');subplot(344),imshow(B),title('图像的蓝色分量');subplot(345),imshow(yiq),title('NTSC彩色空间');subplot(346),imshow(fY),title('亮度');subplot(347),imshow(fI),title('色调');subplot(348),imshow(fQ),title('饱和度');subplot(349),imshow(RGB),title('rgb均衡化后的彩色图像');原图最邻近插值双线性插值二次立方插值水平缩放与垂直缩放比例为2:1水平缩放与垂直缩放比例为1:4郁金香原图0.30.50.80.3+0.50.5-0.3P*Q P/Q原图图像的红色分量图像的绿色分量图像的蓝色分量NTSC 彩色空间亮度色调饱和度rgb 均衡化后的彩色图像原图图像频谱调整中心后的图像频谱逆变换得到的原图word 格式-可编辑-感谢下载支持原图的灰度图像加高斯噪声模板3*3中值滤波后的图像模板10*10中值滤波后的图像低通滤波图。

数字图像处理matlab代码

数字图像处理matlab代码

一、编写程序完成不同滤波器的图像频域降噪和边缘增强的算法并进行比较,得出结论。

1、不同滤波器的频域降噪1.1 理想低通滤波器(ILPF)和二阶巴特沃斯低通滤波器(BLPF)clc;clear all;close all;I1=imread('me.jpg');I1=rgb2gray(I1);subplot(2,2,1),imshow(I1),title('原始图像');I2=imnoise(I1,'salt & pepper');subplot(2,2,2),imshow(I2),title('噪声图像');F=double(I2);g = fft2(F);g = fftshift(g);[M, N]=size(g);result1=zeros(M,N);result2=zeros(M,N);nn = 2;d0 =50;m = fix(M/2);n = fix(N/2);for i = 1:Mfor j = 2:Nd = sqrt((i-m)^2+(j-n)^2);h = 1/(1+0.414*(d/d0)^(2*nn));result1(i,j) = h*g(i,j);if(g(i,j)< 50)result2(i,j) = 0;elseresult2(i,j) =g(i,j);endendendresult1 = ifftshift(result1);result2 = ifftshift(result2);J2 = ifft2(result1);J3 = uint8(real(J2));subplot(2, 2, 3),imshow(J3,[]),title('巴特沃斯低通滤波结果'); J4 = ifft2(result2);J5 = uint8(real(J4));subplot(2, 2, 4),imshow(J5,[]),title('理想低通滤波结果');实验结果:原始图像噪声图像巴特沃斯低通滤波结果理想低通滤波结果1.2 指数型低通滤波器(ELPF)clc;clear all;close all;I1=imread('me.jpg');I1=rgb2gray(I1);I2=im2double(I1);I3=imnoise(I2,'gaussian',0.01);I4=imnoise(I3,'salt & pepper',0.01);subplot(1,3,1),imshow(I2), title('原始图像'); %显示原始图像subplot(1,3,2),imshow(I4),title('加入混合躁声后图像 ');s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier 变换的零频率成分移到频谱的中心[M,N]=size(s); %分别返回s的行数到M中,列数到N中n1=floor(M/2); %对M/2进行取整n2=floor(N/2); %对N/2进行取整d0=40;for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2); %点(i,j)到傅立叶变换中心的距离 h=exp(log(1/sqrt(2))*(d/d0)^2);s(i,j)=h*s(i,j); %ILPF滤波后的频域表示endends=ifftshift(s); %对s进行反FFT移动s=im2uint8(real(ifft2(s)));subplot(1,3,3),imshow(s),title('ELPF滤波后的图像(d=40)');运行结果:1.3 梯形低通滤波器(TLPF)clc;clear all;close all;I1=imread('me.jpg');I1=rgb2gray(I1); %读取图像I2=im2double(I1);I3=imnoise(I2,'gaussian',0.01);I4=imnoise(I3,'salt & pepper',0.01);subplot(1,3,1),imshow(I2),title('原始图像'); %显示原始图像subplot(1,3,2),imshow(I4),title('加噪后的图像');s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier 变换的零频率成分移到频谱的中心[M,N]=size(s); %分别返回s的行数到M中,列数到N中n1=floor(M/2); %对M/2进行取整n2=floor(N/2); %对N/2进行取整d0=10;d1=160;for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2); %点(i,j)到傅立叶变换中心的距离 if (d<=d0)h=1;else if (d0<=d1)h=(d-d1)/(d0-d1);else h=0;endends(i,j)=h*s(i,j); %ILPF滤波后的频域表示endends=ifftshift(s); %对s进行反FFT移动s=im2uint8(real(ifft2(s))); %对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数subplot(1,3,3),imshow(s),title('TLPF滤波后的图像');运行结果:1.4 高斯低通滤波器(GLPF)clear all;clc;close all;I1=imread('me.jpg');I1=rgb2gray(I1);I2=im2double(I1);I3=imnoise(I2,'gaussian',0.01);I4=imnoise(I3,'salt & pepper',0.01);subplot(1,3,1),imshow(I2),title('原始图像');subplot(1,3,2),imshow(I4),title('加噪后的图像');s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier 变换的零频率成分移到频谱的中心[M,N]=size(s); %分别返回s的行数到M中,列数到N中n1=floor(M/2); %对M/2进行取整n2=floor(N/2); %对N/2进行取整d0=40;for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2); %点(i,j)到傅立叶变换中心的距离 h=1*exp(-1/2*(d^2/d0^2)); %GLPF滤波函数s(i,j)=h*s(i,j); %ILPF滤波后的频域表示endends=ifftshift(s); %对s进行反FFT移动s=im2uint8(real(ifft2(s))); %对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数subplot(1,3,3),imshow(s),title('GLPF滤波后的图像(d=40)');运行结果:1.5 维纳滤波器clc;clear all;close all;I=imread('me.jpg'); %读取图像I=rgb2gray(I);I1=im2double(I);I2=imnoise(I1,'gaussian',0.01);I3=imnoise(I2,'salt & pepper',0.01);I4=wiener2(I3);subplot(1,3,1),imshow(I1),title('原始图像'); %显示原始图像subplot(1,3,2),imshow(I3),title('加入混合躁声后图像');I4=wiener2(I3);subplot(1,3,3),imshow(I4),title('wiener滤波后的图像');运行结果:结论:理想低通滤波器,虽然有陡峭的截止频率,却不能产生良好的效果,图像由于高频分量的滤除而变得模糊,同时还产生振铃效应。

在MATLAB中进行图像处理的方法

在MATLAB中进行图像处理的方法

在MATLAB中进行图像处理的方法引言图像处理是一门研究如何对数字图像进行分析、处理和识别的学科。

在现代社会中,图像处理已经广泛应用于各个领域,如医学影像、电子商务和计算机视觉等。

MATLAB是一种强大的数值计算环境和编程语言,被广泛用于图像处理领域。

在本文中,我们将介绍在MATLAB中进行图像处理的一些常见方法。

一、图像读取与显示在MATLAB中,可以使用imread函数读取图像文件,并使用imshow函数显示图像。

例如,可以使用以下代码读取并显示一张图像:```matlabimg = imread('image.jpg');imshow(img);```二、图像增强图像增强是指通过改变图像的外观或质量,以提高图像的观感和可识别性。

在MATLAB中,有多种方法用于图像增强。

下面介绍其中的几种方法:1. 灰度转换灰度转换是将彩色图像转换为灰度图像的过程。

在MATLAB中,可以使用rgb2gray函数将彩色图像转换为灰度图像。

例如,可以使用以下代码实现灰度转换:```matlabgray_img = rgb2gray(img);imshow(gray_img);```2. 直方图均衡化直方图均衡化是一种常用的图像增强方法,用于提高图像的对比度。

在MATLAB中,可以使用histeq函数实现直方图均衡化。

例如,可以使用以下代码实现直方图均衡化:```matlabeq_img = histeq(gray_img);imshow(eq_img);```3. 锐化锐化是一种增强图像边缘和细节的方法。

在MATLAB中,可以使用imsharpen 函数对图像进行锐化处理。

例如,可以使用以下代码实现图像锐化:```matlabsharp_img = imsharpen(img);imshow(sharp_img);```三、图像滤波图像滤波是指对图像进行平滑处理以去除噪声或减小图像细节的过程。

在MATLAB中,有多种滤波方法可供选择。

MATLAB实用源代码(图像处理)

MATLAB实用源代码(图像处理)

MATLAB实用源代码图像读取及灰度变换I=imread('cameraman.tif');%读取图像subplot(1,2,1),imshow(I) %输出图像title('原始图像') %在原始图像中加标题subplot(1,2,2),imhist(I) %输出原图直方图title('原始图像直方图') %在原图直方图上加标题图像旋转I = imread('cameraman.tif');figure,imshow(I);theta = 30;K = imrotate(I,theta); % Try varying the angle, theta. figure, imshow(K)边缘检测I = imread('cameraman.tif');J1=edge(I,'sobel');J2=edge(I,'prewitt');J3=edge(I,'log');subplot(1,4,1),imshow(I);subplot(1,4,2),imshow(J1);subplot(1,4,3),imshow(J2);subplot(1,4,4),imshow(J3);1.图像反转MATLAB 程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8(J);subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(H);2.灰度线性变换MATLAB 程序实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1] subplot(2,2,3),imshow(J);title('线性变换图像[0.1 0.5]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1] subplot(2,2,4),imshow(K);title('线性变换图像[0.3 0.7]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系3.非线性变换MATLAB 程序实现如下:I=imread('xian.bmp');I1=rgb2gray(I);subplot(1,2,1),imshow(I1);title(' 灰度图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系J=double(I1);J=40*(log(J+1));H=uint8(J);subplot(1,2,2),imshow(H);title(' 对数变换图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系4.直方图均衡化MATLAB 程序实现如下:I=imread('xian.bmp');I=rgb2gray(I);figure;subplot(2,2,1);imshow(I);subplot(2,2,2);imhist(I);I1=histeq(I);figure;subplot(2,2,1);imshow(I1);subplot(2,2,2);imhist(I1);5. 线性平滑滤波器用MA TLAB实现领域平均法抑制噪声程序:I=imread('xian.bmp');subplot(231)imshow(I)title('原始图像')I=rgb2gray(I);I1=imnoise(I,'salt & pepper',0.02);subplot(232)imshow(I1)title(' 添加椒盐噪声的图像')k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波subplot(233),imshow(k1);title('3*3 模板平滑滤波');subplot(234),imshow(k2);title('5*5 模板平滑滤波');subplot(235),imshow(k3);title('7*7 模板平滑滤波');subplot(236),imshow(k4);title('9*9 模板平滑滤波');6.中值滤波器用MA TLAB实现中值滤波程序如下:I=imread('xian.bmp');I=rgb2gray(I);J=imnoise(I,'salt&pepper',0.02);subplot(231),imshow(I);title('原图像');subplot(232),imshow(J);title('添加椒盐噪声图像');k1=medfilt2(J); %进行3*3模板中值滤波k2=medfilt2(J,[5,5]); %进行5*5模板中值滤波k3=medfilt2(J,[7,7]); %进行7*7模板中值滤波k4=medfilt2(J,[9,9]); %进行9*9模板中值滤波subplot(233),imshow(k1);title('3*3模板中值滤波');subplot(234),imshow(k2);title('5*5模板中值滤波');subplot(235),imshow(k3);title('7*7模板中值滤波');subplot(236),imshow(k4);title('9*9 模板中值滤波');7.用Sobel算子和拉普拉斯对图像锐化:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系H=fspecial('sobel'); %选择sobel算子J=filter2(H,I1); %卷积运算subplot(2,2,3),imshow(J);title('sobel算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子J1=conv2(I1,h,'same'); %卷积运算subplot(2,2,4),imshow(J1);title('拉普拉斯算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系8.梯度算子检测边缘用MA TLAB实现如下:I=imread('xian.bmp');subplot(2,3,1);imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,3,2);imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=edge(I1,'roberts');figure;subplot(2,3,3);imshow(I2);title('roberts算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=edge(I1,'sobel');subplot(2,3,4);imshow(I3);title('sobel算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I4=edge(I1,'Prewitt');subplot(2,3,5);imshow(I4);title('Prewitt算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系9.LOG算子检测边缘用MA TLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像');I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'log');subplot(2,2,3);imshow(I2);title('log算子分割结果');10.Canny算子检测边缘用MA TLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像')I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'canny');subplot(2,2,3);imshow(I2);title('canny算子分割结果');11.边界跟踪(bwtraceboundary函数)clcclear allI=imread('xian.bmp');figureimshow(I);title('原始图像');I1=rgb2gray(I); %将彩色图像转化灰度图像threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限BW=im2bw(I1, threshold); %将灰度图像转化为二值图像figureimshow(BW);title('二值图像');dim=size(BW);col=round(dim(2)/2)-90; %计算起始点列坐标row=find(BW(:,col),1); %计算起始点行坐标connectivity=8;num_points=180;contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_points);%提取边界figureimshow(I1);hold on;plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2);title('边界跟踪图像');12.Hough变换I= imread('xian.bmp');rotI=rgb2gray(I);subplot(2,2,1);imshow(rotI);title('灰度图像');axis([50,250,50,200]);grid on;axis on;BW=edge(rotI,'prewitt');subplot(2,2,2);imshow(BW);title('prewitt算子边缘检测后图像');axis([50,250,50,200]);grid on;axis on;[H,T,R]=hough(BW);subplot(2,2,3);imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');title('霍夫变换图');xlabel('\theta'),ylabel('\rho');axis on , axis normal, hold on;P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));x=T(P(:,2));y=R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);subplot(2,2,4);,imshow(rotI);title('霍夫变换图像检测');axis([50,250,50,200]);grid on;axis on;hold on;max_len=0;for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);if(len>max_len)max_len=len;xy_long=xy;endendplot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');13.直方图阈值法用MA TLAB实现直方图阈值法:I=imread('xian.bmp');I1=rgb2gray(I);figure;subplot(2,2,1);imshow(I1);title(' 灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系[m,n]=size(I1); %测量图像尺寸参数GP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255GP(k+1)=length(find(I1==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置endsubplot(2,2,2),bar(0:255,GP,'g') %绘制直方图title('灰度直方图')xlabel('灰度值')ylabel(' 出现概率')I2=im2bw(I,150/255);subplot(2,2,3),imshow(I2);title('阈值150的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=im2bw(I,200/255); %subplot(2,2,4),imshow(I3);title('阈值200的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系14. 自动阈值法:Otsu法用MA TLAB实现Otsu算法:clcclear allI=imread('xian.bmp');subplot(1,2,1),imshow(I);title('原始图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系level=graythresh(I); %确定灰度阈值BW=im2bw(I,level);subplot(1,2,2),imshow(BW);title('Otsu 法阈值分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系15.膨胀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀subplot(1,2,2);imshow(I2);title(' 膨胀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系16.腐蚀操作MATLAB 实现腐蚀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀subplot(1,2,2);imshow(I2);title('腐蚀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系17.开启和闭合操作用MA TLAB实现开启和闭合操作I=imread('xian.bmp'); %载入图像subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1); %采用半径为1的圆作为结构元素I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(2,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(2,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系18.开启和闭合组合操作I=imread('xian.bmp'); %载入图像subplot(3,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(3,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(3,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(3,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I4=imopen(I1,se);I5=imclose(I4,se);subplot(3,2,5),imshow(I5); %开—闭运算图像title('开—闭运算图像');axis([50,250,50,200]);axis on; %显示坐标系I6=imclose(I1,se);I7=imopen(I6,se);subplot(3,2,6),imshow(I7); %闭—开运算图像title('闭—开运算图像');axis([50,250,50,200]);axis on; %显示坐标系19.形态学边界提取利用MATLAB实现如下:I=imread('xian.bmp'); %载入图像subplot(1,3,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(1,3,2),imshow(I1);title('二值化图像');权威认证axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=bwperim(I1); %获取区域的周长subplot(1,3,3),imshow(I2);title('边界周长的二值图像');axis([50,250,50,200]);grid on;axis on;20.形态学骨架提取利用MATLAB实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on;I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);axis on;I2=bwmorph(I1,'skel',1);subplot(2,2,3),imshow(I2);title('1次骨架提取');axis([50,250,50,200]);axis on;I3=bwmorph(I1,'skel',2);subplot(2,2,4),imshow(I3);title('2次骨架提取');axis([50,250,50,200]);axis on;21.直接提取四个顶点坐标I = imread('xian.bmp');I = I(:,:,1);BW=im2bw(I);figureimshow(~BW)[x,y]=getpts。

Matlab对图像进行处理代码及显示效果

Matlab对图像进行处理代码及显示效果

1、完成下列要求(1)、学习Matlab中图像处理的常用函数;(2)、说明每个函数的功能及应用实例,并实际操作;(3)、大约10个左右;答:①Dither功能:通过抖动算法转换图像类型实例:load chess;RGB=IMREAD('D:\1.jpg');subplot(1,2,1);imshow(RGB);Y=dither(RGB,map);subplot(1,2,2);imshow(Y,map);②imadd功能:将两幅图像相减,或者将图像与常数相加实例:I=IMREAD('D:\1.jpg');subplot(1,2,1);imshow(I);Y=imadd(I,66);subplot(1,2,2);imshow(Y)③imcrop功能:用于裁剪图像的一部分④im2bw⑤cat功能:产生图像序列实例:I=IMREAD('D:\1.jpg');imshow(I);J=cat(2,I,I);imshow(J)⑥RGB2GRAY功能:将一幅真彩色图像转为灰度图像⑦roicolor⑧immultiply⑨filter2功能:计算二维线型数字滤波⑩imfilter2、调研指纹识别系统,包括:(1)完整的指纹识别系统及其说明;(2)指纹匹配方法答:(1)如图所示。

图中的学习模块负责采集用户指纹数据,对指纹图像进行预处理,提取这些指纹的特征,作为将来的比对模板存人数据库。

而识别模块则负责采集和处理指纹图像,在提取特征后与数据库中的指纹模板进行比对,然后判断是否匹配.得出结论。

整个系统的核心就是图像处理、特征提取以及指纹比对。

(2)目前指纹匹配方法可以分成两类: 一类是基于图像的匹配方式,另一类是采用人工神经网络的方法.图形匹配是针对纹线几何形状和特征点的拓扑结构的匹配方式. 它的原理是采用相似变换的方法把两个细节点集中相对应的点匹配起来. 这些相似变换可以是平移变换、旋转变换、伸缩变换等线性变换. 它可以在一定程度内允许少量伪特征点的存在、真正特征点的缺失以及轻微的特征点定位偏差, 对图象的平移和旋转也不敏感. 但这种方法有两个不足之处: 一是匹配速度比较慢, 二是对指纹图象的质量要求比较高, 低质量的图象匹配效果不佳.点模式匹配的松弛算法将待识图象和模板图象的点模式分别定义为 P = { p 1, p 2, …, p m } 和Q= { q1, q2, …, qn} , Tij 表示基于一对匹配点( p i, qj ) 的相似变换. 将点模式 P 相对于 Q 作此相似变换Tij , 计算两个点模式中其他点的匹配程度, 匹配程度越高, 则基于匹配点对( p i, qj ) 的 Tij 变换的可靠度越高. 如果找到一对匹配点( p i , qj ) 使得 Tij 最大, 则将该点对作为基准点对. 然后根据 Tij 变换调整待识图象的姿势, 统计最终匹配点对的数目,给出匹配结果. 该算法需要反复计算Tij 的可靠度,所以速度很慢.以 Hough 变换为基础的模式匹配方法把点模式匹配转换成检测 Ho ug h 空间中的峰值参数,并用多种方法来降低匹配的计算复杂度. 但这种方法对于较大的图象形变效果不佳, 计算量较大, 而且当特征点不多( 少于 30 个) 时, 不易在 Ho ug h 空间中构造足够的数据, 以保证一个可靠的匹配.另外, 也可以使用图论的方法来进行指纹匹配[ 6~8] . 这类方法利用了指纹图象的拓扑结构, 允许一般的图象平移旋转、特征点丢失以及伪特征点的存在. 但这种方法在很大程度上依赖于指纹特征点及其分类信息的准确性, 对于不能保证其准确性的自动指纹识别系统就不太实用.采用人工神经网络的指纹匹配方法也有很纹图的结构信息进行初匹配,以缩小搜索空间, 然后采用遗传算法和补偿算法匹配指纹图, 有较强的抗噪声与非线性形变的能力. 另一种基于 Hough 变换角度描述点匹配. 采用人工神经网络的方法, 容错性高, 但是必须要有大量样本的事先训练才能发挥作用, 而且由于神经网络固有的反复处理特性, 速度难以得到提高, 计算量也偏大, 因此不适合用于对时间要求较高的实时在线自动指纹识别系统.曾经有人使用基于纹线队列的方法来寻找基准点对. 该方法试图通过比较两幅图象中任意一对特征点所在纹线上, 点之间坐标的差异, 来确定其是否为一对基准特征点. 这种方法能够解决一定程度内的旋转平移、非线性形变以及特征点缺失等问题,但由于它仅使用纹线上各到横轴的距离, 因而不能完整地反映纹线的形状, 当两幅图象存在较大的旋转角度偏差时, 其就难以正确进行匹配.纹线匹配方法是通过比较两幅图象中纹线上的点到纹线端点的距离, 即比较两条纹线的曲率, 来判断这两条纹线的相似程度, 从而确定基准点对. 这种方法能够较好地反映纹线的形状, 由于图象的旋转和平移不影响匹配结果, 因此匹配更加准确. 实验结果也证明了这一点.基于图形的指纹匹配方法针对匹配中最难的一步——基准点对的确定做了较深入的研究, 其采用纹线匹配的方法, 节省了寻找基准点对所消耗的大量时间, 大大提高了匹配速度.。

Matlab图像处理函数总结

Matlab图像处理函数总结

Matlab图像处理函数总结Matlab是一种广泛应用于科学和工程领域的高级计算环境和编程语言。

在图像处理领域,Matlab提供了丰富的函数和工具箱,可以帮助我们完成各种图像处理任务。

本文将对一些常用的Matlab图像处理函数进行总结和介绍。

1. imread函数imread函数用于读取图像文件。

可以使用该函数读取各种常见格式的图像文件,如JPEG、PNG、BMP等。

例如,我们可以使用以下代码读取一张名为"image.jpg"的图像:```matlabimg = imread('image.jpg');```2. imshow函数imshow函数用于显示图像。

可以使用该函数显示已经读取的图像。

例如,我们可以使用以下代码显示之前读取的图像:```matlabimshow(img);```3. imwrite函数imwrite函数用于将图像保存为文件。

可以使用该函数将处理后的图像保存为指定格式的图像文件。

例如,我们可以使用以下代码将处理后的图像保存为名为"output.jpg"的JPEG图像:```matlabimwrite(output, 'output.jpg', 'jpg');```4. rgb2gray函数rgb2gray函数用于将RGB图像转换为灰度图像。

灰度图像只有一个通道,每个像素的值表示亮度。

可以使用该函数将彩色图像转换为灰度图像。

例如,我们可以使用以下代码将之前读取的彩色图像转换为灰度图像:```matlabgray_img = rgb2gray(img);```5. imresize函数imresize函数用于调整图像的大小。

可以使用该函数将图像缩放到指定的尺寸。

例如,我们可以使用以下代码将之前读取的图像缩放为宽度为500像素的图像:```matlabresized_img = imresize(img, [NaN 500]);```6. imrotate函数imrotate函数用于旋转图像。

MATLAB图像处理(实例+代码)

MATLAB图像处理(实例+代码)

MATLAB图像处理(1) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %测量交角(线性拟合的思想)%Step 1: Load image%Step 2: Extract the region of interest%Step 3: Threshold the image%Step 4: Find initial point on each boundary%Step 5: Trace the boundaries%Step 6: Fit lines to the boundaries%Step 7: Find the angle of intersection%Step 8: Find the point of intersection%Step 9: Plot the results.clc;clear;close all;%Step 1: Load imageRGB = imread('gantrycrane.png');imshow(RGB);%Step 2: Extract the region of interest% pixel information displayed by imviewstart_row = 34;start_col = 208;cropRGB = RGB(start_row:163, start_col:400, :);figure, imshow(cropRGB)% Store (X,Y) offsets for later use; subtract 1 so that each offset will% correspond to the last pixel before the region of interestoffsetX = start_col-1;offsetY = start_row-1;%Step 3: Threshold the imageI = rgb2gray(cropRGB);threshold = graythresh(I);BW = im2bw(I,threshold);BW = ~BW; % complement the image (objects of interest must be white) figure, imshow(BW)%Step 4: Find initial point on each boundarydim = size(BW);% horizontal beamcol1 = 4;row1 = min(find(BW(:,col1)));% angled beamrow2 = 12;col2 = min(find(BW(row2,:)));%Step 5: Trace the boundariesboundary1 = bwtraceboundary(BW, [row1, col1], 'N', 8, 70);% set the search direction to counterclockwise, in order to trace downward. boundary2 = bwtraceboundary(BW, [row2, col2], 'E', 8, 90,'counter'); figure, imshow(RGB); hold on;% apply offsets in order to draw in the original imageplot(offsetX+boundary1(:,2),offsetY+boundary1(:,1),'g','LineWidth',2); plot(offsetX+boundary2(:,2),offsetY+boundary2(:,1),'g','LineWidth',2);%Step 6: Fit lines to the boundariesab1 = polyfit(boundary1(:,2), boundary1(:,1), 1);ab2 = polyfit(boundary2(:,2), boundary2(:,1), 1);%Step 7: Find the angle of intersectionvect1 = [1 ab1(1)]; % create a vector based on the line equationvect2 = [1 ab2(1)];dp = dot(vect1, vect2);% compute vector lengthslength1 = sqrt(sum(vect1.^2));length2 = sqrt(sum(vect2.^2));% obtain the larger angle of intersection in degreesangle = 180-acos(dp/(length1*length2))*180/pi%Step 8: Find the point of intersectionintersection = [1 ,-ab1(1); 1, -ab2(1)] \ [ab1(2); ab2(2)];% apply offsets in order to compute the location in the original,% i.e. not cropped, image.intersection = intersection + [offsetY; offsetX]%Step 9: Plot the results.inter_x = intersection(2);inter_y = intersection(1);% draw an "X" at the point of intersectionplot(inter_x,inter_y,'yx','LineWidth',2);text(inter_x-60, inter_y-30, [sprintf('%1.3f',angle),'{\circ}'],...'Color','y','FontSize',14,'FontWeight','bold');interString = sprintf('(%2.1f,%2.1f)', inter_x, inter_y);text(inter_x-10, inter_y+20, interString,...'Color','y','FontSize',14,'FontWeight','bold');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%检测一段圆弧的半径(圆形拟合)%Step 1: Read image%Step 2: Threshold the image%Step 3: Extract initial boundary point location%Step 4: Trace the boundaries%Step 5: Fit a circle to the boundary %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%2006.6.23基于特征的与运算>> load imdemos dots box>> imshow(dots)>> figure,imshow(box)>> logical_and=box&dots;>> imshow(logical_and);>> [r,c]=find(logical_and);>> feature_and=bwselect(dots,c,r);>> figure,imshow(feature_and); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%利用逻辑运算,提取含有细胞核的细胞load imdemos bacteria;imshow(bacteria);bact_bw=(bacteria>=100);%figure,imshow(bact_bw);bact_bw=~bact_bw;figure,imshow(bact_bw); %直接二值取反figure,imshow(bact_bw)%细胞和细胞核重叠在一起,无法区分%进行Laplace算子滤波,突出核与胞的区别filtered=filter2(fspecial('laplacian'),bacteria);>> figure,imshow(filtered) %先拉氏滤波>> bact_granules=(filtered>-4);figure,imshow(bact_granules); %“-4”运算bact_granules=bact_granules&bact_bw; %特征与运算figure,imshow(bact_granules);erode_bw=erode(bact_bw); %%figure,imshow(erode_bw);nobord=imclearborder(erode_bw); %fill_bw=imfill(nobord,'holes');figure,imshow(fill_bw);%fill_bw=bwfill(erode_bw,'holes');%figure,imshow(fill_bw);bact_granules_0=(bact_granules==0); %判0运算的结果,等价与figure,imshow(bact_granules_0); %下边的取反运算!%bact_granules_anti=~bact_granules;%figure,imshow(bact_granules_anti);>> granules=fill_bw&bact_granules_0; %尽可能多地把“核”提取出来>> figure,imshow(granules)>> [r,c]=find(granules);>> result=bwselect(bact_bw,c,r);>> figure,imshow(bacteria);>> figure,imshow(result) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%2006.7.15%按顺序标记每一个连通区域clc;clear;close all;%Step 1: Read image%Step 2: Threshold the image%Step 3: Remove the noise%Step 4: Find the boundaries%Step 5: Determine which objects are round>> RGB = imread('pillsetc.png');>> imshow(RGB)>> I = rgb2gray(RGB);>> threshold = graythresh(I);>> bw = im2bw(I,threshold);>> bw = bwareaopen(bw,30);>> se = strel('disk',2);>> bw = imclose(bw,se);>> bw = imfill(bw,'holes');>> [B,L] = bwboundaries(bw,'noholes');>> figure,imshow(label2rgb(L, @jet, [.5 .5 .5]))>> hold on>> data=regionprops(L,'all');>> centr=[data.Centroid]; %标记在重心上>> nums=1:length(B); %需要标记的物体个数for k = 1:length(B)boundary = B{k};plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)signal=num2str(nums(k));text(centr(2*k-1),centr(2*k),signal) %按序标记物体endfor k=1:length(B) %画出每个区域的最小凸边形plot(data(k).ConvexHull(:,1),data(k).ConvexHull(:,2),'b','LineWidth',2) end>> stats = regionprops(L,'Area','Centroid');>> stats = regionprops(L,'Area','Centroid');threshold = 0.94;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 = 4*pi*area/perimeter^2;metric_string = sprintf('%2.2f',metric);if metric > thresholdcentroid = stats(k).Centroid;plot(centroid(1),centroid(2),'ko');endtext(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...'FontSize',14,'FontWeight','bold');end>> title(['Metrics closer to 1 indicate that ',...'the object is approximately round']);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%2006.7.17%果穗梗、花椒籽分离%d:\matlab7\toolbox\images\images\truesize.m*(308行)clear;close all;clc>> i=imread('huaj_600_rgb.tif');>> figure,imshow(i);>> ig=rgb2gray(i);>> imed=medfilt2(ig);>> imedcanny=edge(imed,'canny');>> se90=strel('line',2,90);se0=strel('line',2,0);bwsdil=imdilate(imedcanny,[se90 se0]);%>> figure,imshow(bwsdil)>> ifill=imfill(bwsdil,'holes');>> bwero=imerode(ifill,[se90 se0]);>> nosmall=bwareaopen(bwero,3000,4);>> nobord=imclearborder(nosmall,4);figure,imshow(nobord);>> [labeled,numobjects]=bwlabel(nobord,4);rgb_label=label2rgb(labeled,@spring,'c','shuffle');figure,imshow(rgb_label);mexdata=regionprops(labeled,'all');hold on;centr=[mexdata.Centroid]; %寻找重心位置nums=1:numobjects;for k = 1:numobjectssoli=mexdata(k).Solidity;soli_string=sprintf('%2.2f',soli); %等价于转字符串% signal=num2str(nums(k));signal=sprintf('%d',k); %直接使用打印语句打印序号text(centr(2*k-1),centr(2*k),signal) %按序标记物体text(centr(2*k-1)-30,centr(2*k)-30,soli_string) %标注每个Solidity值end%画最小凸多边形>> for k=1:numobjectsplot(mexdata(k).ConvexHull(:,1),mexdata(k).ConvexHull(:,2),...'b','Linewidth',2)endhold off;%作出Solidity值的分布图,以之选定阈值>> figure,hist([mexdata.Solidity],255)%只显示Solidity>0.92的物体的图像>> idx = find([mexdata.Solidity] > 0.95);>> nut = ismember(labeled,idx);>> figure,imshow(nut)>> [labnut,numnut]=bwlabel(nut,4);>> numnut %数出花椒籽的粒数>> %只显示Solidity<0.92的物体的图像idx = find([mexdata.Solidity] < 0.75);peduncle = ismember(labeled,idx);figure,imshow(peduncle)>> [labped,numped]=bwlabel(peduncle,4);>> numped %数出含果穗梗的花椒数>> %只显示无果穗梗的花椒图像idx = find([mexdata.Solidity]>=0.75&[mexdata.Solidity]<=0.95);pure = ismember(labeled,idx);figure,imshow(pure)>> [labpure,numpure]=bwlabel(pure,4);>> numpure %纯净花椒的粒数%分别对籽,皮,梗使用regionprops函数>> nutdata=regionprops(labnut,'all');>> peddata=regionprops(labped,'all');>> puredata=regionprops(labpure,'all'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%封装成一个函数function huaj();%对花椒图像进行处理imname=input('input an image name:','s');i=imread(imname);figure,imshow(i);ig=rgb2gray(i);imed=medfilt2(ig);imedcanny=edge(imed,'canny');se90=strel('line',2,90);se0=strel('line',2,0);bwsdil=imdilate(imedcanny,[se90 se0]);%figure,imshow(bwsdil)ifill=imfill(bwsdil,'holes');bwero=imerode(ifill,[se90 se0]);nosmall=bwareaopen(bwero,3000,4);nobord=imclearborder(nosmall,4);figure,imshow(nobord);[labeled,numobjects]=bwlabel(nobord,4);rgb_label=label2rgb(labeled,@spring,'c','shuffle');figure,imshow(rgb_label);mexdata=regionprops(labeled,'all');hold on;centr=[mexdata.Centroid]; %寻找重心位置nums=1:numobjects;for k = 1:numobjectssoli=mexdata(k).Solidity;soli_string=sprintf('%2.2f',soli); %等价于转字符串% signal=num2str(nums(k));signal=sprintf('%d',k); %直接使用打印语句打印序号text(centr(2*k-1),centr(2*k),signal) %按序标记物体text(centr(2*k-1)-30,centr(2*k)-30,soli_string) %标注每个Solidity值end%画最小凸多边形for k=1:numobjectsplot(mexdata(k).ConvexHull(:,1),mexdata(k).ConvexHull(:,2),...'b','Linewidth',2)endhold off;%作出Solidity值的分布图,以之选定阈值figure,hist([mexdata.Solidity],255)%只显示Solidity>0.92的物体的图像idx = find([mexdata.Solidity] > 0.92);nut = ismember(labeled,idx);figure,imshow(nut)[labnut,numnut]=bwlabel(nut,4);numnut %数出花椒籽的粒数%只显示Solidity<0.75的果穗梗图像idx = find([mexdata.Solidity] < 0.75);peduncle = ismember(labeled,idx);figure,imshow(peduncle)[labped,numped]=bwlabel(peduncle,4);numped %数出含果穗梗的花椒数%只显示无果穗梗的花椒果皮图像idx = find([mexdata.Solidity]>=0.75&[mexdata.Solidity]<=0.92);pure = ismember(labeled,idx);figure,imshow(pure)[labpure,numpure]=bwlabel(pure,4);numpure %纯净花椒的粒数%分别对籽,皮,梗使用regionprops函数nutdata=regionprops(labnut,'all');peddata=regionprops(labped,'all');puredata=regionprops(labpure,'all');%封装成一个函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%2006.7.18%命令文件%rice_1.m>> i=imread('rice.png');>> imshow(i);>> background=imopen(i,strel('disk',15));>> i2=imsubtract(i,background);>> figure,imshow(i2);>> i3=imadjust(i2,stretchlim(i2),[0 1]);>> figure,imshow(i3);>> level=graythresh(i3);>> bw=im2bw(i3,level);>> figure,imshow(bw);>> [labeled,numobjects]=bwlabel(bw,4);%函数文件%rice.mfunction y=rice;str=input('enter a image name:','s');i=imread(str);imshow(i);background=imopen(i,strel('disk',15));i2=imsubtract(i,background);figure,imshow(i2);i3=imadjust(i2,stretchlim(i2),[0 1]);figure,imshow(i3);level=graythresh(i3);bw=im2bw(i3,level);figure,imshow(bw);[labeled,numobjects]=bwlabel(bw,4);label_rgb=label2rgb(labeled,@spring,'c','shuffle');y=label_rgb; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%用if-else-end结构来控制循环,使之跳出或中断for或while循环a(1)=1;a(2)=2;for i=2:50a(i+1)=a(i-1)+a(i);i=i+1;if a(i)>10000 %查找第一个大于10000的元素break %用if语句控制for循环endendi,a(i)%用递归调用形式计算n!%(1)编写递归调用函数文件factor.mfunction f=factor(n);%factor.m 计算n!if n==1f=1;return;elsef=n*factor(n-1);return;end%(2)运行函数文件factor(6)%函数参数传递function sa=circle(r,s);%CIRCLE PLOT A CIRCLE OF RADIUS R IN THE LINE SPECIFIED BY S. %r%s%sa%%circle(r)%circle(r,s)%sa=circle(r)%sa=circle(r,s)if nargin==1%若输入参数数目为1,则该输入参数是指定的半径数值,%默认的圆周线颜色是蓝色s='b';end;clf;t=0:pi/100:2*pi;x=r*exp(i*t);if nargout==0plot(x,s);elsesa=pi*r*r;fill(real(x),imag(x),s)endaxis('square')。

matlab图像处理范例代码

matlab图像处理范例代码

4-3D Transforms&Data StructuresI.Matlab SectionUse the Matlab help system to read about the following commands:dlmread,rotate3d on,patch,Nan,setII-1.ExamplesII.1First step:Make the following file(see program below):CubeProject.mSecond step:Run CubeProject.mThird step:Explain the program and resultsMake CubeProject.m filefunction CubeProject%To illustrate normal perspective projection%Currently this progam only rotates and displays the cube%First define the basic cubeV=[2-2-21;2-221;2221;22-21;-2-2-21;-2-221;-2221;-22-21];F=[1234;3784;7658;6215;2673;4851];VT=V';%Define sutable rotation angles to orientate the cube thetathetaY=60*pi/180;thetaX=30*pi/180;%Set up a rotation matrix for the Y axisYROT=[cos(thetaY)0-sin(thetaY)0;0100;sin(thetaY)0cos(thetaY)0;0001];XROT=[1000;0cos(thetaX)-sin(thetaX)0;0sin(thetaX)cos(thetaX)0;0001];%Now do the rotationsVT=XROT*YROT*VT;%Strip off the homogeneous co_ordinate to use the patch commandVP=zeros(3,8);VP=VT(1:3,:);colourset=[010;100;001;110;011;111];patch('Vertices',VP','Faces',F,'FaceVertexCData',colourset,'facecolor','flat')axisarray=[-55-55-5501];axis(axisarray)II.2Step1:Make the following files(see programs below):DisplayBuilding.m;Nhouse.txt;Phouse.txt Step2:Run DisplayBuilding.mStep3:Explain the program and resultsMake Nhouse.txt file-10,-20,0-10,-20,200,-20,3010,-20,2010,-20,0-10,20,0-10,20,200,20,3010,20,2010,20,0Make Phouse.txt file1,2,3,4,55,4,9,10,NaN6,7,2,1,NaN4,3,8,9,NaN7,8,3,2,NaN10,9,8,7,61,5,10,6,NaNMake DisplayBuilding.m filefunction DisplayBuilding%To display a basic BuildingNode=dlmread('Nhouse.txt');Face=dlmread('Phouse.txt');patch('vertices',Node,'faces',Face,'facecolor','b');%Depending on the size of the building you may need to change the axes rangeaxis([-100100-100100-10010001]);grid;axis squareset(gcf,'renderer','zbuffer')II-3Step1:Make the following file:HouseDraw1.m;and check that you already have files:NHouse.txt&PHouse.txt Step2:Run HouseDraw1.mStep3:Explain the program and resultsfunction HouseDraw1%Draws a simple house%Data on nodes is read from a text file NHouse.txt%Data on patches is read from a text file PHouse.txtNode=dlmread('NHouse.txt');Face=dlmread('PHouse.txt');%Draw the housecolourset=[0.20.80.2];patch('vertices',Node,'faces',Face,'FaceVertexCData',colourset,'FaceColor','flat');axis_data=[-4040-4040-404001];grid;axis(axis_data);axis square;rotate3d onII-4.Step1:Make the following file:HouseDraw2.m;and check that you already have files:NHouse.txt&PHouse.txt Step2:Run HouseDraw2.mStep3:Explain the program and resultsStep4:Compare results with Example II-3Step5:Delete NaN s from PHouse.txt fileStep6:Explain and Compare results with Example II-3Make HouseDraw2.m file:function HouseDraw2%Draws a simple house%Data on nodes is read from a text file NHouse.txt%Data on patches is read from a text file PHouse.txtNode=dlmread('NHouse.txt');%Now read in the uncorrected patch dataUPatch=dlmread('PHouse.txt');%First find how many patches we need%We don't care about the other dimension X[numpatches,X]=size(UPatch);%Now lets sort into4node&5node facesnum4=0;for k=1:numpatchesif UPatch(k,5)==0num4=num4+1;endendFace4=zeros(num4,4);Face5=zeros(numpatches-num4,5);j=1;i=1;for k=1:numpatchesif UPatch(k,5)==0Face4(j,:)=UPatch(k,1:4);j=j+1;else Face5(i,:)=UPatch(k,:);i=i+1;endendcolourset=[0];%patch('Vertices',Node,'Faces',Face4,'FaceVertexCData',colourset,'FaceColor','r')patch('Vertices',Node,'Faces',Face5,'FaceVertexCData',colourset,'FaceColor','flat')axis_data=[-4040-4040-404001];grid;axis(axis_data);axis square;rotate3d onII-5.First step:Make the following files:testCone.m&Cone.mSecond step:Run testCone.mThird step:Explain the program and resultsMake testCone.m file:function testCone;%How to colour a faceR=4;h=2;L=10;[X,Y,Z]=Cone;surf(X,Y,Z,'facecolor',[0.20.80.2])axis equalaxis squarerotate3D onMake Cone.m file:function[X,Y,Z]=Cone(R,h,L)%To create X,Y,Z data to draw a truncated cone.%R=base radius of the cone.%h=height to which the cone is drawn%L=apex of the cone%Note setting h=L will draw the full coneif nargin<3,L=1;endif nargin<2,h=L;endif nargin==0,R=1;endstepsize=h/10;t=0:stepsize:h;[X,Y,Z]=cylinder((R*(1-t/L)));5-3D Transforms;Shading,Light&Colour I.Matlab Section6-Image Analysis-BasicsI.Matlab SectionI-1.Loading&Displaying an ImagesWe can load an image with the‘imread’function and display an image with the‘imshow’function.A=imread(filename,fmt)[X,map]=imread(filename,fmt)In the first form the image is read into the array A and the format of the image ‘fmt’is optional.In the second form the image is read into the array X and the associated indexed map into‘map’scaled0to1as double.imshow(A)imshow(X,map)imshow has many other formatsI-2.Image Type ConversionsMatLab allows easy conversion between image types using:rgb2hsv to convert to a HSV imagergb2gray to convert to a grey scale image(note American spelling).rgb2ind to convert to an indexed imageYou should check the details in the MatLab help files.With the addition of the following line(and a variable name change)the previous example can be used to display the HSV components.B=rgb2hsv(A);I-3.Inspecting and Recording Image Colours7-Image SegmentationI.Matlab SectionI-1.im2bw converts image to binary image by thresholding.I-2.graythresh is used to determine a threshhold for converting the image to binary.I-3.bwlabel searches for connected components and label them with unique numbers.bwlabel takes a binary input image and a value specifying the connectivity of objects.I-4.STATS=regionprops(L,PROPERTIES)measures a set of properties for each labeled region in the label matrix L.Positive integer elements of L correspond to different regions.For example,the set of elements of L equal to1corresponds to region1;the set of elements of L equal to2corresponds to region2;and so on.STATS is a structure array of length max(L(:)).The fields of the structure array denote different properties for each region, as specified by PROPERTIES.Use the Matlab help system to read more about this command.I-5.You can use find function in conjunction with bwlabel to return vectors of indices for the pixels that make up a specific object.I-6.Use the Matlab help system to read about the following commands:max,min, findII-1.ExamplesMake m-filesII-1.function Hist1%Basic Global Thresholding%Select a Threshold Value from the Histogram%note that Egik.jpg is from Collection of ImagesA=imread('Egik.jpg');%imshow(A);figure;image(A);A=rgb2gray(A);imhist(A);%figure;%to define normalised gray level,see imhist e.g.k1=200/255k1=200/255;BW1=im2bw(A,k1);%imshow(BW1);%figure;k2=20/255;BW2=im2bw(A,k2);%imshow(BW2);%figure;k3=150/255;BW3=im2bw(A,k3);%imshow(BW3);figure;subplot(2,2,1),imhist(A);Title('imhist of Image');subplot(2,2,2),imshow(BW1);Title(['BW1Image with k1=',num2str(k1)]);subplot(2,2,3),imshow(BW2);Title(['BW2Image with k2=',num2str(k2)]);subplot(2,2,4),imshow(BW3);Title(['BW3Image with k3=',num2str(k3)]);Explain the program and results.II-2.function GlobalThresh%Compute global image threshold using Otsu's methodA=imread('Egik.jpg');A=rgb2gray(A);level=graythresh(A);levelBW6=im2bw(A,level);figure,imshow(BW6);Title(['BW6Image with global threshold level=',num2str(level)]);Explain the program and results.II-3.function EdgeEgik%To edge detect an EgikA=imread('Egik.jpg');A=rgb2gray(A);[BW,thresh]=edge(A,'sobel');imshow(BW);threshExplain the program and results.II-4.function ConnectedObjects%%save bean.jpg image from Collection of ImagesA=imread('bean.jpg');A=rgb2gray(A);[BW,thresh]=edge(A,'sobel');imshow(BW);Title('BW Image');thresh%use bwlabel to return in num the number of connected objects found in BW [L,num]=bwlabel(BW,8);%convert a label matrix into an RGB image for the purpose of visualising %the labeled regions%use the following two lines to view the regions found and%to decide on the selection criteriaRGB=label2rgb(L);figure,imshow(RGB);Title('RGB Image');numExplain the program and results.II-5.function SelectRegion%save bean.jpg image from Collection of ImagesA=imread('bean.jpg');A=rgb2gray(A);BW=edge(A,'sobel',0.04);imshow(BW);Title('BW Image');[L,num]=bwlabel(BW,8);RGB=label2rgb(L);figure,imshow(RGB);Title('RGB Image');num%Measure properties of image regions.%Consider the following approach to selecting the image profile STATS=regionprops(L,'BoundingBox','MajorAxisLength');for j=1:numif STATS(j).MajorAxisLength>100maxobject=j;endendmaxobjectboxsize=STATS(maxobject).BoundingBox;%The bounding box represents the smallest rectangle that can contain a region.%The four element vector returned by the BoundingBox field.%Two first elements show the upper left corner of the bounding box%and two last ones represent a width and a hight of the box.boxsizexb1=round(boxsize(1));xb2=round(boxsize(1)+boxsize(3));yb1=round(boxsize(2));yb2=round(boxsize(2)+boxsize(4));BWW=BW(yb1:yb2,xb1:xb2);figure,imshow(BWW)Explain the program and results.8、9-Morphological Image ProcessingI.Matlab SectionI-1.Use the Matlab help system to read about the following commands:strel,imopen,imclose I-2.Reminder:impixel can return values and/or coordinates(in ROW/COL)Use the Matlab help system to read more about this command.II-1.ExamplesMake m-filesII-1.function MorDisk%Create morphological structuring element with a disk of the given radiousclear,close all,A=imread('bean.jpg');A=rgb2gray(A);BW=edge(A,'sobel',0.04);imshow(BW);Title('BW Image');[L,num]=bwlabel(BW,8);%Label componentsRGB=label2rgb(L);figure,imshow(RGB);Title('RGB Image');numfigure,subplot(2,2,1),imshow(A);Title('Original');%Perform a morphological opening operation by calling imopen with a disk-shaped%structuring element with radiouses of10,25,30,40.%The structuring element is created by the strel function.%The morphological opening has the effect of removing objects that cannot%completely contain a disk of the given radious.%try RL=imopen(A,strel('disk',40));%RL=imopen(A,strel('disk',25));RL=imopen(A,strel('disk',3));subplot(2,2,2),imshow(RL)Title('RL Image');Explain the program and results.II-2.function MorSquare%Create morphological structuring element with a sguareclear,close all,A=imread('bean.jpg');A=rgb2gray(A);BW=edge(A,'sobel',0.04);imshow(BW);Title('BW Image');[L,num]=bwlabel(BW,8);%Label componentsRGB=label2rgb(L);figure,imshow(RGB);Title('RGB Image');numfigure,subplot(2,2,1),imshow(A);Title('Original');%Perform a morphological opening operation by calling imopen with a sguare structuring element%SE=strel('square',W)creates a square structuring element whose width is W pixels.W must be a nonnegative integer scalar.%try RL=imopen(A,strel('square',100));%RL=imopen(A,strel('square',10));RL=imopen(A,strel('square',40));subplot(2,2,2),imshow(RL)Title('RL Image');Explain the program and results.II-3.function TestMor%Step1:Threshold the imageA=imread('bean.jpg');BW=~im2bw(A,graythresh(A));%try BW=im2bw(A,graythresh(A));imshow(A),title('Original')figure,imshow(BW);Title('Step1:Thresholded Image')%Step2:Create morphological structuring element with a disk-shaped%structuring element with a given radiusMR=strel('disk',6);%Step3:Close with a disk of radius6to merge%together small features that are close together.BW2=imclose(BW,MR);figure,imshow(BW2);Title('Step3:Closing')%Step4:Follow with an opening to remove the isolated white pixels.BW3=imopen(BW2,MR);figure,imshow(BW3);Title('Step4:Opening')Explain the program and results.II-4.function MorNum%Step1:Threshold the imageA=imread('bean.jpg');BW=~im2bw(A,graythresh(A));imshow(A),title('Original')figure,imshow(BW);Title('Step1:Thresholded Image')%Step2:Create morphological structuring element with a disk-shaped%structuring element with a given radiusMR=strel('disk',6);%Step3:Close with a disk of radius6to merge%together small features that are close together.BW2=imclose(BW,MR);figure,imshow(BW2);Title('Step3:Closing')%Step4:Follow with an opening to remove the isolated white pixels.BW3=imopen(BW2,MR);figure,imshow(BW3);Title('Step4:Opening')%Determine the Number of Objects in the Image[L,num]=bwlabel(BW2,8);%compare the number of beans on the image with num that you have received %after opening processnumSTATS=regionprops(L,'BoundingBox','MajorAxisLength');for j=1:numif STATS(j).MajorAxisLength>100maxobject=j;endendmaxobjectboxsize=STATS(maxobject).BoundingBox;boxsizexb1=round(boxsize(1));xb2=round(boxsize(1)+boxsize(3));yb1=round(boxsize(2));yb2=round(boxsize(2)+boxsize(4));BWW=BW(yb1:yb2,xb1:xb2);figure,imshow(BWW)Explain the program and results.II-5.function MorColorA=imread('bean.jpg');BW=~im2bw(A,graythresh(A));imshow(A),title('Original')figure,imshow(BW);Title('Step1:Thresholded Image')%Step2:Create morphological structuring elementMR=strel('disk',6);BW2=imclose(BW,MR);figure,imshow(BW2);Title('Step3:Closing')BW3=imopen(BW2,MR);figure,imshow(BW3);Title('Step4:Opening')[L,num]=bwlabel(BW2,8);num%Now draw the outline profile(note that an outline profile is a graphic summary of the object presented by the line by which the object is defined or bounded;contour)imwrite(BW2,'BW.jpg');%saves the imageD=imread('BW.jpg');ED=edge(D,'sobel');%creates a binary image using the Sobel approximationimshow(ED);%displays imageTitle('Outline profiles-Image');%RGB=label2rgb(L);figure,imshow(RGB);Title('RGB Image');Explain the program and results.II-6.Run the following program with the processes:C losing-O pening,i.e.function Mor COA=imread('Egik.jpg');BW=~im2bw(A,graythresh(A));MR=strel('disk',6);BW2=imclose(BW,MR);BW3=imopen(BW2,MR);figure,subplot(2,2,1),imshow(A);Title('Original')subplot(2,2,2),imshow(BW);Title('Step1:Thresholded Image')%Note that Step2:Create morphological structuring elementsubplot(2,2,3),imshow(BW2);Title('Step3:Closing')subplot(2,2,4),imshow(BW3);Title('Step4:Opening')[L,num]=bwlabel(BW2,4);numExplain the program and results.II-7.Now we modify and run the program II-6with the processes:O pening-C losing,i.e. function Mor OCA=imread('Egik.jpg');BW=~im2bw(A,graythresh(A));MR=strel('disk',6);BW2=imopen(BW,MR);BW3=imclose(BW2,MR);figure,subplot(2,2,1),imshow(A);Title('Original')subplot(2,2,2),imshow(BW);Title('Step1:Thresholded Image')%Note that Step2:Create morphological structuring elementsubplot(2,2,3),imshow(BW2);Title('Step3:Opening')subplot(2,2,4),imshow(BW3);Title('Step4:Closing')[L,num]=bwlabel(BW2,4);numExplain the program and results.II-8.Run the following program with the processes:C losing-O pening,i.e.function Mor CO BeanA=imread('bean.jpg');BW=~im2bw(A,graythresh(A));MR=strel('disk',6);BW2=imclose(BW,MR);BW3=imopen(BW2,MR);[L,num]=bwlabel(BW2,4);num%find All Beansbeandata=regionprops(L,'basic');allbeans=[beandata.Area];%find max&min Beansmaxbean=max(allbeans);maxbeanminbean=min(allbeans);minbean%find Big Beanbigbean=find(allbeans==maxbean);bigbean%find Small Beansmallbean=find(allbeans==minbean);smallbeanExplain the program and results(find in Matlab Command Window).II-9.Now we modify and run the program II-8with the processes:O pening-C losing,i.e. function Mor OC BeanA=imread('bean.jpg');BW=~im2bw(A,graythresh(A));MR=strel('disk',6);BW2=imopen(BW,MR);BW3=imclose(BW2,MR);[L,num]=bwlabel(BW2,4);num%find All Beansbeandata=regionprops(L,'basic');allbeans=[beandata.Area];%find max&min Beansmaxbean=max(allbeans);maxbeanminbean=min(allbeans);minbean%find Big Beanbigbean=find(allbeans==maxbean);bigbean%find Small Beansmallbean=find(allbeans==minbean);smallbeanExplain the program and results(find in Matlab Command Window).II-10.function CoordinateGenerator%generate a Vector Model of the object profileclear,close all,A=imread('bean.jpg');BW=~im2bw(A,graythresh(A));MR=strel('disk',6);BW2=imclose(BW,MR);[L,num]=bwlabel(BW2,8);numSTATS=regionprops(L,'BoundingBox','MajorAxisLength');for j=1:numif STATS(j).MajorAxisLength>100maxobject=j;endendmaxobjectboxsize=STATS(maxobject).BoundingBox;boxsizexb1=round(boxsize(1));xb2=round(boxsize(1)+boxsize(3));yb1=round(boxsize(2));yb2=round(boxsize(2)+boxsize(4));BWW=BW2(yb1:yb2,xb1:xb2);figure,subplot(2,2,1),imshow(BWW)%to digitise an object(e.g.image,profile)means to convert this object into numbers %to digitise the outline profile generate Coordinates for a Vector Model as follows: %define/set a number of steps, e.g.100ystepsnum=100;%to define the step size use a hight of the box,%i.e.boxsize(4)-see Tutorial7,Example II-5.step=round((boxsize(4))/ystepsnum);%to generate coordinates of the bean use impixel%Note:a Vector Model of the bean profile is defined by a set of coordinatesfor I=1:ystepsnumystep=1+(I-1)*step;for K=1:boxsize(3)Px=impixel(BWW,K,ystep);if Px>0X(I)=K-boxsize(3)/2;Y(I)=boxsize(4)-ystep;breakendendend%use theVector Model to plot the profile of the bean subplot(2,2,2),plot(X,Y)axis equal。

使用MATLAB进行图像处理的步骤

使用MATLAB进行图像处理的步骤

使用MATLAB进行图像处理的步骤引言图像处理是一门研究如何对图像进行数字化处理和分析的技术,它在日常生活中得到了广泛的应用。

MATLAB作为一种强大的数学计算软件,具有丰富的图像处理功能,可以帮助用户快速、准确地处理图像数据。

本文将介绍使用MATLAB 进行图像处理的步骤,帮助读者初步了解图像处理的基本原理与方法。

一、加载图像数据使用MATLAB进行图像处理的第一步是加载待处理的图像数据。

在MATLAB 中,可以使用imread函数来读取图像文件并将其存储为矩阵形式。

例如,可以使用以下代码读取一个名为image.jpg的图像文件:```matlabimage = imread('image.jpg');```二、图像灰度化在进行图像处理之前,通常需要将图像转换为灰度图像。

这是因为灰度图像只包含亮度信息,更加简化了后续处理的复杂度。

可以使用rgb2gray函数将彩色图像转换为灰度图像。

以下是一个示例代码:```matlabgrayImage = rgb2gray(image);```三、图像增强图像增强是指通过一系列处理技术,改善图像的质量、清晰度和对比度。

在MATLAB中,有许多算法和函数可用于对图像进行增强,如直方图均衡化、滤波等。

下面是一些常用的图像增强函数的示例代码:直方图均衡化:```matlabenhancedImage = histeq(grayImage);```图像滤波:```matlabfilteredImage = imgaussfilt(grayImage, 1);```四、图像分割图像分割是将图像分成多个非重叠的区域,每个区域内具有类似的特征。

分割技术在许多图像处理应用中发挥着重要作用,如目标检测、边缘检测等。

MATLAB提供了多种图像分割算法,包括基于阈值的分割、基于边缘的分割等。

以下是一些常用的图像分割函数的示例代码:基于阈值的分割:```matlabthreshold = graythresh(enhancedImage);bwImage = imbinarize(enhancedImage, threshold);```基于边缘的分割:```matlabedgeImage = edge(enhancedImage, 'Canny');```五、图像特征提取图像特征提取是从图像中提取出一些具有代表性的特征,以便进行后续的模式识别、目标检测等任务。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MATLAB图像处理(1) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %测量交角(线性拟合的思想)%Step 1: Load image%Step 2: Extract the region of interest%Step 3: Threshold the image%Step 4: Find initial point on each boundary%Step 5: Trace the boundaries%Step 6: Fit lines to the boundaries%Step 7: Find the angle of intersection%Step 8: Find the point of intersection%Step 9: Plot the results.clc;clear;close all;%Step 1: Load imageRGB = imread('gantrycrane.png');imshow(RGB);%Step 2: Extract the region of interest% pixel information displayed by imviewstart_row = 34;start_col = 208;cropRGB = RGB(start_row:163, start_col:400, :);figure, imshow(cropRGB)% Store (X,Y) offsets for later use; subtract 1 so that each offset will% correspond to the last pixel before the region of interestoffsetX = start_col-1;offsetY = start_row-1;%Step 3: Threshold the imageI = rgb2gray(cropRGB);threshold = graythresh(I);BW = im2bw(I,threshold);BW = ~BW; % complement the image (objects of interest must be white) figure, imshow(BW)%Step 4: Find initial point on each boundarydim = size(BW);% horizontal beamcol1 = 4;row1 = min(find(BW(:,col1)));% angled beamrow2 = 12;col2 = min(find(BW(row2,:)));%Step 5: Trace the boundariesboundary1 = bwtraceboundary(BW, [row1, col1], 'N', 8, 70);% set the search direction to counterclockwise, in order to trace downward. boundary2 = bwtraceboundary(BW, [row2, col2], 'E', 8, 90,'counter'); figure, imshow(RGB); hold on;% apply offsets in order to draw in the original imageplot(offsetX+boundary1(:,2),offsetY+boundary1(:,1),'g','LineWidth',2); plot(offsetX+boundary2(:,2),offsetY+boundary2(:,1),'g','LineWidth',2);%Step 6: Fit lines to the boundariesab1 = polyfit(boundary1(:,2), boundary1(:,1), 1);ab2 = polyfit(boundary2(:,2), boundary2(:,1), 1);%Step 7: Find the angle of intersectionvect1 = [1 ab1(1)]; % create a vector based on the line equationvect2 = [1 ab2(1)];dp = dot(vect1, vect2);% compute vector lengthslength1 = sqrt(sum(vect1.^2));length2 = sqrt(sum(vect2.^2));% obtain the larger angle of intersection in degreesangle = 180-acos(dp/(length1*length2))*180/pi%Step 8: Find the point of intersectionintersection = [1 ,-ab1(1); 1, -ab2(1)] \ [ab1(2); ab2(2)];% apply offsets in order to compute the location in the original,% i.e. not cropped, image.intersection = intersection + [offsetY; offsetX]%Step 9: Plot the results.inter_x = intersection(2);inter_y = intersection(1);% draw an "X" at the point of intersectionplot(inter_x,inter_y,'yx','LineWidth',2);text(inter_x-60, inter_y-30, [sprintf('%1.3f',angle),'{\circ}'],...'Color','y','FontSize',14,'FontWeight','bold');interString = sprintf('(%2.1f,%2.1f)', inter_x, inter_y);text(inter_x-10, inter_y+20, interString,...'Color','y','FontSize',14,'FontWeight','bold');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%检测一段圆弧的半径(圆形拟合)%Step 1: Read image%Step 2: Threshold the image%Step 3: Extract initial boundary point location%Step 4: Trace the boundaries%Step 5: Fit a circle to the boundary %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%2006.6.23基于特征的与运算>> load imdemos dots box>> imshow(dots)>> figure,imshow(box)>> logical_and=box&dots;>> imshow(logical_and);>> [r,c]=find(logical_and);>> feature_and=bwselect(dots,c,r);>> figure,imshow(feature_and); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%利用逻辑运算,提取含有细胞核的细胞load imdemos bacteria;imshow(bacteria);bact_bw=(bacteria>=100);%figure,imshow(bact_bw);bact_bw=~bact_bw;figure,imshow(bact_bw); %直接二值取反figure,imshow(bact_bw)%细胞和细胞核重叠在一起,无法区分%进行Laplace算子滤波,突出核与胞的区别filtered=filter2(fspecial('laplacian'),bacteria);>> figure,imshow(filtered) %先拉氏滤波>> bact_granules=(filtered>-4);figure,imshow(bact_granules); %“-4”运算bact_granules=bact_granules&bact_bw; %特征与运算figure,imshow(bact_granules);erode_bw=erode(bact_bw); %%figure,imshow(erode_bw);nobord=imclearborder(erode_bw); %fill_bw=imfill(nobord,'holes');figure,imshow(fill_bw);%fill_bw=bwfill(erode_bw,'holes');%figure,imshow(fill_bw);bact_granules_0=(bact_granules==0); %判0运算的结果,等价与figure,imshow(bact_granules_0); %下边的取反运算!%bact_granules_anti=~bact_granules;%figure,imshow(bact_granules_anti);>> granules=fill_bw&bact_granules_0; %尽可能多地把“核”提取出来>> figure,imshow(granules)>> [r,c]=find(granules);>> result=bwselect(bact_bw,c,r);>> figure,imshow(bacteria);>> figure,imshow(result) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%2006.7.15%按顺序标记每一个连通区域clc;clear;close all;%Step 1: Read image%Step 2: Threshold the image%Step 3: Remove the noise%Step 4: Find the boundaries%Step 5: Determine which objects are round>> RGB = imread('pillsetc.png');>> imshow(RGB)>> I = rgb2gray(RGB);>> threshold = graythresh(I);>> bw = im2bw(I,threshold);>> bw = bwareaopen(bw,30);>> se = strel('disk',2);>> bw = imclose(bw,se);>> bw = imfill(bw,'holes');>> [B,L] = bwboundaries(bw,'noholes');>> figure,imshow(label2rgb(L, @jet, [.5 .5 .5]))>> hold on>> data=regionprops(L,'all');>> centr=[data.Centroid]; %标记在重心上>> nums=1:length(B); %需要标记的物体个数for k = 1:length(B)boundary = B{k};plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)signal=num2str(nums(k));text(centr(2*k-1),centr(2*k),signal) %按序标记物体endfor k=1:length(B) %画出每个区域的最小凸边形plot(data(k).ConvexHull(:,1),data(k).ConvexHull(:,2),'b','LineWidth',2) end>> stats = regionprops(L,'Area','Centroid');>> stats = regionprops(L,'Area','Centroid');threshold = 0.94;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 = 4*pi*area/perimeter^2;metric_string = sprintf('%2.2f',metric);if metric > thresholdcentroid = stats(k).Centroid;plot(centroid(1),centroid(2),'ko');endtext(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...'FontSize',14,'FontWeight','bold');end>> title(['Metrics closer to 1 indicate that ',...'the object is approximately round']);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%2006.7.17%果穗梗、花椒籽分离%d:\matlab7\toolbox\images\images\truesize.m*(308行)clear;close all;clc>> i=imread('huaj_600_rgb.tif');>> figure,imshow(i);>> ig=rgb2gray(i);>> imed=medfilt2(ig);>> imedcanny=edge(imed,'canny');>> se90=strel('line',2,90);se0=strel('line',2,0);bwsdil=imdilate(imedcanny,[se90 se0]);%>> figure,imshow(bwsdil)>> ifill=imfill(bwsdil,'holes');>> bwero=imerode(ifill,[se90 se0]);>> nosmall=bwareaopen(bwero,3000,4);>> nobord=imclearborder(nosmall,4);figure,imshow(nobord);>> [labeled,numobjects]=bwlabel(nobord,4);rgb_label=label2rgb(labeled,@spring,'c','shuffle');figure,imshow(rgb_label);mexdata=regionprops(labeled,'all');hold on;centr=[mexdata.Centroid]; %寻找重心位置nums=1:numobjects;for k = 1:numobjectssoli=mexdata(k).Solidity;soli_string=sprintf('%2.2f',soli); %等价于转字符串% signal=num2str(nums(k));signal=sprintf('%d',k); %直接使用打印语句打印序号text(centr(2*k-1),centr(2*k),signal) %按序标记物体text(centr(2*k-1)-30,centr(2*k)-30,soli_string) %标注每个Solidity值end%画最小凸多边形>> for k=1:numobjectsplot(mexdata(k).ConvexHull(:,1),mexdata(k).ConvexHull(:,2),...'b','Linewidth',2)endhold off;%作出Solidity值的分布图,以之选定阈值>> figure,hist([mexdata.Solidity],255)%只显示Solidity>0.92的物体的图像>> idx = find([mexdata.Solidity] > 0.95);>> nut = ismember(labeled,idx);>> figure,imshow(nut)>> [labnut,numnut]=bwlabel(nut,4);>> numnut %数出花椒籽的粒数>> %只显示Solidity<0.92的物体的图像idx = find([mexdata.Solidity] < 0.75);peduncle = ismember(labeled,idx);figure,imshow(peduncle)>> [labped,numped]=bwlabel(peduncle,4);>> numped %数出含果穗梗的花椒数>> %只显示无果穗梗的花椒图像idx = find([mexdata.Solidity]>=0.75&[mexdata.Solidity]<=0.95);pure = ismember(labeled,idx);figure,imshow(pure)>> [labpure,numpure]=bwlabel(pure,4);>> numpure %纯净花椒的粒数%分别对籽,皮,梗使用regionprops函数>> nutdata=regionprops(labnut,'all');>> peddata=regionprops(labped,'all');>> puredata=regionprops(labpure,'all'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%封装成一个函数function huaj();%对花椒图像进行处理imname=input('input an image name:','s');i=imread(imname);figure,imshow(i);ig=rgb2gray(i);imed=medfilt2(ig);imedcanny=edge(imed,'canny');se90=strel('line',2,90);se0=strel('line',2,0);bwsdil=imdilate(imedcanny,[se90 se0]);%figure,imshow(bwsdil)ifill=imfill(bwsdil,'holes');bwero=imerode(ifill,[se90 se0]);nosmall=bwareaopen(bwero,3000,4);nobord=imclearborder(nosmall,4);figure,imshow(nobord);[labeled,numobjects]=bwlabel(nobord,4);rgb_label=label2rgb(labeled,@spring,'c','shuffle');figure,imshow(rgb_label);mexdata=regionprops(labeled,'all');hold on;centr=[mexdata.Centroid]; %寻找重心位置nums=1:numobjects;for k = 1:numobjectssoli=mexdata(k).Solidity;soli_string=sprintf('%2.2f',soli); %等价于转字符串% signal=num2str(nums(k));signal=sprintf('%d',k); %直接使用打印语句打印序号text(centr(2*k-1),centr(2*k),signal) %按序标记物体text(centr(2*k-1)-30,centr(2*k)-30,soli_string) %标注每个Solidity值end%画最小凸多边形for k=1:numobjectsplot(mexdata(k).ConvexHull(:,1),mexdata(k).ConvexHull(:,2),...'b','Linewidth',2)endhold off;%作出Solidity值的分布图,以之选定阈值figure,hist([mexdata.Solidity],255)%只显示Solidity>0.92的物体的图像idx = find([mexdata.Solidity] > 0.92);nut = ismember(labeled,idx);figure,imshow(nut)[labnut,numnut]=bwlabel(nut,4);numnut %数出花椒籽的粒数%只显示Solidity<0.75的果穗梗图像idx = find([mexdata.Solidity] < 0.75);peduncle = ismember(labeled,idx);figure,imshow(peduncle)[labped,numped]=bwlabel(peduncle,4);numped %数出含果穗梗的花椒数%只显示无果穗梗的花椒果皮图像idx = find([mexdata.Solidity]>=0.75&[mexdata.Solidity]<=0.92);pure = ismember(labeled,idx);figure,imshow(pure)[labpure,numpure]=bwlabel(pure,4);numpure %纯净花椒的粒数%分别对籽,皮,梗使用regionprops函数nutdata=regionprops(labnut,'all');peddata=regionprops(labped,'all');puredata=regionprops(labpure,'all');%封装成一个函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%2006.7.18%命令文件%rice_1.m>> i=imread('rice.png');>> imshow(i);>> background=imopen(i,strel('disk',15));>> i2=imsubtract(i,background);>> figure,imshow(i2);>> i3=imadjust(i2,stretchlim(i2),[0 1]);>> figure,imshow(i3);>> level=graythresh(i3);>> bw=im2bw(i3,level);>> figure,imshow(bw);>> [labeled,numobjects]=bwlabel(bw,4);%函数文件%rice.mfunction y=rice;str=input('enter a image name:','s');i=imread(str);imshow(i);background=imopen(i,strel('disk',15));i2=imsubtract(i,background);figure,imshow(i2);i3=imadjust(i2,stretchlim(i2),[0 1]);figure,imshow(i3);level=graythresh(i3);bw=im2bw(i3,level);figure,imshow(bw);[labeled,numobjects]=bwlabel(bw,4);label_rgb=label2rgb(labeled,@spring,'c','shuffle');y=label_rgb; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%用if-else-end结构来控制循环,使之跳出或中断for或while循环a(1)=1;a(2)=2;for i=2:50a(i+1)=a(i-1)+a(i);i=i+1;if a(i)>10000 %查找第一个大于10000的元素break %用if语句控制for循环endendi,a(i)%用递归调用形式计算n!%(1)编写递归调用函数文件factor.mfunction f=factor(n);%factor.m 计算n!if n==1f=1;return;elsef=n*factor(n-1);return;end%(2)运行函数文件factor(6)%函数参数传递function sa=circle(r,s);%CIRCLE PLOT A CIRCLE OF RADIUS R IN THE LINE SPECIFIED BY S. %r%s%sa%%circle(r)%circle(r,s)%sa=circle(r)%sa=circle(r,s)if nargin==1%若输入参数数目为1,则该输入参数是指定的半径数值,%默认的圆周线颜色是蓝色s='b';end;clf;t=0:pi/100:2*pi;x=r*exp(i*t);if nargout==0plot(x,s);elsesa=pi*r*r;fill(real(x),imag(x),s)endaxis('square')。

相关文档
最新文档