欢迎光临!
若无相欠,怎会相见

数字图像处理实验-MATLAB程序代码

昨天,赶紧把数字图像处理的实验报告写完,正好把一些文件都整理好了,今天,把相关代码附上我只把实验要求写上,再附上代码及运行结果图。

实验一要求:

  1. 编写程序add.m, subtract.m, immultiply.m文件分别实现两幅图像的加,减、乘
  2. 从矩阵的角度编写程序实现图像的加法运算得到混合图像,然后将混合图像与背景图像做减法运算。
  3. 编写程序实现图像的局部显示
  4. 使用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. (1)求原始图像的傅里叶频谱 (2)对原始图像进行旋转,例如90度 (3)求旋转后图像的傅里叶频谱 (4)显示频谱图像
  2. (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('重构图');

实验三要求:

  1. 读取一幅图像使用imadjust函数对图像进行灰度变换,并显示
  2. 将图像转换为double类型,并归一化此图像
  3. 求图像的对数变换s=c log(r+1)并显示
  4. 对原图像进行灰度倒置并显示倒置图像
  5. 对原图像进行二值化处理,阈值为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');

实验四要求:

  1. 选取一幅图像,加入椒盐噪声,分别用均值滤波和中值滤波进行平滑处理,比较滤波效果
  2. 选取一幅含高斯噪声图像,用巴特沃斯低通,指数低通和梯形低通处理该图像。
  3. 选取一幅图像,采用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('拉普拉斯算子锐化');

实验五要求:

  1. 选取一幅图像,用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写程序的时候,建议不要用纯数字作为文件名,本人血淋淋的惨烈教训,用纯数字运行的时候一直提示让你切换目录,但无论你怎么切换,都无济于事,切记。

赞(5) 打赏
转载请注明:飘零博客 » 数字图像处理实验-MATLAB程序代码
分享到: 更多 (0)

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    真的太好了,太感谢了,在bilibili和CSDN上都找遍了,终于在你这里找到了

    爱学习的好孩子 3年前 (2020-10-25) 来自天朝的朋友 谷歌浏览器 Windows 10 回复

欢迎光临