【MATLAB Image Processing Toolbox 入门教程四】“导入、导出和转换”之“基于文件读写图像数据”


本博客编辑在出差期间,项目所在企业的招待所只有靠近大厅的第一间房间能连上WiFi,很不幸我住在二楼,靠着一台笔记本和速度并不快的手机热点在不同网页之间艰难切换,但求知之路本就艰辛和漫长,享受其中就好。
从本博客开始,我们将开始系统性的MATLAB Image Processing Toolbox的学习。
快速入门系列请参考之前的三篇博客:
【MATLAB Image Processing Toolbox 入门教程一】快速入门之“图像导入导出”与“检测图像中的圆”

【MATLAB Image Processing Toolbox 入门教程二】快速入门之“亮度校正”和“目标识别”

【MATLAB Image Processing Toolbox 入门教程三】快速入门之“在多光谱图像中寻找植被”


一、基于文件读写图像数据

Image Processing Toolbox可以读取和写入许多常见文件格式的图像文件,包括 BMP、GIF、JPEG、PNG 和 TIFF。同时支持读取和写入医疗文件格式,包括 DICOM、NifTI 和 Analyze 7.5。还可以处理特殊文件格式的图像,包括 NITF、DPX 和 Interfile。

二、一般文件的导入和导出

2.1 imread函数

2.1.1 imread函数使用语法和含义

【MATLAB Image Processing Toolbox 入门教程一】快速入门之“图像导入导出”与“检测图像中的圆”中我们已经简单了解了imread函数的使用方法,接下来我们将深入研究imread函数,对其各个用法进行详细说明和示例。
首先,我们需要了解imread函数的使用语法和含义,语法中的参数我们会在介绍完语法之后单独拎出来讲解。

  • A=imread(filename):典型的imread函数使用方法,从filename指定的文件中读取图像,并自动推断其格式。如果filename为多图像文件,则imread函数读取该文件中的第一张图像。
  • A=imread(filename,fmt):另外指定具有fmt的标准文件扩展名的文件。如果imread找不到filename指定名称的文件,则会查找名为filename。fmt的文件。
  • A=imread(__,idx):从多图像文件中读取指定的图像,此语句只适用于GIF(Graphics Interchange Format 图形交换格式)/PGM(Portable GrayMap 可移植灰度图像)/PBM(Portable BitMap 可移植位图)/PPM(Portable PixMap 可移植像素图像)/CUR(光标文件)/ICO(图标文件)/TIFF(Tag Image File Format 标签图像文件格式)/HDF4(Hierarchical Data Format 可以存储不同类型的图像和数码数据的文件格式)文件,__中必须指定filename,也可以指定fmt。
  • A=imread(__,Name,Value):此语法中的Name和对应的Value我们会在下面详细讲解。
  • [A,map]=imread(__):将filename中的索引图像读入A,并将其关联的颜色图读入map,图像文件中的颜色图值会自动重新调整到范围[0,1]中。
  • [A,map,transparency]=imread(__):是上面语法的延伸,除了返回A和map,还会返回图像透明度,此语法仅适用于PNG/CUR/ICO文件。

2.1.2 imread函数输入输出参数详解

