数字图像处理程序实验一1、图像的缩放:A=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); subplot(311);imshow(A);title('原图')B=imresize(A,3);subplot(312);imshow(B);title('三倍图');C=imresize(A,0.5);subplot(313);imshow(C);title('二分之一图');2、图像的镜像:A1=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); figuresubplot(2,2,1),imshow(uint8(A1));H=size(A1);title('原像')A2(1:H(1),1:H(2),1:H(3))=A1(H(1):-1:1,1:H(2),1:H(3));%垂直镜像subplot(2,2,2),imshow(uint8(A2));title('垂直镜像')A3(1:H(1),1:H(2),1:H(3))=A1(1:H(1),H(2):-1:1,1:H(3));%水平镜像subplot(2,2,3),imshow(uint8(A3));title('水平镜像')A4(1:H(1),1:H(2),1:H(3))=A1(H(1):-1:1,H(2):-1:1,1:H(3));%对角镜像subplot(2,2,4),imshow(uint8(A4));title('对角镜像')3、图像的旋转:I = imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); subplot(141);imshow(I);title('原图');theta1 = 45;%旋转的角度为45度K1 = imrotate(I,theta1); % 对图像进行旋转subplot(142);title('旋转45度后的图像');theta2 = 138;%旋转的角度为138度K2 = imrotate(I,theta2); % 对图像进行旋转subplot(143);imshow(K2);title('旋转138度后的图像');theta3 = 60;%旋转的角度为60度K3 = imrotate(I,theta3); % 对图像进行旋转subplot(144);imshow(K3);title('旋转60度后的图像');4、图像的剪切:A1=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');A2=imcrop(A1,[700 500 1900 1100]);figuresubplot(1,2,1),imshow(A1);title('原像')subplot(1,2,2),imshow(A2);title('剪切后像')5、图像的平移:A7=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');subplot(121);imshow(A7);title('原始图像');A=imcrop(A7,[700 500 1900 1100]);A1=double(A);A1_move=zeros(size(A1));H=size(A1);A1_x=500;A1_y=500;A1_movesult(A1_x+1:H(1),A1_y+1:H(2),1:H(3))=A(1:H(1)-A1_x,1:H(2)-A1_y,1:H(3)); subplot(122);imshow(uint8(A1_movesult));title('平移后的图像');6、图像的乘法:I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');subplot(221);imshow(I);title('原始图像');I2=immultiply(I1,I1);subplot(222);imshow(I2);title('图像自乘效果');I3=immultiply(I,5);subplot(223);imshow(I3);title('图像与常数相乘');7、图像的除法:clear all;I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); subplot(221);imshow(I);title('原始图像');background=imopen(I,strel('disk',15));I1=imdivide(I,background);subplot(222);imshow(I1);title('图像与背景相除');I2=imdivide(I,2);subplot(223);imshow(I2);title('图像与常数相除');8、图像的加法:clear all;I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); I1=imcrop(I,[700 500 1900 1100]);subplot(131);imshow(I1);title('原始图像剪切后的图像');K=imadd(I1,I1);subplot(132);imshow(K);title('剪切后图像自相加后的图');F=imadd(I,45);subplot(133);imshow(F);title('原始图像与常数相加后的图形');实验二1、图像的灰度与二值变换:A=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');B=rgb2gray(A);%彩色图像转换成灰度图像subplot(131);imshow(A);title('原图');subplot(132);imshow(B);title('原图灰度图像');BW=im2bw(B,0.2);%0.2是阈值用来控制灰度等级的,设置成不同的值能够使二值图的效果进行不同的变化subplot(133);imshow(BW);title('二值图像');2、图像的灰度线性变换:I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');subplot(141);imshow(I);title('原始图像');axis([500,3000,500,2400]);axis on; %显示坐标系I1=rgb2gray(I);subplot(142),imshow(I1);title('灰度图像');axis([500,3000,500,2400]);axis on; %显示坐标系J=imadjust(I1,[0.1 0.5],[0 1]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1]subplot(143),imshow(J);title('线性变换图像[0.1 0.5]');axis([500,3000,500,2400]);grid on; %显示网格线axis on; %显示坐标系K=imadjust(I1,[0.3 0.6],[0 1]); %局部拉伸,把[0.3 0.6]内的灰度拉伸为[0 1]subplot(144),imshow(K);title('线性变换图像[0.3 0.6]');axis([500,3000,500,2400]);grid on; %显示网格线axis on; %显示坐标系3、图像线性反转:I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');J=double(I);%将原图中的值返回成双精度J=-J+255; %图像反转线性变换H=uint8(J);%将J中的图像转换成用8位显示的无符号整数类型subplot(121);imshow(I);title('对原图取双精度后的图像');subplot(122);imshow(H);title('线性反转后的图像');4、图像的非线性变换:I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');I1=rgb2gray(I);subplot(121);imshow(I1);title(' 灰度图像');axis on; %显示坐标J=double(I1);J=40*(log(J+1));%对图像进行自然对数变换H=uint8(J);subplot(122); imshow(H);title(' 对数变换图像');axis on; %显示坐标系5、图像的直方图均衡化:I = imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');I1=rgb2gray(I);figuresubplot(141);imshow(I1)subplot(142);imhist(I1)title('均衡化之前的直方图');I2=histeq(I1);%使用直方图均衡化增强对比度subplot(143);imshow(I2)subplot(144);imhist(I2)title('均衡化之后的直方图');6、线性均值滤波I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');subplot(231)imshow(I)title('原始图像')I=rgb2gray(I);I1=imnoise(I,'salt & pepper',0.02);%为灰度图像增加盐椒噪声,其噪声的密度为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 模板平滑滤波');7、非线性中值滤波I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');I1=rgb2gray(I);J=imnoise(I1,'salt & pepper',0.02);subplot(231),imshow(I1);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 模板中值滤波');8、图像的锐化:I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');subplot(2,2,1);imshow(I);title('原始图像');axis([500,3000,500,3000]);axis on; %显示坐标系I1=im2bw(I,0.1);subplot(2,2,2),imshow(I1);title('二值图像');axis([500,3000,500,3000]);axis on;%显示坐标系H=fspecial('sobel'); %选择sobel算子J=filter2(H,I1); %卷积运算subplot(2,2,3),imshow(J);title('sobel算子锐化图像');axis on;%显示坐标系h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子h1=double(h);J1=double(I1);J2=conv2(J1,h1,'same'); %卷积运算,返回的是一个与J1具有相同尺寸的阵列subplot(2,2,4),imshow(J2);title('拉普拉斯算子锐化图像');axis on;%显示坐标系实验三1、梯度算子边缘检测I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); subplot(151);imshow(I)title('原始图像');axis([500,3000,500,3000]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I,0.1);subplot(152);imshow(I1);title('二值图像');axis([500,3000,500,3000]);grid on; %显示网格线axis on; %显示坐标系I2=edge(I1,'roberts');subplot(153);imshow(I2);title('roberts算子分割结果');axis([500,3000,500,2500]);grid on; %显示网格线axis on; %显示坐标系I3=edge(I1,'sobel');subplot(154);imshow(I3);title('sobel算子分割结果');axis([500,3000,500,2500]);grid on; %显示网格线axis on; %显示坐标系I4=edge(I1,'Prewitt');subplot(155);imshow(I4);title('Prewitt算子分割结果');axis([500,3000,500,2500]);grid on; %显示网格线axis on; %显示坐标系2、log算子边缘检测I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); 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算子边缘检测结果');3、canny算子边缘检测I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); subplot(131);imshow(I);title('原始图像')I1=rgb2gray(I);subplot(132);imshow(I1);title('灰度图像');I2=edge(I1,'canny');subplot(133);imshow(I2);title('canny算子边缘检测结果');4、hough变换I= imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); I1=rgb2gray(I);subplot(2,2,1);imshow(I1);title('灰度图像');axis([500,3000,500,2400]);grid on;axis on;BW=edge(I1,'prewitt');subplot(2,2,2);imshow(BW);title('prewitt算子边缘检测后图像');axis([500,3000,500,2400]);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(I1);title('霍夫变换图像检测');axis([500,3000,500,2400]);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');5、直方图阈值I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');I1=rgb2gray(I);figure;subplot(221);imshow(I1);title(' 灰度图像')axis([500,3000,500,2500]);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(222),bar(0:255,GP,'g')%绘制直方图title('灰度直方图')xlabel('灰度值')ylabel(' 出现概率')I2=im2bw(I,50/255);subplot(223),imshow(I2);title('阈值50的分割图像')axis([500,3000,500,2500]);grid on; %显示网格线axis on; %显示坐标系I3=im2bw(I,100/255); %subplot(224),imshow(I3);title('阈值100的分割图像')axis([500,3000,500,2500]);grid on; %显示网格线axis on; %显示坐标系7、ostu法阈值分割clcclear allI=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');subplot(1,2,1),imshow(I);title('原始图像')axis([500,3000,500,3000]);grid on; %显示网格线axis on; %显示坐标系level=graythresh(I);%确定灰度阈值BW=im2bw(I,level);subplot(1,2,2),imshow(BW);title('Otsu 法阈值分割图像')axis([500,3000,500,3000]);grid on; %显示网格线axis on; %显示坐标系实验四1、快速傅里叶变换与反变换I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');A=rgb2gray(I);%原图转换成灰度图像x1=fft2(A);%对灰度图像进行快速傅里叶变换x2=fftshift(x1);x3=ifft(x1)/10;%fft逆变换figuresubplot(2,2,1);imshow(A)title('原图');subplot(2,2,2);imshow(x1)title('频谱图');subplot(2,2,3);imshow(log(abs(x2)+1),[0 10]);title('直流分量移至频谱图中心');subplot(2,2,4)imshow(x3,[0 10])title('傅里叶反变换');2、DCT变换I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');I1=rgb2gray(I);I2=imcrop(I1,[700 500 1900 1100]);%由于原始图片比较大,在进行dct变换时出现了超出内在的情况,所以对图片进行了适当的剪切J=dct2(I2);%返回图像I2的二维离散余弦变换值,其大小与I2相同,且各元素为离散余弦变换的系数B(k1.k2)subplot(121);imshow(I);title('原始图像');subplot(122);imshow(log(abs(J)),[]);colormap(jet(64));%反映了当前图像中的色图情况colorbar%colorbar函数显示当前colormap在当前图以及调整当前轴,使其适应colorbartitle('DCT变换');3、骨架提取I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg');subplot(141),imshow(I);title('原始图像');axis([500,3000,500,2400]);axis on;I1=im2bw(I,0.1);subplot(142),imshow(I1);title('二值图像');axis([500,3000,500,2400]);axis on;I2=bwmorph(I1,'skel',1);%对二值图像进行形态学操作,其中skel是骨架提取的参数,而1是进行骨架提取的次数可以大到无穷subplot(143),imshow(I2);title('1次骨架提取');axis([500,3000,500,2400]);axis on;I3=bwmorph(I1,'skel',3);subplot(144),imshow(I3);title('3次骨架提取');axis([500,3000,500,2400]);axis on;4、边界提取I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); %载入图像subplot(1,3,1),imshow(I);title('原始图像');axis([500,3000,500,2400]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I,0.1);subplot(1,3,2),imshow(I1);title('二值化图像');axis([500,3000,500,2400]);axis on; %显示坐标系I2=bwperim(I1);%获取二值图像的区域的周长subplot(1,3,3),imshow(I2);title('边界周长的二值图像');axis([500,3000,500,2400]);grid on;axis on;5、开、闭运算I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); %载入图像subplot(3,2,1),imshow(I);title('原始图像');axis([500,3000,500,2400]);axis on; %显示坐标系I1=rgb2gray(I);subplot(3,2,2),imshow(I1);title('灰度图像');axis([500,3000,500,2400]);axis on; %显示坐标系se=strel('disk',5);%创建一个半径为5的圆形平面结构元素I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(3,2,3),imshow(I2);title('开启运算后图像');axis([500,3000,050,2400]);axis on;%显示坐标系subplot(3,2,4),imshow(I3);title('闭合运算后图像');axis([500,3000,500,2400]);axis on; %显示坐标系se=strel('octagon',18);%生成一个从中心点到边界跨度为18的八边形(括号中的参数必须是3的整数倍)I4=imopen(I1,se);I5=imclose(I4,se);subplot(3,2,5),imshow(I5); %开—闭运算图像title('开—闭运算图像');axis([500,3000,500,2400]);axis on; %显示坐标系I6=imclose(I1,se);I7=imopen(I6,se);subplot(3,2,6),imshow(I7); %闭—开运算图像title('闭—开运算图像');axis([500,3000,500,2400]);6、腐蚀、膨胀操作I=imread('F:\MATLAB程序\数字图像处理实验\kunkun.jpg'); %载入图像I1=rgb2gray(I);subplot(1,3,1);imshow(I1);title('灰度图像');axis([500,3000,500,2400]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',15); %生成半径为15的圆形结构元素I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀subplot(1,3,2);imshow(I2);title('腐蚀后图像');axis([500,3000,500,2400]);grid on; %显示网格线axis on;%显示坐标系se1=strel('square',6); %生成边长为6方形结构元素I3=imdilate(I1,se1); %用生成的结构元素对图像进行膨胀subplot(1,3,3);imshow(I3);title(' 膨胀后图像');axis([500,3000,500,2400]);grid on; %显示网格线axis on; %显示坐标系。