昨天,赶紧把数字图像处理的实验报告写完,正好把一些文件都整理好了,今天,把相关代码附上我只把实验要求写上,再附上代码及运行结果图。
实验一要求:
-
编写程序add.m, subtract.m, immultiply.m文件分别实现两幅图像的加,减、乘
-
从矩阵的角度编写程序实现图像的加法运算得到混合图像,然后将混合图像与背景图像做减法运算。
-
编写程序实现图像的局部显示
-
使用subplot函数实现多图像的显示(我的代码中已经应用)
此为实验原图片,大小是500×500的正方形图片此为实验原图二,大小也是500×500的正方形,注意,图片尽量选择正方形的,否则会出错,程序无法运行
%此为加运算 clear all; I=imread('1.jpg'); J=imread('2.jpg'); K=imadd(I,J); subplot(1,3,1); imshow(I); subplot(1,3,2); imshow(J); subplot(1,3,3); imshow(K); %此为减运算 clear all; I=imread('1.jpg'); J=imread('2.jpg'); K=imsubtract(I,J); subplot(1,3,1); imshow(I); subplot(1,3,2); imshow(J); subplot(1,3,3); imshow(K); %此为乘运算 clear all; I=imread('1.jpg'); J=imread('2.jpg'); I1=double(I); J1=double(J); K=immultiply(I1,J1); subplot(1,3,1); imshow(I); subplot(1,3,2); imshow(J); subplot(1,3,3); imshow(K); %此为除运算(在要求中没有) I=imread('1.jpg'); J=imread('2.jpg'); K=imdivide(I,J); subplot(1,3,1); imshow(I); subplot(1,3,2); imshow(J); subplot(1,3,3); imshow(K);
建议:个人建议写MATLAB程序代码的时候,尽量都在前面加上clear all;下面是实验效果图
这是加运算结果,前两个为原图,第三个是结果这是减运算结果,前两个为原图,第三个是结果这是乘运算结果,前两个为原图,第三个是结果这是除运算结果,前两个为原图,第三个是结果
%从矩阵的角度编写程序实现图像的加法运算得到混合图像,然后将混合图像与背景图像做减法运算。 clear all; I=imread('1.jpg'); J=imread('2.jpg'); I1=double(I); J1=double(J); K=imadd(I,J); L=imsubtract(K,I); subplot(2,2,1); imshow(I),title('原图1'); subplot(2,2,2); imshow(J),title('原图2'); subplot(2,2,3); imshow(K),title('相加的混合图像'); subplot(2,2,4); imshow(L),title('混合图像减去背景');
上图是实验一第二问的实验图
%实现图像的局部显示 clear all; I=imread('1.jpg'); J=rgb2gray(I); K=im2double(J); subplot(1,2,1),imshow(K),title('原图灰度图像'); B=zeros(500,500);%注意,此处500,500是你的图片的大小 B(60:200,60:200)=1; Q=immultiply(K,B); subplot(1,2,2);imshow(Q),title('局部显示');
实验二要求:【在本次试验中,图片还是实验一中的原图1.JPG,2.JPG,以下实验同是这样】
- (1)求原始图像的傅里叶频谱 (2)对原始图像进行旋转,例如90度 (3)求旋转后图像的傅里叶频谱 (4)显示频谱图像
- (1)真彩色图像转换成灰度图像 (2)计算二维DCT变换 (3)显示并观察变换图像 (4)把变换矩阵中小于10的值置换为0,然后用余弦反变换重构图像。 (5)显示重构图像
%频谱 clear all; I=imread('1.jpg'); subplot(1,3,1); imshow(I); title('原图'); I=rgb2gray(I); fftI=fft2(I); sfftI=fftshift(fftI); rr=real(sfftI); ii=imag(sfftI); A=sqrt(rr.^2+ii.^2); A=(A-min(min(A)))/(max(max(A))-min(min(A)))*255; subplot(1,3,2); imshow(A); title('频谱'); J=imrotate(I,90); fftJ=fft2(J); sfftJ=fftshift(fftJ); rr=real(sfftJ); ii=imag(sfftJ); B=sqrt(rr.^2+ii.^2); B=(B-min(min(B)))/(max(max(B))-min(min(B)))*255; subplot(1,3,3); imshow(B); title('翻转90度频谱');
%DCT变换 clear all; I=imread('1.jpg'); I1=rgb2gray(I); subplot(1,3,1),imshow(I1),title('原灰度图'); I2=dct2(I1); subplot(1,3,2),imshow(I2),title('dct变换'); I2(abs(I2)<10)=0; K=idct2(I2)/255; subplot(1,3,3),imshow(K),title('重构图');
实验三要求:
-
读取一幅图像使用imadjust函数对图像进行灰度变换,并显示
-
将图像转换为double类型,并归一化此图像
-
求图像的对数变换s=c log(r+1)并显示
-
对原图像进行灰度倒置并显示倒置图像
-
对原图像进行二值化处理,阈值为0.4并显示
clear all; I=imread('1.jpg'); I=imresize(I,[500,500]); I=rgb2gray(I); subplot(2,3,1); imshow(I),title('原图灰度图'); k=imadjust(I,[0.5 0.9],[0 1]); subplot(2,3,2); imshow(k),title('imadjust函数灰度变换后灰度图'); I1=im2double(I); S=2*log(1+(I1)); subplot(2,3,3); imshow(S),title('经过对数变换后的图像'); m=imadjust(I,[0 1],[1 0]); subplot(2,3,4); imshow(m),title('灰度倒置后的图像'); q=im2bw(I,0.4); subplot(2,3,6); imshow(q),title('二值化处理的图像,阈值为0.4');
实验四要求:
- 选取一幅图像,加入椒盐噪声,分别用均值滤波和中值滤波进行平滑处理,比较滤波效果
- 选取一幅含高斯噪声图像,用巴特沃斯低通,指数低通和梯形低通处理该图像。
- 选取一幅图像,采用sobel算子,prewitt算子和拉普拉斯算子对图像进行锐化处理
I=imread('2.jpg'); I=rgb2gray(I); subplot(2,3,1); imshow(I),title('原图灰度图像');%原图的灰度图像 J=imnoise(I,'salt & pepper',0.04); subplot(2,3,2); imshow(J),title('椒盐噪声图像');%加了噪声的图像 J1=double(J)/255; h1=[1/9 1/9 1/9;1/9 1/9 1/9;1/9 1/9 1/9];%领域运算 I1=conv2(J1,h1,'same'); subplot(2,3,3); imshow(I1),title('均值滤波图像');%均值滤波图像 I2= medfilt2(J1,[5,5]);%进行二维3*3中值滤波 subplot(2,3,4); imshow(I),title('原图灰度图像');%原图的灰度图像 subplot(2,3,5); imshow(J),title('椒盐噪声图像');%加了噪声的图像 subplot(2,3,6); imshow(I2),title('中值滤波图像');
I=imread('2.jpg'); I=rgb2gray(I); subplot(1,3,1); imshow(I),title('原图灰度图像'); J=imnoise(I,'gaussian',0.02); subplot(1,3,2); imshow(J),title('加高斯噪声图像'); F=double(J); G=fft2(F); % 傅立叶变换 G=fftshift(G); % 把快速傅里叶变换的DC组件移到光谱中心 [M,N]=size(I); js=2; % 二阶 d0=50; %截止频率为30 m=fix(M/2); n=fix(N/2); for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2); h=1/(1+0.414*(d/d0)^(2*js)); % 低通滤波器传递函数 g(i,j)=h*G(i,j); end end %g=h.*G; result=ifftshift(g); Y2=ifft2(result); Y3=uint8(real(Y2)); subplot(1,3,3); imshow(Y3),title('巴特沃斯低通滤波')
clear all; I=imread('2.jpg'); I=rgb2gray(I); subplot(1,3,1); imshow(I),title('原图灰度图像'); J2=imnoise(I,'gaussian',0.02); subplot(1,3,2); imshow(J2),title('加高斯噪声图像'); F=double(J2); G=fft2(F); % 傅立叶变换 G=fftshift(G); % 把快速傅里叶变换的DC组件移到光谱中心 [M,N]=size(G); js=2; % 二阶指数低通滤波器 d0=50; %截止频率为30 m=fix(M/2); n=fix(N/2); for i=1:M for j=1:N D=sqrt((i-m)^2+(j-n)^2); h1(i,j)=exp(log(1/sqrt(2))*(D/d0)^js); end end g=h1.*G; result=ifftshift(g); Y2=ifft2(result); Y3=uint8(real(Y2)); subplot(1,3,3); imshow(Y3),title('指数低通滤波')
I=imread('2.jpg'); %读原图 I=rgb2gray(I); subplot(1,3,1); imshow(I),title('原图灰度图像'); J2=imnoise(I,'gaussian',0.02); %加均值为0,方差为0.02的高斯噪声。 subplot(1,3,2); imshow(J2),title('加高斯噪声图像'); %显示有高斯噪声图像 F=double(J2); G=fft2(F); % 傅立叶变换 G=fftshift(G); % 转换数据矩阵 [M,N]=size(G); d0=200; d1=100; m=fix(M/2); n=fix(N/2); for i=1:M for j=1:N D=sqrt((i-m)^2+(j-n)^2); h(i,j)=double(D<d1); end end % for i=1:M % for j=1:N % d=sqrt((i-m)^2+(j-n)^2); % if d<d0 % h=1; % elseif d<=d1 % h=(d-d1)/(d0-d1); % else % h=0; % end % end % end g=h.*G result=ifftshift(g); Y2=ifft2(result); Y3=uint8(real(Y2)); subplot(1,3,3); imshow(Y3),title('梯形低通滤波')
%锐化 i = imread('2.jpg'); I=rgb2gray(i); subplot(2,2,1),imshow(I),title('原图灰度图像'); I=double(I); H1=fspecial('sobel'); I1=filter2(H1,I); subplot(2,2,2),imshow(I1),title('sobel算子锐化'); H2=fspecial('prewitt'); I1=filter2(H2,I); subplot(2,2,3),imshow(I1),title('prewitt算子锐化'); h=[0 1 0,1 -4 1,0 1 0]; J=conv2(I,h,'same'); K=I-J; subplot(2,2,4),imshow(K,[]),title('拉普拉斯算子锐化');
实验五要求:
- 选取一幅图像,用Sobel,Roberts,Prewitt,LOG,Canny算子进行边缘检测,观察效果
%边缘检测 I = imread('2.jpg'); subplot(2,3,1); imshow(I),title('原图像'); I = rgb2gray(I); BW1 = edge(I,'sobel',0.1); BW2 = edge(I,'roberts',0.1); BW3 = edge(I,'prewitt',0.1); BW4 = edge(I,'log',0.01); BW5 = edge(I,'canny',0.1); subplot(2,3,2); imshow(BW1); title('Sobel算子检测效果') subplot(2,3,3); imshow(BW2); title('Roberts算子检测效果') subplot(2,3,4);imshow(BW3) title('Prewitt算子检测效果') subplot(2,3,5); imshow(BW4); title('LOG算子检测效果') subplot(2,3,6); imshow(BW5); title('Canny算子检测效果')
以上是此次实验的全部内容,思考题就不往上写了。
在文中我建议过写MATLAB程序代码的时候,尽量都加上clear all; ,为什么呢?因为不加上,之前产生的结果容易对后面产生干扰,例如
这里我之前遇到过,前面有图像,但是第三个没了,一直找不到原因,后来我把 clear all; 加上后,一切都正常了。希望能帮到你。附上我的实验文件:http://cloud.189.cn/t/fQnMjmYZrAnu (访问码:1569)
补充:用MATLAB写程序的时候,建议不要用纯数字作为文件名,本人血淋淋的惨烈教训,用纯数字运行的时候一直提示让你切换目录,但无论你怎么切换,都无济于事,切记。
真的太好了,太感谢了,在bilibili和CSDN上都找遍了,终于在你这里找到了
@爱学习的好孩子 很高兴能帮到你~