一、实验目的
1.了解 MATLAB图像处理工具箱函数中的基本功能及操作方法。
2.掌握MATLAB中图像读写和显示函数的使用方法。
3.掌握如何利用MATLAB函数获取图像大小、颜色、高度、宽度等信息。
4.熟悉常用的图像类型的相互转换。
二、实验要求
1.实验课前需要写预习实验报告,内容为本次实验要求中的所有程序清单。
2.实验课对预习报告中的编程代码进行上机调试,完成实验指导书中全部实验要求内容。
3.实验课后写出实验报告。报告要求有实验目的,实验内容与步骤,调试完成的准确编程代码,实验小结,回答问题。
三、实验内容(每一个内容编写一个*.m文件)
1.利用imread()函数分别读入图像trees.tif和ngc6543a.jpg,存入两个数组中,用“whos”命令获取图像的基本信息。
2.利用imwrite()函数将图像trees.tif压缩,将其保存为一幅压缩了像素的jpg文件, 图像名为为trees1.jpg;
>> imwrite(trees, 'trees1.jpg', 'jpg', 'Quality', 50);
3.命令窗口利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息。
>> info_trees = imfinfo('trees.tif');
info_ngc6543a = imfinfo('ngc6543a.jpg');
4.在4个不同的图像窗口中显示任意4幅不同图像类型(二值、索引、灰度、真彩色)的图像。
% 显示真彩色图像
rgb = imread('peppers.png');
figure; imshow(rgb); title('Truecolor Image');
>> % 显示二值图像
bw = logical([1 0 1; 0 1 0; 1 0 1]);
figure; imshow(bw); title('Binary Image');
>> % 显示灰度图像
gray = imread('mri.tif');
figure; imshow(gray); title('mri Image');
>> % 显示索引图像
idx = imread('trees.tif');
figure; imshow(idx, 'Colormap', autumn(256)); title('Indexed Image');
>> % 显示真彩色图像
rgb = imread('onion.png');
figure; imshow(rgb); title('onion Image');
5.分别用imread和load命令读入两幅不同的图像,并排显示在同一图像窗口。
image1 = imread('onion.png');
data = load('trees.mat');
image2 = data.imageData;
figure;
subplot(1, 2, 1);
imshow(image1);
title('Image 1');
subplot(1, 2, 2);
imshow(image2);
title('Image 2');
imwrite(trees, 'trees1.jpg', 'jpg', 'Quality', 50);
6.利用imshow()函数来显示图像trees.tif,要求先转化为rgb图像,分别显示每个通道,然后合并再显示)
% 读取图像文件
tree_image = imread('trees.tif');
% 将灰度图像转换为RGB图像
rgb_image = cat(3, tree_image, tree_image, tree_image);
% 显示每个通道
figure;
subplot(1, 3, 1);
imshow(rgb_image(:, :, 1)); % 红色通道
title('红色通道');
subplot(1, 3, 2);
imshow(rgb_image(:, :, 2)); % 绿色通道
title('绿色通道');
subplot(1, 3, 3);
imshow(rgb_image(:, :, 3)); % 蓝色通道
title('蓝色通道');
% 合并并显示RGB图像
figure;
imshow(rgb_image);
title('合并的RGB图像');
7.用rgb2gray()将一幅索引图像trees.tif转化为灰度图像,并且用imshow显示出来观察图像的特征。
% 读取索引图像文件
tree_image = imread('trees.tif');
% 将索引图像转换为RGB图像
rgb_image = ind2rgb(tree_image, colormap);
% 将RGB图像转换为灰度图像
gray_image = rgb2gray(rgb_image);
% 显示灰度图像
imshow(gray_image);
title('灰度图像');
8.用im2bw()将一幅灰度图像camema.jpg转化为二值图像,并且用imshow显示出来观察图像的特征。
% 读取灰度图像文件
gray_image = imread('cameraman.jpg');
% 将灰度图像转换为二值图像
threshold = graythresh(gray_image); % 自适应阈值
binary_image = im2bw(gray_image, threshold);
% 显示二值图像
imshow(binary_image);
title('二值图像');
- 用rgb2ind()将真彩色图像onion.png转化为索引图像,用imshow显示出来,并读取出两种图像的数据,观察图像的特征。
% 读取真彩色图像文件
rgb_image = imread('onion.png');
% 将真彩色图像转换为索引图像
[indexed_image, colormap] = rgb2ind(rgb_image, 256);
% 显示索引图像
imshow(indexed_image, colormap);
title('索引图像');
% 读取真彩色图像和索引图像数据
rgb_data = imread('onion.png');
indexed_data = indexed_image
% 显示原始图像和索引图像
figure;
subplot(1, 2, 1);
imshow(rgb_data);
title('真彩色图像');
subplot(1, 2, 2);
imshow(indexed_data);
title('索引图像');
% 比较图像数据
fprintf('真彩色图像大小:%d x %d x %d\n', size(rgb_data));
fprintf('索引图像大小:%d x %d\n', size(indexed_data));
- 读入并在同一窗口显示27帧索引图像阵列“mri.mat”,并在单独窗口显示第6、10、20帧图像。
% 读入索引图像阵列
load('mri.mat'); % 确保 'mri.mat' 文件在你的MATLAB工作目录中
% 显示27帧索引图像在同一窗口
figure;
for i = 1:27
subplot(5, 6, i);
imshow(squeeze(D(:,:,1,i)), []); % 使用squeeze函数去除维度为1的维度
title(['Frame ' num2str(i)]);
end
sgtitle('All 27 Frames of MRI');
% 单独窗口显示第6、10、20帧图像
figure;
subplot(3, 1, 1);
imshow(squeeze(D(:,:,1,6)), []);
title('Frame 6');
subplot(3, 1, 2);
imshow(squeeze(D(:,:,1,10)), []);
title('Frame 10');
subplot(3, 1, 3);
imshow(squeeze(D(:,:,1,20)), []);
title('Frame 20');
- 制作并显示一个动态图。
% 创建一个新的图形窗口
figure;
% 设置动态图的x和y坐标范围
xlim([0, 10]);
ylim([-1, 1]);
% 创建一个动态线对象
line = animatedline('LineWidth', 2);
% 循环更新动态线的数据并显示
for x = 0:0.1:10
y = sin(x); % 计算y值
addpoints(line, x, y); % 添加新的坐标点到动态线
drawnow; % 更新图形窗口
end
四、问题与讨论
1.简述 MATLAB 软件的特点。
MATLAB是一款强大的高级技术计算软件,以其直观的编程环境、丰富的数值计算功能和广泛的工具箱而著称。其易用性、强大的数据可视化能力以及在教育和研究领域的广泛应用,使其成为科学计算和工程任务中不可或缺的工具,同时支持跨平台运行,具备与其他编程语言集成的灵活性。
- MATLAB软件可以支持哪些图像文件格式?
MATLAB软件支持多种常见图像文件格式,包括JPEG、PNG、BMP、GIF、TIFF、DICOM等,同时还支持一些其他格式,如HDF、JP2、PCX、XWD等。这些格式涵盖了从有损压缩到无压缩、从静态图像到动态图像的多种类型,能够满足各种图像处理和分析的需求。 MATLAB的图像处理工具箱提供了丰富的功能,可方便地处理和分析这些不同格式的图像数据。
- 说明函数imread() 的用途格式以及各种格式所得到图像的性质。
函数imread() 用于从图像文件中读取图像数据并将其存储为 MATLAB 中的数组。它支持多种图像文件格式,包括JPEG、PNG、BMP、GIF、TIFF、DICOM等。不同格式所得到的图像性质也各有不同,例如JPEG格式通常用于存储彩色图像,具有较小的文件大小和一定程度的有损压缩;PNG格式支持透明度和无损压缩,适合存储需要保持高质量的图像;BMP格式是一种无压缩位图格式,适合存储简单的图像数据;GIF格式支持动画和透明度;TIFF格式支持多页、多通道和无损压缩,适合存储复杂的图像数据;DICOM格式通常用于医学影像,包含了丰富的医学信息。通过imread()函数,可以方便地读取和处理不同格式的图像数据,满足各种图像处理和分析的需求。
- 为什么用I = imread(‘lena.bmp’) 命令得到的图像I 不可以进行算术运算?
当使用 I = imread('lena.bmp') 命令读取图像数据时,I 被存储为一个矩阵,其中包含了图像的像素值。这些像素值通常是无符号整数,代表了图像中每个像素的亮度或颜色信息。
- 如何显示 RGB 图像的某一个颜色分量?
RGB 图像通常由红色(R)、绿色(G)和蓝色(B)三个颜色通道组成。要显示 RGB 图像的某一个颜色分量,可以将其他两个颜色通道的像素值设置为零,只保留要显示的颜色通道的像素值。
6.如何显示多帧图像的所有帧?如何根据多帧图像创建电影片段?
在MATLAB中,可以使用implay函数来显示多帧图像的所有帧,便于直观查看图像序列。同时,通过创建VideoWriter对象,可以将多帧图像按顺序写入视频文件,实现创建电影片段的功能。这种方法能够方便地处理图像序列并生成可视化效果,适用于各种需要展示动态变化的场景,如视频处理、计算机视觉等应用领域。