实验目的
掌握matlab的矩阵运算
掌握matlab的基本语法
掌握matlab中各种数字图像的读写与显示的函数和方法
实验内容
1.生成10*10的二维随机矩阵
实现矩阵的转置与裁剪
将矩阵中的第3到5行置为0,第5到7列置为0
设计思路
1. 生成一个随机的10*10的矩阵;
2. 显示原始矩阵;
3. 实现矩阵的转置;
4. 显示转置后的矩阵;
5. 实现矩阵的裁剪,将矩阵中的第3到5行和第5到7列置为0;
6. 显示裁剪后的矩阵。
代码及注释
% 生成一个随机的10*10的矩阵
A = randi(100,10,10);
% 显示原始矩阵
disp('Original Matrix:');
disp(A);
% 实现矩阵的转置
At = A'; % 使用 A' 进行转置
% 显示转置后的矩阵
disp('Transpose Matrix:');
disp(At);
% 实现矩阵的裁剪
% 将矩阵中的第3到5行和第5到7列置为0
A(3:5,:) = 0; % 将第3到5行置为0
A(:,5:7) = 0; % 将第5到7列置为0
% 显示裁剪后的矩阵
disp('Cropped Matrix:');
disp(A);
显示结果
结果分析
生成的随机矩阵每个元素的数值都是在 1 到 100 之间随机生成的,通过对比原始矩阵、转置后的矩阵、裁剪后的矩阵可以发现:
1. 转置操作会将原矩阵的行变成列,列变成行;
2. 裁剪操作会将矩阵中第3到5行和第5到7列全部置为0。
2. 冒泡法实现将10个元素的排序(不用自带函数)
设计思路
1.生成 10 个随机数,构成一个 10 阶向量;
2. 显示未排序的向量;
3. 使用 for 循环嵌套实现排序,每一次内循环比较相邻元素的大小,并交换位置,直到内循环结束;
4. 显示排序后的向量。
代码及注释
% 生成 10 个随机数
v = randi([1 100], 1, 10);
disp("未排序的向量:");
disp(v); % 显示未排序的向量
% 冒泡排序
n = numel(v);
for i = 1:n
for j = 1:n-i
if v(j) > v(j+1)
temp = v(j+1);
v(j+1) = v(j);
v(j) = temp;
end
end
end
% 显示排序后的向量
disp("排序后的向量:");
disp(v);
显示结果
结果分析
以上代码会将无序的元素进行排序,采用的是冒泡法,即相邻两个元素互相比较的方法
3.创建m文件,实现图像的读取(imread)、显示( image、
imshow、imagesc)、保存(imwrite) 以及信息观察( size、
imfinfo )
设计思路
1. 使用 imread 函数读取一张图片,获取其图像数据;
2. 利用 image 或者 imshow 函数显示图像;
3. 利用 imagesc 函数显示图像,并设置色彩映射;
4. 利用 imwrite 函数保存图像;
5. 利用 size 函数获取图像的大小;
6. 利用 imfinfo 函数获取图像的信息。
代码及注释
% 读取图像信息
image_data = imread("C:\Users\52212\Desktop\xust.jpg
");
% 显示图像
figure;
subplot(1, 3, 1);
image(image_data);
title("使用 image 函数显示图像");
subplot(1, 3, 2);
imshow(image_data);
title("使用 imshow 函数显示图像");
subplot(1, 3, 3);
imagesc(image_data);
colormap(gray);
title("使用 imagesc 函数显示图像");
% 保存图像
imwrite(image_data, "xust_result.jpg");
% 获取图像信息
image_size = size(image_data);
image_info = imfinfo("xust.jpg ");
fprintf("图像的大小为:%d x %d\n", image_size(2), image_size(1));
fprintf("图像的信息为:\n");
disp(image_info);
显示结果
结果分析
加载一张名为xust.jpg 的图片,并将它分别使用 image、imshow 和 imagesc 函数进行显示。其中,imagesc 函数将图像转化为灰度图,并进行了色彩映射,使得图像更加清晰易读。
然后,代码将使用 imwrite 函数将处理后的图像保存为 example_result.jpg 文件,并使用 size 函数获取图像的大小,使用 imfinfo 函数获取图像的全部信息。
4.运行以下代码,观察其中变量A与B的值和类型,给每行代码写上注释,并分析显示结果为何图1和图2不同,又为何图1和图3相同。
代码及注释
% 清空所有变量和命令窗口
clear all;
clc;
% 读取图像并保存在变量A中
A=imread('cameraman.tif');
% 将A转换图像类型为double并保存在变量B中
B=double(A);
% 新建一个图形窗口
figure,
% 在该窗口中创建一个1行3列的子图,并在第1列中显示图像A
subplot(1,3,1),imshow(A);
% 在第2列中显示图像B
subplot(1,3,2),imshow(B);
% 在第3列中将图像B的灰度值映射到[0,255]范围内并显示
subplot(1,3,3),imshow(B,[0,255]);
显示结果
结果分析
图1和图2不同是因为图像A是uint8类型,即8位无符号整型,它的灰度值范围在[0,255]之间,而图像B是double类型,即双精度浮点型,灰度值范围在[0,1]之间。imshow函数默认将灰度值映射到[0,1]范围内显示,所以图1和图2的灰度级显示不同。
图1和图3相同是因为图像B在imshow函数中被映射到了[0,255]范围内,与图像A的灰度值范围相同,所以显示效果相同。
问题及解决方案
1.文件名错误,导致无法正确打开图片,由于在本地文件中也存在同名的图片,所以出现了错误,无法运行,或者地址有误出现问题
解决方案:使用matlab内置的图像,或者更改本地的图像地址。
2.函数未正确运行,找不到函数,未正确安装图像处理工具箱,导致函数无法找到或者出现错误。
解决方案:重新下载了完整版的matlab
总结与心得
本次实验是基于 MATLAB 图像处理工具箱以及矩阵运算的实践,通过运用 MATLAB 的函数对图像进行读取、处理和显示,进一步理解和巩固了数字图像处理的相关知识。通过这次实验,我对 MATLAB 中常用的图像处理函数如 imread、imshow、subplot 等有了更深入的了解和实际操作经验,对矩阵的运算也更加熟悉,同时,也更深刻地体会到编程的重要性,应该注重编程实践,发现问题及时调试和解决,从而更好地掌握所学的知识。
同时在实验过程中,还需要考虑到图像的大小、类型、亮度、对比度、色彩等因素,尤其是在调用函数时输入参数的正确性、合法性,否则容易导致代码运行错误或者不正常。
总之,通过本次实验的学习,让我对数字图像处理有了更加深刻的理解,也正式开始了关于熟悉图像处理的学习。
附录
1.
% 生成一个随机的10*10的矩阵
A = randi(100,10,10);
% 显示原始矩阵
disp('Original Matrix:');
disp(A);
% 实现矩阵的转置
At = A'; % 使用 A' 进行转置
% 显示转置后的矩阵
disp('Transpose Matrix:');
disp(At);
% 实现矩阵的裁剪
% 将矩阵中的第3到5行和第5到7列置为0
A(3:5,:) = 0; % 将第3到5行置为0
A(:,5:7) = 0; % 将第5到7列置为0
% 显示裁剪后的矩阵
disp('Cropped Matrix:');
disp(A);
2.
% 生成 10 个随机数
v = randi([1 100], 1, 10);
disp("未排序的向量:");
disp(v); % 显示未排序的向量
% 冒泡排序
n = numel(v);
for i = 1:n
for j = 1:n-i
if v(j) > v(j+1)
temp = v(j+1);
v(j+1) = v(j);
v(j) = temp;
end
end
end
% 显示排序后的向量
disp("排序后的向量:");
disp(v);
3.
image_data = imread("C:\Users\52212\Desktop\xust.jpg
");
% 显示图像
figure;
subplot(1, 3, 1);
image(image_data);
title("使用 image 函数显示图像");
subplot(1, 3, 2);
imshow(image_data);
title("使用 imshow 函数显示图像");
subplot(1, 3, 3);
imagesc(image_data);
colormap(gray);
title("使用 imagesc 函数显示图像");
% 保存图像
imwrite(image_data, "xust_result.jpg");
% 获取图像信息
image_size = size(image_data);
image_info = imfinfo("xust.jpg ");
fprintf("图像的大小为:%d x %d\n", image_size(2), image_size(1));
fprintf("图像的信息为:\n");
disp(image_info);
4.
clear all;
clc;
A=imread('cameraman.tif');
B=double(A);
figure,
subplot(1,3,1),imshow(A);
subplot(1,3,2),imshow(B);
subplot(1,3,3),imshow(B,[0,255]);