实验一 matlab的基本操作和图像的读写
实验目的
- 掌握matlab的矩阵运算;
- 掌握matlab的基本语法;
- 掌握matlab中各种数字图像的读写与显示的函数和方法。
实验内容
- 生成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)]
- 冒泡法实现将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)]
- 创建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)]
- 运行以下代码,观察其中变量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位灰度图像。
遇到的问题及解决方案
- 如何生成随机矩阵?
问题:在原本的数据集之外生成一些随机矩阵,用于测试和练习。
解决方案:使用rand函数生成随机数,再使用reshape函数将其转换成矩阵。 - 如何进行矩阵转置操作?
问题:如何将矩阵的行和列进行交换?
解决方案:使用transpose函数或者’操作符对矩阵进行转置操作。 - 如何进行矩阵裁剪操作?
问题:如何选择矩阵的一部分进行操作?
解决方案:使用矩阵索引进行裁剪操作,例如使用A(2:5,3:6)选取A矩阵中第2-5行、第3-6列的部分。 - 如何进行矩阵置零操作?
问题:如何将矩阵中某些数值置为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之间