实验一 Matlab 图像的读写与显示(数字图像处理)

实验目的

掌握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的矩阵

扫描二维码关注公众号,回复: 15486792 查看本文章

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]);

猜你喜欢

转载自blog.csdn.net/m0_63975371/article/details/131392470