图像处理——实验一matlab的基本操作和图像的读写

实验一 matlab的基本操作和图像的读写

实验目的

  1. 掌握matlab的矩阵运算;
  2. 掌握matlab的基本语法;
  3. 掌握matlab中各种数字图像的读写与显示的函数和方法。

实验内容

  1. 生成10×10的二维随机矩阵
A = rand(10,10);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IB50gz0J-1682586548739)(file:///C:/Users/SmartBoy/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]

​ a) 实现矩阵的转置和裁剪

B = A';

C = A(2:5,1:3);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W0PEFtda-1682586548741)(file:///C:/Users/SmartBoy/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3wpJbszR-1682586548742)(file:///C:/Users/SmartBoy/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]

​ b) 将矩阵中的第3到5行置为0,第5到7列置为0

D = A;

D(3:5,5:7) = 0;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mq1sJJuq-1682586548743)(file:///C:/Users/SmartBoy/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)]

  1. 冒泡法实现将10个元素的排序(不用自带函数)
clc

% 冒泡法实现将10个元素的排序(不用自带函数)

 

A = randi([1,100],1,10);

 

% 输出原始数组

disp('原始数组:');

disp(A);

 

for i = 1:length(A)-1

  for j = 1:length(A)-i

​    if A(j) > A(j + 1)

​      temp = A(j);

​      A(j) = A(j + 1);

​      A(j + 1) = temp;

​    end

  end

end

 

% 输出冒泡排序后的数组

disp('排序后的数组:');

disp(A);


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6mRwSmkx-1682586548744)(file:///C:/Users/SmartBoy/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)]

  1. 创建m文件,实现图像的读取(imread)、显示(image、imshow、imagesc)、保存(imwrite)以及信息观察(size、imfinfo)
clc;

[X,MAP]=imread('C:\Users\SmartBoy\Desktop\×÷Òµ\ͼÏñ´¦Àí\img\carphone.jpg','jpg');

size(X);

whos X;

imagesc(X);

colormap(gray);

imshow(X,[0 255]);

image(1,4,X);

imtool(X);

imwrite(X,'C:\Users\SmartBoy\Desktop\×÷Òµ\ͼÏñ´¦Àí\1.jpg','jpg');

imfinfo('C:\Users\SmartBoy\Desktop\×÷Òµ\ͼÏñ´¦Àí\img\car.jpg');

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5b2ZgvuK-1682586548746)(file:///C:/Users/SmartBoy/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg)]

  1. 运行以下代码,观察其中变量A与B的值和类型,给每行代码写上注释,并分析显示结果为何图1和图2不同,又为何图1和图3相同。
% 清除所有变量和命令窗口

clear all;

clc;

 

% 读取图像文件,并将其转换为双精度浮点型

A = imread('cameraman.tif');

B = double(A);

 

% 创建一个新的图像窗口,并在其中显示A和B的图像

figure,

subplot(1,3,1),imshow(A);   % 在第1个子图中显示A的原始图像

subplot(1,3,2),imshow(B);   % 在第2个子图中显示B的图像

subplot(1,3,3);imshow(B,[0 255]); % 在第3个子图中显示B的图像,并将其灰度级范围映射到0-255之间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u82e03tX-1682586548747)(file:///C:/Users/SmartBoy/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg)]

  • \1) 图1显示了原始图像A,该图像是8位灰度图像,其像素值范围为0-255。
  • \2) 图2显示了转换后的图像B,并且仍然是8位灰度图像。使用 double(A) 将原始图像A转换为双精度浮点型图像B,像素值范围为0-1。所以,这里的imshow(B)使用了默认的灰度级映射,将像素值小于1的像素呈现为黑色,而将像素值大于1的像素呈现为白色,因此图2是一个全白的图像。
  • \3) 图3显示了转换后的图像B,并将其灰度级范围映射到0-255之间。使用 imshow(B,[0 255]),将像素值映射到0-255的灰度级范围内。因为图像B的像素值范围在0-1之间,所以这里对像素值进行了线性缩放,使得像素值1对应于灰度值255,像素值0对应于灰度值0。因此,图3与原始图像A相同,是一个8位灰度图像。