讲解了imread的使用语法和含义后,接下来对输入参数以及返回参数做详细介绍。
首先是输入参数:

  1. filename 图形文件的名称,用字符向量或字符串标量表示。对于MATLAB路径文件夹上的文件,可以直接指定文件名称,例如’myImage.jpg’;对于不在MATLAB路径文件夹上的文件,则需要指定完整或相对路径名称,例如’C:\myFolder\myImage.ext’,’\imgDir\myImage.ext’;如果文件是通过Internet URL定位的,则filename需要包含协议类型,例如’http://hostname/path_to_file/myImage.jpg’。

  2. fmt 图像格式,指定为标准文件扩展名的字符向量或字符串标量。调用imformats可以查看支持的格式及其文件扩展名列表。我们在MATLAB命令行窗口中输入’imformats’,可以看到如下的支持格式。在这里插入图片描述

  3. idx 指定要读取的图像,此参数仅支持GIF/CUR/ICO/HDF4文件。对于GIF文件,idx指定为整数向量,其余文件格式idx为整数标量。例如,若idx为3,imread函数返回文件的第三个图像;对于GIF文件,若idx为1:5,则imread函数仅返回前五帧。

  4. Name-Value 有以下几个参数及其对应的参数值:
    ① 对于GIF文件,有一个参数’Frames’,指定要读取的帧数,默认为1,还可以指定为正整数、整数向量或all。指定正整数则返回GIF文件的某一帧,指定整数向量则返回GIF文件的某几帧,若要返回几个不连续的帧,则在不同的整数向量中以逗号间隔,指定all,则imread函数读取所有帧并按其在文件中显示的顺序返回这些帧。
    ②对于JPEG 2000文件,有三个参数,分别为
    1 PixelRegion 要读取的子图像,指定为包含’PixelRegion’和’{rows,cols}‘形式的元胞数组的逗号分隔对组。rows指定读取的行范围,cols指定读取的列范围。例如:‘PixelRegion’,{[4 500],[1 100]}。
    2 ReductionLevel 此参数用于降低图像分辨率。对于约简级别L,图像的分辨率按照2^L进行约简。例如:‘ReductionLevel’,5.
    ③对于PNG文件,有一个参数’BackgroundColor’,指定图像的背景色,对应的 value有’none’、整数或三元素整数向量。若指定为none,则imread对图像不进行任何操作。若指定为其他两个参数,那么imread将透明像素与背景色混合,其中,对于灰度图像,则’BackgroundColor’指定为[0,1]中的整数,很显然,只能指定为0或1;对于RGB图像,BackgroundColor 的值必须为三元素向量,其中的值介于 [0,1] 范围内。
    ④对于TIFF文件,有两个对应参数
    1 Index 指定要读取的图像,value为1(默认)或其他正整数。例如若Index为3,则读取文件的第三个图像。
    2 PixelRegion 指定读取的区域边界。对应的value为{rows,cols}形式的元胞数组,rows指定读取的行的范围,cols指定读取的列范围。rows和cols有两种指定形式,第一种是二元素向量[start stop],用于指定读取的起始行、终止行和起始列、终止列,例如,‘PixelRegion’,{[1 2],[3 4]} 读取图像数据的第 1 和第 2 行以及第 3 和第 4 列界定的区域。第二种是三元素向量[start increment stop],用于指定读取的起始行、终止行和起始列、终止列,同时还指定了采样的步长。例如,‘PixelRegion’,{[1 2 100],[4 3 12]}读取由第 1 和第 100 行以及第 4 和第 12 列界定的区域,在垂直方向每隔 2 个像素进行数据采样,在水平方向每隔 3 个像素进行数据抽样。

讲完了输入参数,接下来讲解输出参数。

  1. A 所读取的图像数据,以数组的形式返回。若读取的是灰度图像,则A为m×n的数组,若读取RGB图像,则A为m×n×3的数组。若读取索引图像,则A为m×n的数组,其中的索引值对应于 map 中该索引处的颜色。
  2. map 与 A 中的索引图像数据关联的颜色图,以 m×3 的 double 类矩阵形式返回。
  3. transparency 以矩阵形式返回的透明度信息。一般很少用到,就不做详述。

2.1.3 imread函数用法示例

1.使用imread读取工作路径下的图片并显示:

a=imread(1.png); %1.png是工作路径下的图片名称
image(a); %也可以用imshow(a)

在这里插入图片描述

2.使用imread读取索引图像并转换为RGB显示

[X,cmap]=imread('corn.tif');
RGB=ind2rgb(X,cmap);
imshow(RGB);

在这里插入图片描述

3.读取TIFF文件的特定区域

