当前位置:   article > 正文

MatLab:数字图像处理实验_读入一幅rgb图像,变换为灰度图像和二值图像,并在同一个窗口内分别显示rgb图像

读入一幅rgb图像,变换为灰度图像和二值图像,并在同一个窗口内分别显示rgb图像

实验目的

1、熟悉并掌握MATLAB工具的使用; 
2、实现图像的读取、显示、存储、平移、镜像、放大、缩小及旋转操作;
3、掌握常用的插值方法,并了解其优缺点。

实验环境

MatLab2016

实验内容

题目一

读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分别显示RGB图像和灰度图像,注上文字标题,并将结果以文件形式存到磁盘上。

代码

I = imread('D:\Backup\Documents\My Pictures\Saved Pictures\picture1.jpg');
subplot(3,1,1);
imshow(I);
title('原图像');
i = rgb2gray(I);
subplot(3,1,2);
imshow(i);
title('灰度图像');
imwrite(i,'D:\Backup\Documents\My Pictures\Saved Pictures\picture2.jpg');
a = im2bw(I,0.5);
subplot(3,1,3);
imshow(a);
title('二值图像');
imwrite(a,'D:\Backup\Documents\My Pictures\Saved Pictures\picture3.jpg');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

结果

在这里插入图片描述

题目二

对图像执行平移、镜像(水平镜像、垂直镜像)放大、缩小及旋转操作,其中放大、旋转操作分别采用最近邻插值及双线性插值方法实现,要求根据算法自己编写代码实现,并分析两种插值方法的优缺点。

平移

平移代码
I=imread('D:\Backup\Documents\My Pictures\Saved Pictures\picture1.jpg');
subplot(2,1,1);
imshow(I);
title('原图像');
[M,N,C]=size(I);
g=zeros(M,N,C);
 for color=1:3
      for i=1:M
          for j=1:N
             newx=i+30;
             newy=j+30;
             if((newx<=M)&&(newy<=N))
              g(newx,newy,color)=I(i,j,color);
             end
          end
      end
   end
subplot(2,1,2);
imshow(uint8(g));
title('平移');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
平移结果

在这里插入图片描述

水平镜像

水平镜像代码
I=imread('D:\Backup\Documents\My Pictures\Saved Pictures\picture1.jpg');
subplot(2,1,1);
imshow(I);
title('原图像');

[M,N,C]=size(I);
g=zeros(M,N,C);
for color=1:3
      for i=1:M
         for j=1:N-1
           g(i,j,color)=I(i,N-j,color);
         end
      end 
end
subplot(2,1,2);
imshow(uint8(g));
title('水平镜像');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
水平镜像结果

在这里插入图片描述

垂直镜像

垂直镜像代码
I=imread('D:\Backup\Documents\My Pictures\Saved Pictures\picture1.jpg');
subplot(2,1,1);
imshow(I);
title('原图像');
[M,N,C]=size(I);
g=zeros(M,N,C);
for color=1:3
for i=1:M-1
 for j=1:N
  g(i,j,color)=I(M-i,j,color);
 end
end
end
subplot(2,1,2);
imshow(uint8(g));
title(‘垂直镜像’);


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
垂直镜像结果

在这里插入图片描述

放大

放大代码
I=imread('D:\Backup\Documents\My Pictures\Saved Pictures\picture1.jpg'); 
figure;
imshow(I);
title('原图');
g=imresize(I,2);
figure;
imshow(g);
title('放大');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
放大结果

在这里插入图片描述
在这里插入图片描述

缩小

缩小代码
I=imread('D:\Backup\Documents\My Pictures\Saved Pictures\picture1.jpg'); 
figure;
imshow(I);
title('原图');
g=imresize(I,0.5);
figure;
imshow(g);
title('缩放');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
缩小结果

在这里插入图片描述

旋转

旋转代码
im = imread('D:\Backup\Documents\My Pictures\Saved Pictures\picture1.jpg'); % 读入图片
subplot(2,1,1);
imshow(im);
title('原图');
% 求出旋转矩阵
a = 30 / 180 * pi;
R = [cos(a), -sin(a); sin(a), cos(a)];
R = R'; % 求出旋转矩阵的逆矩阵进行逆向查找
% 计算原图大小
sz = size(im);
h = sz(1);
w = sz(2);
ch = sz(3);
c1 = [h; w] / 2;
% 计算显示完整图像需要的画布大小
hh = floor(w*sin(a)+h*cos(a))+1;
ww = floor(w*cos(a)+h*sin(a))+1;
c2 = [hh; ww] / 2; 
% 初始化目标画布
im2 = uint8(ones(hh, ww, 3)*128);
for k = 1:ch
    for i = 1:hh
       for j = 1:ww
          p = [i; j];
          pp = round(R*(p-c2)+c1);
          % 逆向进行像素查找
          if (pp(1) >= 1 && pp(1) <= h && pp(2) >= 1 && pp(2) <= w)
             im2(i, j, k) = im(pp(1), pp(2), k); 
          end
       end
    end
end
% 显示图像
subplot(2,1,2);
imshow(im2);
title('旋转');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
旋转结果

在这里插入图片描述

双线性旋转

旋转代码
im = imread('D:\Backup\Documents\My Pictures\Saved Pictures\picture1.jpg');
subplot(2,1,1);
imshow(im);
title('原图');
% 求出旋转矩阵
a = 30 / 180 * pi;
R = [cos(a), -sin(a); sin(a), cos(a)];
R = R'; % 求出旋转矩阵的逆矩阵进行逆向查找 
% 计算原图大小
sz = size(im);
h = sz(1);
w = sz(2);
ch = sz(3);
c1 = [h; w] / 2; 
% 计算显示完整图像需要的画布大小
hh = floor(w*sin(a)+h*cos(a))+1;
ww = floor(w*cos(a)+h*sin(a))+1;
c2 = [hh; ww] / 2; 
% 初始化目标画布
im2 = uint8(ones(hh, ww, 3)*128);
for k = 1:ch
    for i = 1:hh
       for j = 1:ww
          p = [i; j];
          pp = (R*(p-c2)+c1);
          mn = floor(pp);
          ab = pp - mn;
          a = ab(1);
          b = ab(2);
          m = mn(1);
          n = mn(2);
          % 线性插值方法
          if (pp(1) >= 2 && pp(1) <= h-1 && pp(2) >= 2 && pp(2) <= w-1)
             im2(i, j, k) = (1-a)*(1-b)*im(m, n, k) + a*(1-b)*im(m+1, n, k)...
                          + (1-a)*b*im(m, n, k)     + a*b*im(m, n, k);
          end
       end
    end
end
% 显示图像
subplot(2,1,2);
imshow(im2);
title('线性旋转');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
旋转结果

在这里插入图片描述
有参考许多csdn文章。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/642177
推荐阅读
相关标签
  

闽ICP备14008679号