遇到的问题及解决方案

  1. 如何生成随机矩阵?
    问题:在原本的数据集之外生成一些随机矩阵,用于测试和练习。
    解决方案:使用rand函数生成随机数,再使用reshape函数将其转换成矩阵。
  2. 如何进行矩阵转置操作?
    问题:如何将矩阵的行和列进行交换?
    解决方案:使用transpose函数或者’操作符对矩阵进行转置操作。
  3. 如何进行矩阵裁剪操作?
    问题:如何选择矩阵的一部分进行操作?
    解决方案:使用矩阵索引进行裁剪操作,例如使用A(2:5,3:6)选取A矩阵中第2-5行、第3-6列的部分。
  4. 如何进行矩阵置零操作?
    问题:如何将矩阵中某些数值置为0?
    解决方案:使用矩阵索引选择需要置零的部分,然后将其赋值为0即可。

总结与心得

本次实验主要针对MATLAB的基本操作和图像的读写熟练掌握。通过实验,我掌握了如何生成随机矩阵,以及矩阵的转置和裁剪等操作;同时,我掌握了使用冒泡法对数组进行排序这一算法的实现方法。此外,我还学习了图像的读取、显示和保存,并对图像的大小和信息进行观察。

在实验过程中,我遇到了一些问题。例如,在操作矩阵裁剪时,我曾经忘记了加上逗号,导致出现了错误。还有,我在读取图像时,文件路径需要按照实际情况进行修改,否则会出现读取失败的情况。但是,在认真查找资料和请教老师之后,我最终成功解决了遇到的问题。

总的来说,本次实验让我更深入地了解了MATLAB的基础语法和图像处理方法。通过实际操作,我更加熟悉了MATLAB的具体操作和注意事项。这对我接下来的学习和工作都将有所裨益。

附录(源文件)

##### Code1

% A为随机二维矩阵

A = rand(10,10);

% B为矩阵A的转置

B = A';

% C为矩阵A的裁剪操作

C = A(2:5,1:3);

% D为将矩阵A中的第3到5行置为0,第5到7列置为0

D = A;

D(3:5,5:7) = 0;

##### Code2

clc

% 冒泡法实现将10个元素的排序(不用自带函数)

 

A = randi([1,100],1,10);

 

% 输出原始数组

disp('原始数组:');

disp(A);

 

for i = 1:length(A)-1

  for j = 1:length(A)-i

​    if A(j) > A(j + 1)

​      temp = A(j);

​      A(j) = A(j + 1);

​      A(j + 1) = temp;

​    end

  end

end

 

% 输出冒泡排序后的数组

disp('排序后的数组:');

disp(A);

##### Code3

clc;

[X,MAP]=imread('C:\Users\SmartBoy\Desktop\作业\图像处理\img\carphone.jpg','jpg');

size(X);

whos X;

imagesc(X);

colormap(gray);

imshow(X,[0 255]);

image(1,4,X);

imtool(X);

imwrite(X,'C:\Users\SmartBoy\Desktop\作业\图像处理\1.jpg','jpg');

imfinfo('C:\Users\SmartBoy\Desktop\作业\图像处理\img\car.jpg');

##### Code4

% 清除所有变量和命令窗口

clear all;

clc;

 

% 读取图像文件,并将其转换为双精度浮点型

A = imread('cameraman.tif');

B = double(A);

 

% 创建一个新的图像窗口,并在其中显示A和B的图像

figure,

subplot(1,3,1),imshow(A);   % 在第1个子图中显示A的原始图像

subplot(1,3,2),imshow(B);   % 在第2个子图中显示B的图像

subplot(1,3,3);imshow(B,[0 255]); % 在第3个子图中显示B的图像,并将其灰度级范围映射到0-255之间
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值