图像处理简单操作函数的应用
一、 实验目的
1.了解 MATLAB图像处理工具箱函数中的基本功能及操作方法。
2.掌握MATLAB中图像读写和显示函数的使用方法。
3.掌握如何利用MATLAB函数获取图像大小、颜色、高度、宽度等信息。
4.熟悉常用的图像类型的相互转换。
二、实验内容和步骤
1.利用imread()函数分别读入图像trees.tif和ngc6543a.jpg,存入两个数组中,用“whos”命令获取图像的基本信息。
实验代码:
I1=imread('E:\实验一\trees.tif');
I2=imread('E:\实验一\ngc6543a.jpg');
whos I1;
whos I2;
实验结果:
2.利用imwrite()函数将图像trees.tif压缩,将其保存为一幅压缩了像素的jpg文件, 图像名为为trees1.jpg;
实验代码:
imwrite(I1,'E:\实验一\trees1.jpg');
实验结果:
3.命令窗口利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息。
实验代码:
ans=imfinfo ('E:\实验一\trees1.jpg')
实验结果:
4.在4个不同的图像窗口中显示任意4幅不同图像类型(二值、索引、灰度、真彩色)的图像。
实验代码:
figure(1);
RGB=imread('E:\实验一\onion.png');%彩度
imshow(RGB);
figure(2);
[X,map]=rgb2ind(imread('E:\实验一\onion.png'),8);%索引,最大65535
imshow(X,map);
figure(3);
I2=rgb2gray(imread('E:\实验一\onion.png'));%灰度
imshow(I2);
figure(4);
BW=im2bw(imread('E:\实验一\onion.png'));%二值
imshow(BW);
实验结果:
5.分别用imread和load命令读入两幅不同的图像,并排显示在同一图像窗口。
实验代码:
I=imread('E:\实验一\blobs.png');
subplot(1,2,1);
imshow(I);
load trees.mat;
subplot(1,2,2);
imshow(X,map);
实验结果:
6.利用imshow()函数来显示图像trees.tif,要求先转化为rgb图像,分别显示每个通道,然后合并再显示)
实验代码:
[I,map]=imread('E:\实验一\trees.tif');
I=ind2rgb(I,map);
RGB1=I;
RGB2=I;
RGB3=I;
RGB1(:,:,1);
RGB1(:,:,2)=0;
RGB1(:,:,3)=0;
RGB2(:,:,1)=0;
RGB2(:,:,2);
RGB2(:,:,3)=0;
RGB3(:,:,1)=0;
RGB3(:,:,2)=0;
RGB3(:,:,3);
subplot(2,2,1);
imshow(RGB1);
subplot(2,2,2);
imshow(RGB2);
subplot(2,2,3);
imshow(RGB3);
subplot(2,2,4);
I1=RGB1+RGB2+RGB3;
imshow(I1);
实验结果:
7.用rgb2gray()将一幅索引图像trees.tif转化为灰度图像,并且用imshow显示出来观察图像的特征。
实验代码:
I=imread('E:\实验一\trees.tif');
I=ind2gray(I,map);%索引转灰度
imshow(I);
实验结果:
8.用im2bw()将一幅灰度图像camema.jpg转化为二值图像,并且用imshow显示出来观察图像的特征。
实验代码:
I=imread('E:\实验一\cameraman.jpg');
I=im2bw(I);
imshow(I);
实验结果:
9.用rgb2ind()将真彩色图像onion.png转化为索引图像,用imshow显示出来,并读取出两种图像的数据,观察图像的特征。
实验代码:
I=imread('E:\实验一\onion.png');
subplot(1,2,1);
imshow(I);
[X,map]=rgb2ind(I,64);
subplot(1,2,2);
imshow(X,map);
实验结果:
10.读入并在同一窗口显示27帧索引图像阵列“mri.mat”,并在单独窗口显示第6、10、20帧图像。
实验代码:
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;
subplot(5,6,frame);
imshow(mri(:,:,:,frame),map);
end
figure;imshow(mri(:,:,:,6),map);
figure;imshow(mri(:,:,:,10),map);
figure;imshow(mri(:,:,:,20),map);
实验结果:
11.制作并显示一个动态图。
实验代码:
t = 0:0.1:2*pi;
x = 16*(sin(t)).^3;
y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t);
axis off;
M = moviein(20);
set(gcf,'color',[1 1 1]);
[A,map] = rgb2ind(frame2im(getframe),256);
imwrite(A,map,'E:\实验一\test2.gif','LoopCount',65535,'DelayTime',0.1);
h = animatedline('Color','r','LineWidth',3);
for k = 1:length(x)
addpoints(h,x(k),y(k));
axis([-20,20,-20,20])
[A,map] = rgb2ind(frame2im(getframe),256);
imwrite(A,map,'E:\实验一\test2.gif','WriteMode','append','DelayTime',0.1);
end;
实验结果:
三、 问题与讨论
1.简述 MATLAB 软件的特点。
答: (1) 高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来;
(2) 具有完备的图形处理功能,实现计算结果和编程的可视化;
(3) 友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握;
(4) 功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等) ,为用户提供了大量方便实用的处理工具。
2.MATLAB软件可以支持哪些图像文件格式?
答:⑴JPEG(Joint Photogyaphic Expeyts Group):一种称为联合图像专家组的图像压缩格式。
⑵BMP(Windows Bitmap):有1位、4位、8位、24位非压缩图像,8位RLE(Run length Encoded)的图像。文件内容包括文件头(一个BITMAP FILEHEADER数据结构)、位图信息数据块(位图信息头BITMAP INFOHEADER和一个颜色表)和图像数据。
⑶PCX(Windows Paintbrush):可处理1位、4位、8位、16位、24位等图像数据。文件内容包括文件头、图像数据和扩展色图数据。
⑷TIFF(Tagged Iamge File Format):处理1位、4位、8位、24位非压缩图像,1位、4位、8位、24位packbit压缩图像,1位CCITT压缩图像等。文件内容包括文件头、参数指针表与参数域、参数数据表和图像数据四部分。
⑸PNG(Portable Network Graphics):包括1位、2位、4位、8位和16位灰度图像,8位和16位索引图像,24位和48位真彩色图像。
⑹GIF(Graphics Interchange Format):任何1位到8位的可交换的图像。
⑺HDF(Hierarchial Data Format):有8位、24位光栅图像数据集。
⑻ICO(Windows Icon resource):有1位、4位、8位非压缩图像。
⑼CUR(Windows Cursor resource):有1位、4位、8位非压缩图像。
⑽XWD(X Windows Dump):包括1位、8位Zpixmaps,XYBitmaps,XYPixmmmaps。
⑾RAS(Sun Raster image):有1位bitmap、8位索引、24位真彩色和带有透明度的32位真彩色。
⑿PBM(Portable Bitmap)。
⒀PGM(Portable Graymap)。
⒁PPM(Portable Pixmap)。
3.说明函数imread() 的用途格式以及各种格式所得到图像的性质。
答:imread的常见调用格式为:
A = imread(filename,fmt)
其作用是将文件名用字符串filename表示的,扩展名用fmt表示的图像文件中的数据读到矩阵A中。如果filename所指的为灰度级图像,则A为一个二维矩阵;如果filename所指的为RGB图像,则A为一个m×n×3的三维矩阵。Filename表示的文件名必须在MATLAB的搜索路径范围内,否则需指出其完整路径。
imread的其他几种重要的调用格式为:
[X,map] = imread(filename.fmt)
[…] = imread(filename)
[…] = imread(URL,…)
[…] = imread(…,idx) (CUR,ICO and TIFF only)
[…] = imread(…,’frames’,idx) (GIF only)
[…] = imread(…,ref) (HDF only)
[…] = imread(…,’BackgroundColor’,BG) (PNG only)
[A,map,alpha] = imread(…) (ICO,CUR and PNG only)
上面一些参数的含义如下:idx是指读取图标(cur、ico、tiff)文件中第idx个图像,默认值为1。’frame’,idx是指读取gif文件中的图像帧,idx值可以是数量、向量或’all’。ref是指整数值。alpha是指透明度。
4.为什么用I = imread(‘lena.bmp’) 命令得到的图像I 不可以进行算术运算?
答:MATLAB系统默认的算术运算是针对双精度类型(double)的数据,而上述命令产生的矩阵的数据类型是无符号8位(MATLAB为图像提供的特殊的数据类型),直接进行运算会溢出。
- 如何显示 RGB 图像的某一个颜色分量?
答:读取图像I
I(:,:,1)=a;
I(:,:,2)=b;
I(:,:,3)=c;
红色bc赋0,绿色ac赋0,蓝色ab赋0
6.如何显示多帧图像的所有帧?如何根据多帧图像创建电影片段?
答: imshow(mri(:,:,:,frame),map);单位时间内显示图像大于24帧。
四、总结
1.实验收获(即通过实验学会了什么)
首先通过实验,我了解到了MATLAB图像处理工具箱函数中的基本功能及操作方法,学会了基础的图像读写和显示函数的使用方法,掌握了常用的图像类型的相互转换。对于MATLAB这个工具有了最基础最根本的了解,为后续的软件的使用打下了基础。
2.实验不足(即通过实验发现哪些方面还没有掌握)
首先是那些图像类型转换不是很熟练,经常使用出错,对那些常用的函数记不住,其次便是显示连续帧和动图制作方面有点不太明白,是自己较为薄弱的地方,还需要在多练习练习。