一、实验目的
1. 了解 MATLAB图像处理工具箱函数中的基本功能及操作方法。
2. 掌握MATLAB中图像读写和显示函数的使用方法。
3. 掌握如何利用MATLAB函数获取图像大小、颜色、高度、宽度等信息。
4. 熟悉常用的图像类型的相互转换。
二、实验要求
1. 实验课前需要写预习实验报告,内容为本次实验要求中的所有程序清单。
2. 实验课对预习报告中的编程代码进行上机调试,完成实验指导书中全部实验要求内容。
3. 实验课后写出实验报告。报告要求有实验目的,实验内容与步骤,调试完成的准确编程代码和实验结果,实验小结,回答问题。
三、实验内容与步骤
1.利用imread()函数分别读入图像trees.tif和ngc6543a.jpg,存入两个数组中,用“whos”命令获取图像的基本信息。
存入两个数组
T=imread("trees.tif");
N=imread("ngc6543a.jpg")
Whos查看基本属性
whos
![]() |
2.利用imwrite()函数将图像trees.tif压缩,将其保存为一幅压缩了像素的jpg文件, 图像名为为trees1.jpg;
imwrite(T,'trees1.jpg')
3.命令窗口利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息。
>> info=imfinfo('trees1.jpg','jpg')
info =
包含以下字段的 struct:
Filename: 'D:\MATLAB\data\trees1.jpg'
FileModDate: '21-Nov-2023 16:24:29'
FileSize: 14108
Format: 'jpg'
FormatVersion: ''
Width: 350
Height: 258
BitDepth: 8
ColorType: 'grayscale'
FormatSignature: ''
NumberOfSamples: 1
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}
4.在4个不同的图像窗口中显示任意4幅不同图像类型(二值、索引、灰度、真彩色)的图像。
figure(1);
I=imread("trees.tif");
imshow(I);
figure(2);
[X map]=imread("mri.tif");
imshow(X,map);
figure(3);
RGB=imread("blobs.png");
imshow(RGB);
figure(4);
imshow Lenna.jpg
![]() |
5.分别用imread和load命令读入两幅不同的图像,并排显示在同一图像窗口。
B=imread("trees.tif");
save trees B
load trees.mat
subplot(1,2,1);
imshow(X,map);
title('trees.mat')
[X2,map2]=imread("mri.tif");
subplot(1,2,2);
imshow(X2,map2);
title('mri.tif')
![]() |
6.利用imshow()函数来显示图像trees.tif,要求先转化为rgb图像,分别显示每个通道,然后合并再显示)
image = imread('trees.tif');
rgb_image = ind2rgb(image, colormap);
red_channel = rgb_image(:, :, 1);
green_channel = rgb_image(:, :, 2);
blue_channel = rgb_image(:, :, 3);
figure;
subplot(2, 2, 1);
imshow(red_channel);
title('Red Channel');
subplot(2, 2, 2);
imshow(green_channel);
title('Green Channel');
subplot(2, 2, 3);
imshow(blue_channel);
title('Blue Channel');
subplot(2, 2, 4);
imshow(rgb_image);
title('RGB Image');
![]() |
7.用rgb2gray()将一幅索引图像trees.tif转化为灰度图像,并且用imshow显示出来观察图像的特征。
[X,map]=imread('trees.tif');
G1=ind2gray(X,map);
figure;
imshow(G1);
![]() |
8.用im2bw()将一幅灰度图像camema.jpg转化为二值图像,并且用imshow显示出来观察图像的特征。
B=imread("cameraman.bmp");
B1=im2bw(B);
imshow(B1)
9.用rgb2ind()将真彩色图像onion.png转化为索引图像,用imshow显示出来,并读取出两种图像的数据,观察图像的特征。
clear all;
C=imread("onion.png");
[X,map] = rgb2ind(C,32);
figure;
imshow(C);
figure;
imshow(X,map);
![]() |
10.读入并在同一窗口显示27帧索引图像阵列“mri.mat”,并在单独窗口显示第6、10、20帧图像。
clear all;
mri=uint8(zeros(128,128,1,27));
for frame=1:27
[mri(:,:,:,frame),map]=imread('mri.tif',frame);
end
figure,imshow(mri(:,:,:,6),map);
figure,imshow(mri(:,:,:,10),map);
figure,imshow(mri(:,:,:,20),map);
figure;
montage(mri,map);
![]() |
- 制作并显示一个动态图。
clear all;
mri=uint8(zeros(128,128,1,27));
for frame=1:27
[mri(:,:,:,frame),map]=imread('mri.tif',frame);
end
figure;
hold on;
for frame=1:27
hold on;imshow(mri(:,:,:,frame),map);
pause(0.1)
end
四、问题与讨论
1.简述 MATLAB 软件的特点。
MATLAB是一种功能强大的科学计算和工程分析软件,它具有以下特点:
1. 简单易用:MATLAB提供了直观的交互式界面和丰富的文档,使得用户可以快速学习和使用。它使用简单的命令语法,使得编写和执行代码变得简单。
2. 广泛的功能:MATLAB具有广泛的功能和工具箱,涵盖了数值计算、数据可视化、信号处理、图像处理、控制系统设计、机器学习等多个领域。用户可以根据需要选择适合的工具箱来完成各种任务。
3. 大量的库和函数:MATLAB拥有丰富的库和函数,用于处理各种数学运算、数据分析和图像处理。这些库和函数可以大大简化复杂的计算任务,并提高开发效率。
4. 图形和可视化:MATLAB具有强大的图形和可视化功能,可以生成高质量的图表、图像和动画。用户可以使用内置的绘图函数和工具来可视化数据,进行数据分析和展示。
5. 平台和语言的灵活性:MATLAB可以在不同的操作系统上运行,包括Windows、Mac和Linux。此外,MATLAB还支持多种编程语言,如MATLAB脚本语言、MATLAB函数语言和MATLAB面向对象编程等,使得用户可以根据自己的需求和偏好选择适合的编程方式。
6. 集成开发环境(IDE):MATLAB提供了一个集成开发环境,包括编辑器、调试器和性能分析器等工具,使得代码编写、调试和优化变得更加方便和高效。
总的来说,MATLAB是一个功能强大、易于使用的科学计算和工程分析软件,它为用户提供了丰富的功能和工具,使得他们可以进行各种计算、分析和可视化任务。
- MATLAB软件可以支持哪些图像文件格式?
MATLAB软件可以支持多种常见的图像文件格式,包括但不限于:
1. BMP(.bmp):Windows位图格式。
2. JPEG(.jpg、.jpeg):常用的压缩图像格式。
3. PNG(.png):无损压缩图像格式,支持透明度。
4. GIF(.gif):支持多帧动画的图像格式。
5. TIFF(.tif、.tiff):多页图像格式,支持无损压缩。
6. JPEG 2000(.jp2):基于无损和有损压缩的图像格式。
7. DICOM(.dcm):医学图像格式,常用于医学影像处理。
8. RAW(.raw):未经压缩或处理的原始图像数据。
此外,MATLAB还支持其他一些特定领域的图像文件格式,如HDR(高动态范围)图像、光谱图像等。如果需要处理其他特定格式的图像文件,MATLAB还提供了扩展包和工具箱,可以进行相应的导入和导出操作。
- 说明函数imread() 的用途格式以及各种格式所得到图像的性质。
函数imread()是MATLAB中用于读取图像文件的函数。它的语法为:
I = imread(filename)
其中,filename为要读取的图像文件的路径和文件名,I为读取得到的图像数据。
imread()函数可以读取多种图像格式,包括但不限于:
1. BMP(.bmp):读取得到的图像是RGB格式的,每个像素由红色、绿色和蓝色通道组成。
2. JPEG(.jpg、.jpeg):读取得到的图像是RGB格式的,每个像素由红色、绿色和蓝色通道组成。JPEG是一种有损压缩格式,可能会导致图像质量损失。
3. PNG(.png):读取得到的图像是RGB格式的,每个像素由红色、绿色和蓝色通道组成。PNG是一种无损压缩格式,可以保持图像质量。
4. GIF(.gif):读取得到的图像是索引格式的,每个像素由调色板中的索引值表示。GIF可以是多帧动画图像,但imread()函数只会读取第一帧。
5. TIFF(.tif、.tiff):读取得到的图像可以是RGB格式或者灰度格式。对于多页TIFF图像,可以通过指定第二个输入参数来读取指定页的图像。
6. JPEG 2000(.jp2):读取得到的图像是RGB格式的,每个像素由红色、绿色和蓝色通道组成。JPEG 2000是一种有损和无损压缩格式。
imread()函数会根据图像文件的格式,返回相应的图像数据。读取得到的图像可以是RGB格式(彩色图像)或灰度格式(黑白图像)。对于RGB格式的图像,图像数据是一个三维数组,其中第一个维度表示行数,第二个维度表示列数,第三个维度表示通道数(红色、绿色、蓝色)。对于灰度格式的图像,图像数据是一个二维数组,每个元素表示灰度值。
通过使用imread()函数,可以方便地将各种图像格式的文件读取到MATLAB中进行进一步的处理和分析。
- 为什么用I = imread(‘lena.bmp’) 命令得到的图像I 不可以进行算术运算?
使用imread('lena.bmp')命令读取的图像I是一个三维矩阵,其中每个元素表示图像中对应像素的颜色值。这些颜色值是以无符号8位整数的形式存储的,范围从0到255。这意味着图像I中的每个像素值都是离散的,它们不能直接参与算术运算。
- 如何显示 RGB 图像的某一个颜色分量?
以下是一个示例代码,展示了如何显示RGB图像的红色分量:
matlab
I = imread('lena.bmp');
redChannel = I(:,:,1); % 获取图像的红色通道
imshow(redChannel); % 显示红色分量图像
在上面的代码中,`I(:,:,1)`用于获取图像I的红色通道,其中`1`表示红色通道的索引。类似地,您可以使用`I(:,:,2)`获取绿色通道,使用`I(:,:,3)`获取蓝色通道。
6.如何显示多帧图像的所有帧?如何根据多帧图像创建电影片段?
以下是一个示例代码,展示了如何显示多帧图像的所有帧和创建电影片段:
matlab
% 读取多帧图像序列
imageFiles = dir('frames/*.bmp'); % 假设图像序列存储在名为"frames"的文件夹中
numFrames = length(imageFiles); % 获取图像序列的帧数
% 显示多帧图像的所有帧
for i = 1:numFrames
filename = fullfile('frames', imageFiles(i).name);
I = imread(filename);
imshow(I);
pause(0.1); % 可以调整这个值来控制每帧的显示时间
end
% 创建电影片段
outputVideo = VideoWriter('movie.mp4', 'MPEG-4'); % 定义输出视频文件名和编码格式
open(outputVideo); % 打开输出视频文件
for i = 1:numFrames
filename = fullfile('frames', imageFiles(i).name);
I = imread(filename);
writeVideo(outputVideo, I); % 将每帧图像写入输出视频文件
end
close(outputVideo); % 关闭输出视频文件
在上面的代码中,首先使用`dir`函数获取存储图像序列的文件夹中的所有图像文件。然后,使用循环逐一读取每个图像,显示每一帧图像。在循环中,通过`imshow`函数显示图像,并使用`pause`函数来控制每帧图像的显示时间。
在创建电影片段部分,首先使用`VideoWriter`函数定义输出视频文件的名称和编码格式。然后,使用`open`函数打开输出视频文件。接着,使用循环逐一读取每个图像,并使用`writeVideo`函数将每帧图像写入输出视频文件。最后,使用`close`函数关闭输出视频文件。