A=imread('corn.tif','PixelRegion',{[1 4],[2 4]});

2.2 imwrite函数

2.2.1 imwrite函数使用语法和含义

imwrite函数的作用是将图片写入文件中,和imread函数一样,我们先来了解imwrite函数的用法及其含义。

  • imwrite(A,filename) 将图像数据 A 写入 filename 指定的文件,并从扩展名推断出文件格式。imwrite 在当前文件夹中创建新文件。输出图像的位深取决于 A 的数据类型和文件格式。
  • imwrite(A,map,filename) 将 A 中的索引图像及其关联的颜色图map写入由filename 指定的文件。
  • imwrite(___,fmt) 以 fmt 指定的格式写入图像,无论 filename 中的文件扩展名是什么,最后都将转为fmt指定的文件类型。
  • imwrite(___,Name,Value) 此语句中Name及对应的Value会在下面进行详解。

2.2.2 imwrite函数输入参数详解

在对imwrite函数的语法和含义进行讲解之后,接下来我们对其中的各种输入参数进行详细讲解。

  1. A:要输入的图像数据
    对灰度图像而言,A 是 m×n矩阵。
    对索引图像而言,A 是 m×n矩阵,另外需要指定相关的颜色图map。
    对真彩色图像而言,A 必须是 m×n×3 的矩阵。注意,imwrite 不支持将 RGB 图像写入 GIF 文件。
  2. filename:输出文件的名称,一般指定为字符串标量
    若输出到当前文件夹,则filename指定为文件名,例如’myImage.jpg’;
    若输出到其他文件夹,则filename指定为完整或相对路径名称。例如’C:\myFolder\myImage.ext’。
  3. fmt:用于指定输出文件的格式,我们想要保存的格式一般都有,所以这里就不做赘述。
  4. map:索引图像的颜色图colormap。我们可以直接指定颜色图的名称来设置colormap,也可以用三维矩阵来指定颜色图。在这里插入图片描述
    在这里插入图片描述
  5. Name-Value
    此参数对不同类型的图片都对应不同的参数,参数太多,逐个讲完篇幅太大而且看完就忘,不如对着例子看来的实在,或者到了真正需要的时候,可以针对所处理的图像类型进行专门的了解。有兴趣的同学可以参考:imwrite函数使用说明

2.2.3 imwrite函数使用示例

  1. 将灰度图像写入当前工作路径中
A=rand(50);
imwrite(A,'gray.png');

在这里插入图片描述
可以看出,gray.png就存在于当前路径中,我们可以直接读入并显示:

B=imread('gray.png');
imshow(B);

在这里插入图片描述

  1. 将索引图像写入png文件
    首先将索引图像加载到当前工作区:
load clown.mat;

在这里插入图片描述
接着,我们将图像数据写入png文件:

imwrite(X,map,'clown.png');

在这里插入图片描述
在文件夹中双击图片打开:
在这里插入图片描述
索引图已经顺利地保存进png文件中。

  1. 将新的colormap写入索引图
    依然使用的是clown.mat示例图片,将其载入工作区后,创建一个新的colormap并将其写入索引图中:
load clown.mat;
newmap=copper(81); %81 RGB 向量定义铜色调颜色图
imwrite(X,newmap,'newclown.png');

在文件夹中双击打开newclown.png:
在这里插入图片描述
可以看出,成功将新的背景图写入索引图中。

  1. 将真彩色图写入JPEG文件
    首先创建一个随机的81×81×3的RGB数组:
A=rand(81,81);
A(:,:,2)=rand(81,81);
A(:,:,3)=rand(81,81);

接下来用imwrite函数将A写入JPEG文件,并使用fmt指定文件类型,使用‘Comment’参数为文件添加注释。

imwrite(A,'rgb.jpg','jpg','Comment','My RGB JPEG file');

在这里插入图片描述

