【数字图像】实验一.MATLAB图像简单操作函数的应用

一、实验目的

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);
  1. 制作并显示一个动态图。
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是一个功能强大、易于使用的科学计算和工程分析软件,它为用户提供了丰富的功能和工具,使得他们可以进行各种计算、分析和可视化任务。

  1. 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还提供了扩展包和工具箱,可以进行相应的导入和导出操作。 

  1. 说明函数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中进行进一步的处理和分析。

  1. 为什么用I = imread(‘lena.bmp’) 命令得到的图像I 不可以进行算术运算?

使用imread('lena.bmp')命令读取的图像I是一个三维矩阵,其中每个元素表示图像中对应像素的颜色值。这些颜色值是以无符号8位整数的形式存储的,范围从0到255。这意味着图像I中的每个像素值都是离散的,它们不能直接参与算术运算。

  1. 如何显示 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`函数关闭输出视频文件。

  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值