一、实验目的
1.了解 Matlab图像处理工具箱函数中的基本功能及操作方法;
2.掌握Matlab中图像读写和显示函数的使用方法;
3.掌握如何利用MATLAB函数获取图像大小、颜色、高度、宽度等信息。
4.掌握 Matlab 支持的图像的显示方法(灰度、索引、二值、彩色等);
5.熟悉常用的图像文件格式的相互转换。
二、实验要求
1.实验课前需要写预习实验报告,内容为本次实验要求中的所有程序清单。
2.实验课对预习报告中的编程代码进行上机调试,完成实验指导书中全部实验要求内容。
3.实验课后写出实验报告。报告要求有实验目的,实验内容与步骤,调试完成的准确编程代码,实验小结,回答问题。
三、实验内容与步骤
1.图像读写
(1)利用imread()函数分别读入图像trees.tif和ngc6543a.jpg,存入两个数组中,用“whos”命令获取图像的基本信息。
代码:
clear
[I1 map]= imread('trees.tif'); %I1为258x350矩阵 类型为uint8,索引图像
I2 = imread('ngc6543a.jpg'); %I2为650x600x3矩阵 类型为uint8,真彩色图像
whos I1 I2
%whos 按字母顺序列出当前活动工作区中的所有变量的名称、大小和类型。
%whos ___ var1 ... varN 只列出指定的变量。此语法与先前语法中的任何参数结合使用。
运行结果:
(2)利用imwrite()函数将图像trees.tif压缩,将其保存为一幅压缩了像素的jpg文件, 图像名为为trees1.jpg;
代码:
clear
[I map] = imread('trees.tif'); % %I为258x350矩阵类型为uint8,1738KB
imwrite(I,map,'trees1.jpg'); % trees1.jpg保存于当前工作路径下,26KB
运行结果:
生成trees1.jpg
(3)命令窗口利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息。
代码:
imfinfo('trees1.jpg')
运行结果:
2.图像的显示和格式转换
(4)在4个不同的图像窗口中显示任意5幅不同图像类型(二值、索引、灰度、真彩色)的图像。
代码:
clear
figure(1);
BW=imread('blobs.png'); %二值图象
imshow(BW);
figure(2);
[X map]=imread('trees.tif'); %索引图像
imshow(X,map);
figure(3);
RGB=imread('onion.png'); %真彩色图象
imshow(RGB);
figure(4);
I=imread('cameraman.jpg'); %灰度图象
imshow(I);
运行结果:
(5)分别用imread和load命令读入两幅不同的图像,并排显示在同一图像窗口。
代码:
clear
load trees.mat
subplot(1,2,1);
subimage(X,map);
title('trees.mat')
[X2 map2]=imread('forest.tif');
subplot(1,2,2);
subimage(X2,map2);
title('forest.tif')
运行结果:
(6)利用imshow()函数来显示图像trees.tif,要求先转化为rgb图像,分别显示每个通道,然后合并再显示)
代码:
%% RGB图像通道分离
clear
[X,cmap] = imread('trees.tif');
RGB = ind2rgb(X,cmap);
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
subplot(2,2,1),imshow(R)
subplot(2,2,2),imshow(G)
subplot(2,2,3),imshow(B)
subplot(2,2,4),imshow(RGB)
%% RGB图像各通道合并
I(:,:,1) = R;
I(:,:,2) = G;
I(:,:,3) = B;
imshow(I)
运行结果:
(7)用rgb2gray()将彩色图像trees.tif转化为灰度图像,并且用imshow显示出来观察图像的特征。
代码:
% 方法1 先将trees.tif转换成RGB图像,再使用rgb2gray()转化为灰度图像
[X,cmap] = imread('trees.tif');
RGB = ind2rgb(X,cmap);
gray = rgb2gray(RGB);
imshow(gray)
%方法2 读取具有 RGB 颜色图的索引图像,然后将颜色图转换为灰度。
[X,cmap] = imread('trees.tif');
newcmap = rgb2gray(cmap);
imshow(X,newcmap)
运行结果:
(8)用im2bw()将一幅灰度图像camema.jpg转化为二值图像,并且用imshow显示出来观察图像的特征。
代码:
%% 方法1
I = imread('cameraman.jpg');
level = graythresh(I) % 计算亮度阈值
BW1 = im2bw(I,level);
subplot(1,2,1),imshow(I)
subplot(1,2,2),imshow(BW1)
%%level =
0.3451
运行结果:
(9)用rgb2ind()将彩色图像onion.png转化为索引图像,用imshow显示出来,并读取出两种图像的数据,观察图像的特征。
代码:
clear
RGB = imread('onion.png');
[ind,map] = rgb2ind(RGB,256);
imshow(RGB)
figure,imshow(ind,map)
运行结果:
(10)显示多帧图像。首先用随机矩阵生成一个27帧图像,再读入并显示多帧图像,单独显示第6、10、20帧图像。
代码:
clear
mri=uint8(zeros(128,128,1,27)); % 27 帧文件 mri.tif 初始化
for frame=1:27
[mri(:,:,:,frame),map]=imread('mri.tif',frame); % 读入每一帧
end
imshow(mri(:,:,:,3),map); % 显示第 3 帧
figure,imshow(mri(:,:,:,6),map); % 显示第 6 帧
figure,imshow(mri(:,:,:,10),map); % 显示第 10 帧
figure,imshow(mri(:,:,:,20),map); % 显示第 20 帧
运行结果:
(11)制作并显示一个动态图。
代码:
clear
load mri.mat
figure(1)
montage(D,map)
mov = immovie(D,map);
movie(mov)
运行结果:
四、思考题
1.简述 Matlab 软件的特点。
答:(1)高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来;
(2)具有完备的图形处理功能,实现计算结果和编程的可视化;
(3)友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握;
(4)功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等) ,为用户提供了大量方便实用的处理工具。
2. Matlab软件可以支持哪些图像文件格式?
答:JPEG、BMP 、PCX、TIFF 、PNG 、GIF 、HDF 、ICO 、CUR 、XWD、RAS 、PBM 、PGM 、PPM等
3.说明函数imread() 的用途格式以及各种格式所得到图像的性质。
答:函数imread()是一个常用的图像处理函数,用于从文件中读取图像数据。它的主要用途是将图像文件加载到内存中进行后续的处理和分析。
imread()函数可以读取多种图像格式的文件,常见的格式包括:
(1)JPEG(.jpg、.jpeg):这是一种常见的压缩格式,适用于存储照片和彩色图像。读取JPEG格式图像时,imread()函数会返回3通道的彩色图像。
(2)PNG(.png):这是一种无损压缩格式,适用于存储透明图像和图标等。读取PNG格式图像时,imread()函数会返回3或4通道的彩色图像,其中第四个通道表示透明度。
(3)BMP(.bmp):这是一种无压缩的位图格式,适用于存储简单的图像。读取BMP格式图像时,imread()函数会返回1通道的灰度图像或者3通道的彩色图像。
(4)GIF(.gif):这是一种支持动画的格式,但imread()函数只能读取其中的一帧静态图像。读取GIF格式图像时,imread()函数会返回3通道的彩色图像。
(5)TIFF(.tif、.tiff):这是一种高质量的图像格式,适用于存储印刷品和医学图像等。读取TIFF格式图像时,imread()函数会根据具体情况返回1或3通道的灰度或彩色图像。
通过imread()函数读取图像后,可以进一步使用其他函数对图像进行处理,例如调整大小、旋转、裁剪、滤波等。具体处理方法和性质取决于所使用的图像处理库和算法。
4.为什么用I = imread(‘lena.bmp’) 命令得到的图像I 不可以进行算术运算?
答:因为图像I产生的矩阵的数据类型是无符号位8位,直接计算会溢出,而matlab默认计算针对的是double类型的数据。
5.如何显示 RGB 图像的某一个颜色分量?
答:imshow(I(:,:,x))其中I代表读出的图片,x有1,2,3分别指R,G,B三通道。
6.如何显示多帧图像的所有帧?如何根据多帧图像创建电影片段?
答:(1)用imshow(mri(:,:,:,frame),map)即可显示多帧图像的所有帧。
(2)用mov=immovie(mri,map);implay(mov)即可根据多帧图像创建电影片段。