可以看出,rgb.jpg已经保存到当前路径中,双击打开:
在这里插入图片描述

接着,我们用imfinfo函数查看rgb.jpg的相关信息:

imfinfo(rgb.jpg);

在这里插入图片描述

  1. 绘制GIF图像
    在此示例中,我们绘制y=x^n的图像,改变n的值,将曲线的变化绘制成GIF图像。
    首先,我们先绘制y=x^3的图像:
x=0:0.01:1;
n=3;
y=x.^n;
plot(x,y,'LineWidth',3);
title(['y = x^n,  n = ' num2str(n) ]);

在这里插入图片描述

接着,我们将n变化时,y=x^n的一系列图像捕获下来,并展示出来:

n=1:0.5:5;
x=0:0.01:1;
nImages=length(n); %获取n的数目
fig=figure;
for idx=1:nImages
y=x^n(idx);
plot(x,y,'LineWidth',3)
title(['y = x^n,  n = ' num2str(n(idx)) ])
drawnow %更新图窗并处理任何挂起的回调。如果您修改图形对象并且需要在屏幕上立即查看这次更新,请使用该命令。
frame=getframe(fig); %捕获由 fig 标识的图窗,捕获的影片帧不包括图窗菜单和工具栏,包括标题、标签和刻度线。
im{idx}=frame2im(frame); %将单个影片帧转为RGB图像
end
close;
figure;
for idx=1:nImages
subplot(3,3,idx);
imshow(im{idx});
end

在这里插入图片描述
因为GIF文件不支持三维的数据,所以需要使用rgb2ind函数将rgb图像转化为索引图像,rgb2ind函数的一般使用方法为:

[X,cmap] = rgb2ind(RGB,Q)  %使用具有 Q 种量化颜色的最小方差量化法并加入抖动,将 RGB 图像转换为索引图像 X,关联颜色图为 cmap。通俗点说,Q为多少,转换成的索引图像就有多少种颜色。

接下来,我们对GIF文件的imwrite函数中几个重要的Name-Value参数进行讲解:

  • ‘DelayTime’ :显示下一个图像之间的时滞,单位为秒,默认为0.5,可以指定为[0 655]之间的任何标量,若指定为0,则按照硬件允许的最快速度显示。
  • ‘LoopCount’:动画重复的次数,默认为’Inf’,含义是动画循环播放,也可以指定为[0,65535]之间的任意整数,循环次数为指定值+1。
  • ‘WriteMode’:指定写入模式,有两个参数值:‘overwrite’(default)和’append’。在 overwrite 模式下,imwrite 覆盖现有文件 filename。在 append 模式下,imwrite 会向现有文件添加单个帧。

了解了以上内容后,接下来我们将9张图像保存到一个GIF文件中:

filename='MyTest.gif';
for idx=1:nImages
[A,map]=rgb2ind(im{idx},256);
if idx==1
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);
else
 imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);
end
end

在这里插入图片描述
MyTest.gif文件已经保存到当前工作文件夹中,双击打开:
在这里插入图片描述
可以看出,GIF动画是循环播放的,且每帧之间的时滞为1秒。

2.3 imfinfo函数

imfinfo函数的常见使用形式为:

info = imfinfo(filename) 返回一个结构体,该结构体的字段包含有关图形文件 filename 中的图像的信息。
如果filename为包含多个图像的文件,则info是一个结构体数组,每个元素对应文件中的一个图像,例如info(3)包含文件中第三个图像的信息。

imfinfo函数返回的参数及含义如下所示:
在这里插入图片描述

至此,基于文件读写数据就讲解完毕了,这一章写的很艰难,除了慢的一比的4G网,更多的是内心的挣扎,这一章的内容表面上看很基础,但也有很复杂的地方,总感觉什么时候会用到但又感觉用不到,一直处于到底是往里钻研还是直接跳过的挣扎。不过还好,本章也顺利结束,也并没有敷衍,还是有小小的成就感。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值