数字图像处理(MATLAB版) 表2.1 MATLAB6.5中的函数imread和imwrite所支持的一些常用图像/围形格 式。早期版本支持这些格式的子集。所支持格式的完整清单请参阅在线帮助 格式名称 描迷 一可识别扩展籽 加标识的图像文件格式 .tif,.tiff PEG 联合国像专家组 ,jp9,·Jpeg 图形交格式 .gif BMI .bmp imread支持GF格式,何1 mrite不支持该格式。 其中,filename是一个含有图像文件全名的字符串(包括任何可用的扩展名)。例如,命令行 >f=imread('chestxray.ipg'); 将PEG图像(见表2.1)chestxray读入图像数组f。注意,这里使用单引号)来界定fi1 ename 字符串。命令行结尾处的分号在MATLAB中用于取消输出。若命令行中未包含分号,则MATLAB 会立即显示该行中指的运算的结果。在MATLAB命令行窗门中出现的提示符(>)指明了命令行的 开始(如图1.1所示)。 就像上面的这个命令行一样,当f1 lename中不包含任何路径信息时,imread会从当前目录 中寻找并读取图像文件(见1.7.1节)。若当前日录中没有所需要的文件,则它会尝试在MATLAB 搜索路径中寻找该文件(见1.7.1节)。要想读取指定路径中的图像,最简单的办法就是在f11 ename 中输入完整的或相对的路径。例如 >f-imread('D:\myimages\chestxray.ipg') 从驱动器D上名为myimages的文件夹中读取图像文件chestxray.Pg;面 >f-imread('.\myimages\chestxray.jpg'); 从当前的工作目录中名为myimagesf的子目录中读取图像文件chestxray,jPg,MATLAB桌面 工具条上的当前目录窗口会显示MATLAB的当前工作路径,并提供一种非常简单的方法来手工改 变当前的路径,表2.I列出了函数imread和imwrite/所支持的常用图像/图形格式(函数imwrite 将在24节中封论) 函数size可给出一幅图像的行数和列数: ( 10241024 在使用如下格式来自动确定一幅图像的大小时,该函数很有用 >>【M,N】=9izeE); 该语法将返回图像的行数(M)和列数(N)。 函数whos可以显示出一个数组的附加信息。例如,语句 >whos f 会给出下列结果: Name Size 1024×1024 1048576 uint8 array Grand total is 1048576 elements using 1048576 bytes
第2幸基本原理 11 结果中的u1nt8是指几种MATLAB数据类之一,详见2,5节的讨论。whos行结尾处的分号对结 果没有影响,因此我】一般将其省略。 2.3显示图像 在MATLAB桌面上图像一般使用函数1 mahow来显示,该函数的基本语法为 imshow(f,G) 其中,f是一个图像数组,G是显示该图像的灰度级数。若将G省略,则默认的灰度级数是256。语法 imshow(f,[low high]) 会将所有小于或等于1ow的值都显示为黑色,所有大于或等于high的值都显示为白色。界于1ow 和h1gh之间的值将以默认的级数显示为中等亮度值。最后,语法 imshow(f,[】) 可以将变量1ow设置为数组f的最小值,将变量nigh设置为数组r的最大值。函数imshow的这 一形式在显示一幅动态范围较小的图像或既有正值又有负值的图像时非常有用。 函数pixval经常用来交互地显示单个像素的亮度值。该函数可以显示覆盖在图像上的光标。 当光标随着鼠标在图像上移动时,光标所在位置的坐标和该点的亮度值会在该图形窗口的下方显示 出来。处理彩色图像时,红,绿、蓝分量的坐标也会显示出来。若按下鼠标左键不放,测p1xv 将显示光标初始位置和当前位置间的欧几里得距离。 此处应注意的是,语法 pixval 会在上次显示的图像上显示光标。单击光标窗口上的X按钮可将其关闭, 例2.1读入和显示图像 (a)下列语句会从磁盘中读入一幅名为xo3e512.t1f的图像,提取该图像的基本信息,并 使用imshow将其显示出来 >f-imread ('rose_512,tif'); >whos f Name size Bytes Class 512 262144 uint8 array >imshow(f) 由于i1msow命今行结尾处的分号对果无影响,所以一般将其省略。屏暮输出如图2.2所示 窗口左上角显示了图像编号。雷口上有各种下拉兼单和工具按钮,用于缩放、保存及输出显示 窗口的内容等。特别地,在将结果打印成存盘之前,Et菜单有对蜡果进行编样或格式化的 功能 当用1 mshow显示另一格图像g时,MATLAB会在屏幕上用新图像替换旧图像。为保持第 格图像并同时显示第二幅困像,可以使用如下的figure函数: >figure,imshow(g) 使用语句
第2章基本原理 13 >imwrite(f,'patient10_runl','tif' 或 >imwrite(f,'patient10 runl.tif' 若filename中不包含路径信息,则mwrite会将文件保存到当前的工作目录中: 函数1mwr1te可以有其他的参数,具体取决于所选的文件格式。后续章节中的大部分工作都 是处理PEG或T1FF格式的图像,所以我们将注意力放在这两种格式上。 另一种常用但只适用于PEG图像的函数是imwr1te,其语法为 imwrite(f,'filename.jpg','quality',q) 其中,q是一个在0到100之间的整数(由于PEG压缩,q越小,图像的退化就越严重)。 例2.2使用函数1 nfinfo保存一幅图像 围2.4()所示的围像f是由给定的化学过程得到的典型序列围像之一:我们期望定期将这些图 像传送到中心站点,以便进行显示或自动检查。为降低存储量并减少传输时间,可在图像的外 观质量不低于某个合理的级别时,尽量压缩围像。其中,“合理的”意味着没有可擦觉的伪轮 线。围2.4b)到围2.40示出了分别以q=50,25,15,5和0将图像写到磁盘的结果(PEG 格式)例如,g=25时的语法结构为 >imwrite(f,'bubbles25.jpg','qyality',25 以q=15存储的图像[见图2.4d]中几平香不清伪轮廉线。当q=5和q=0时,伪轮廓线 就变得非常明显。因此,消除伪边缘的一种可接受方案就是用参数q=25来压缩围像。要了 解所实现的压缩并获得围像文件的其他详细信息,可以使用imf1nfo函数,其语法结构为 imfinfo filename 其中,filename是存储在磁盘中的图像的全名。例如 >imfinfo bubbles25.jpg 会输出如下信息(注意,在这种情况下,有些域不包含信息)归 Fi】aname: bubbles25.jpg' FileMadDate: ,04-Jan-200312:31:26 Filesize 13849 Format jpg' Formatversion 714 682 grayscale 其中,F1 lesize以宇节为单位。通过简单地使用width乘以He1ght,再来以BitDepth 然后将结果除以8,就可以计算出原困像中的字节数。计算的结果是486948。用这个结果除 以F11eS1ze就可以得到压缩比:(486948/13849)=35.16。这-压鳊比是在保持图像质量与 应用要求一致的前提下得到的,除了在存储空间方面有明显的优势之外,这种压蝙还可使得单 位时间内传输的教据量大约是压缩前的35倍
14 数字图像处理(MATLAB版) (e) 图24原图像:-0分别使用P9质银参数g=50,25,155,0的结果。 q15时,伪轮廓并不明显见图像d1,而在g5和0时则十分明显 由品数1 mfinfo显示的信息碳可精旋至所谓的结构变量中,以便用于后续的计算。若以前面 的这幅图像为例,并将相应的结构变量取名为K,则使用语法 >K imfinfo('bubbles25.ipg'); 可将由命令imfinfo产生的所有信惠存入变量K。由imfinfo产生的信息附加到了形式为 K域的结构变量中。例如,图像的高度和宽度现在存储在结构城K.He1ght与K,W1d上h中。 下面我们通过计算围像bubb1es25,pg的压缩比来考虑使用结构变量K的一个示例: ght*K.BitDepth/8: >compression ratio.image bytes/compressed bytes 注意,mf1nfo有两种不间的用法,第一种用法是在命今行健入1 mfinfo bubb1es25.jpg, 其结果是在屏素上显示出信息。第二种用法是钝入K=1minf和('bubb1台s25.JPg'),其 结果是把由1 mfinfo产生的信息存入K。调用mfinfo的这两种不同方法是命令-函数二元 性的一个例子,这个重要的概念在MATLAB的在线文档中有更加详细的解释。 函数1 mwrite的另一种常用但只适用于tif图像的语法为 imwrite(g,filename.tif','compression','parameter' 'resolution',Icolres rowres])
第2章基本原理 15 其中,'parameter'可以是如下主要的值之:"none·表示无压缩;pack知its'表示比特包压 缩(非二值图像的默认参数):'cc1tt'表示ccitt压缩二值图像的默认参数。1×2矩阵co1re8 rowres]包含两个整数,分别以每单位中的点数给出图像的列分辨率和行分辨梨默认值为7272l)为 例如,若一幅图像的大小以英寸来表示,则co1res是垂直方向上每英寸的点(像素)数(dp),而 rowres是水平方向上每英寸的点数。使用标量res来指定分辨率与使用res res]是等价的。 例2.3使用1 nwrite的泰数 困2.5a)是检查一块电路板的质量时产生的一幅8比特X光图像。其格式为P9,分辨率为 200dpi。困像大小为450×450像素,即其尺寸为2,25×2.25英寸。我们想把这幅图像以tif 格式存储为无压缩的名为5E的图像,并且想将图像的尺寸减小到5×15英寸,但其像素数 仍保持为450×450。下列语句可产生我们所希望的结果: >imwrite(f,'sf,tif','compression','none','resolution', 3003001) 山- 图2.5更改dpi分辨率并同时保持像素数不变时的效果(a分辨率为200dpi且大小 为450、 450的图像(大小为225×225英寸)片b大小为450×450(15 15英)且分率为300n的同一图像(原图像由L公同提供) 向[co1 res rowres]的值由分率200dpi乘以压第比2.25/1.5得到,即300dpt。可以用 下列语句来代替手工计算: >tes-round(200*2.25/1,5): >imwrite(f.'sf.tit'.'compression','none''resolutian',res) 其中,函数roud会将其参量舍入为最楼近的整数。注意,这些命令并不改变像素教,而只 改变图像的大小。原图像的像素教为450×450,分裤率为200dp,尺寸为2.25×225英寸