编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
MATLAB中数字图像是以矩阵方式存储的。数字图像处理就是采用特定的算法对数字图像进行处理,以获取视觉、接口输入的软硬件所需要数字图像的过程。从本质上说,就是运用计算机的计算能力和存储能力,对图像矩阵作某种运算、变换、修饰和处理,最终实现图像的评价、识别和理解。
完整的数字图像处理大体上可分为几个方面:图像信息的获取、图像信息的存储、图像信息的传送、数字图像处理、图像的输出和显示。图像信息的突出特点是数据量大,一般作为文件存储在磁盘、光盘中,使用的技术是数据压缩、图像格式、图像数据库等。数字图像处理多采用计算机处理,主要包括几何处理Geometrical Processing、算术处理Arithmetrc Processing、图像增强Image Enhancement、图像复原Image Restoration、图像重建Image Reconstruction、图像编码Image Encoding、图像识别Image Recognition、图像理解Image Understanding。图像处理的最终目的是为人和机器提供一幅更便于解译和识别的图像。
MATLAB支持多种图像文件格式,可以使用imformats指令查询MATLAB支持的所有图像文件格式,一般包括bmp、cur、gif、hdf、ico、jpg和jpeg、pbm、pcx、pgm、png、pnm、ppm、ras、tif和tiff、xwd等。
1. 图像的操作:
对一幅图像进行操作处理,包括查询图像文件信息、读取图像文件、保存图像文件、图像数据类型的转换、图像文件格式的转换等。
1)查询图像文件:
使用函数imfinfo获取图像处理工具箱支持的任何图像文件信息。调用格式:
info=imfinfo(filename,fmt)
info=imfinfo(filename)
info=imfinfo(URL, ...)
其中,参数fmt对应于图像处理工具箱中所支持的图像文件格式,函数还支持网络地址图像。
该函数获取的信息依靠图像文件的类型有所不同,至少包含的内容有:
·Filename:文件名
·FileModDate:文件最后修改时间
·FileSize:文件大小,单位字节
·Format:文件格式
·FormatVersion:文件格式的版本号
·Width:图像的宽度,单位像素
·Height:图像高度,单位像素
·BitDepth:每个像素的位数
·ColorType:颜色类型,如RGB图像、灰度图像、索引图像
示例:info=imfinfo('canoe.tif')
2)读取图像文件:
使用函数imread来读取图像文件。调用格式为:
A=imread(filename, fmt) ---- fmt为图像文件格式
[X, map]=A=imread(...)
[...]=imread(filename)
[...]=imread(URL, ...) ---- 读取网络图像URL
[...]=imread(..., idx) ---- idx为cur、gif、ico、tiff文件中第idx幅图像
[A,map,alpha]=imread(...) ---- 只支持cur、ico、png图像格式
[...]=imread(... , 'frames', idx) ---- 读取gif文件中的图像帧,idx可以为数值、向量或all
[...]=imread(... , ref) ---- 整数值,读取多幅HDF图像的第ref幅图像,默认1
[...]=imread(... , 'BackgroundColor', BG)
[...]=imread(... , 'PixelRegion', {ROWS,COLS}) ---- 读取tif文件中由ROWS和COLS标签组成的子图像
大多数图像用8位或更少位颜色来存储像素点值,当把这些图像数据加载到内存中时,MATLAB会根据不同的文件类型保存为不同数据类型:
文件中的数据格式 |
imread读入后数据格式 |
1位 |
logical |
每色8位或更少位 |
uint8 |
12位 |
uint16 |
16位(JPEG、PNG和TIFF) |
uint16 |
16位(BMP) |
uint8 |
3)写入图像文件:
使用函数imwrite来存储文件。调用格式:
imwrite(A, filename, fmt)
imwrite(X, map, filename, fmt)
imwrite(... , filename)
imwrite(... , Param1, Val1, Param2, Val2, ...) ---- 让用户控制一些图像文件格式的输出特性,每种文件格式的特性是不同的。GIF文件参数说明:
Parameter |
可选值 |
缺省值 |
'BackgroundColor' |
背景色 |
|
'Comment' |
注解,字符串数组 |
|
'DelayTime' |
(0,655]间的一个数值,显示下一个图像延迟秒数 |
|
'DisposalMethod' |
设定动画处理方式,有leaveInPlace、restoreBG、restorePrevious、doNotSpecify |
|
'Location' |
二元向量,图像在屏幕上边距值和左边距值 |
|
'LoopCount' |
指定动画的循环值,有限值范围(0,65535)或inf |
Inf |
'ScreenSize' |
屏幕宽高 |
|
'TransparentColor' |
图像的透明度 |
|
'WriteMode' |
'overwrite'或'append'(作为单独的一帧附加到存在的文件中) |
'overwrite' |
HDF4文件参数说明:
Parameter |
可选值 |
缺省值 |
'Compression' |
有none、rle、jpeg,rle只对灰度图像和索引图像有效 |
rle |
'Quality' |
取值范围[0 100],只有Compression为jpeg时才有效,值大质量高 |
75 |
'WriteMode' |
'overwrite'或'append'(作为单独的一帧附加到存在的文件中) |
'overwrite' |
JPEG文件有效的参数说明:
Parameter |
可选值 |
缺省值 |
'Bitdepth' |
位度常量,灰度图像可以是8、12或16,对于彩色图像是8或12 |
8 |
'Comment' |
注释 |
空 |
'Mode' |
指定压缩的类型,有损压缩lossy或无损压缩lossless |
lossy |
'Quality' |
取值范围[0 100],值大质量高 |
75 |
PBM、PGM和PPM文件参数说明:
Parameter |
可选值 |
缺省值 |
'Encoding' |
五格式编码ASCII,二进制编码rawbits |
rawbits |
'MaxValue' |
最大灰度值或颜色值,只对PGM和PPM有效,PBM文件为1 |
65535/255 |
PNG文件参数说明:
Parameter |
可选值 |
缺省值 |
'InterlaceType' |
none或 adam7 |
none |
'BitDepth' |
位度,灰度图为1、2、4、8、16,索引图1、2、4、8,真彩8、16 |
|
'Transparency' |
'Transparency'和'Alpha'不能同时使用 |
空 |
'Background' |
背景色,索引图像为[1 length(map}]间整数,灰度范围[0 1],真彩取值范围[0 1]的三元素向量 |
空 |
'Gamma' |
非负整数指定文件的gamma值 |
空 |
'Chromaticities' |
8元素向量[wx wy rx ry gx gy bx by] |
空 |
'XResolition' |
水平方向像素点数 |
空 |
'YResolition' |
垂直方向像素点数 |
空 |
'ResolitionUnit' |
unknown或meter |
空 |
'Alpha' |
透明度,值的范围[0 1] |
空 |
'SignificantBits' |
值的范围[1 BitDepth],索引图是三元素向量,灰度图是标量,真彩是三元素向量,带透明度时多向量多一个元素 |
空 |
PNG文件还有Author、Description、Copyright、CreationTime、Software、Disclaimer、Warning、Source、Comment等参数,都是字符串,缺省为空。
RAS文件参数说明:
Parameter |
可选值 |
缺省值 |
'Type' |
standard、rgb、rle |
standard |
'Alpha' |
透明度,只应用于真彩色 |
空 |
TIFF文件参数说明:
Parameter |
可选值 |
缺省值 |
'ColorSpace' |
指定颜色空间,rgb、cielab、icclab |
none |
'Compression' |
none、packbits、ccitt、fax3、fax4,后三种只对二值图像有效 |
ccitt/packbits |
'Description' |
任意字符串,填充由函数iminfo返回的ImageDescription域 |
空 |
'Resolution' |
标量值,用来定义输出文件的x和y方向的分辨率 |
72 |
'WriteMode' |
'overwrite'或'append'(作为单独的一帧附加到存在的文件中) |
'overwrite' |
示例:
imwrite(x,map,'canoe.tif','Compression','none','WriteMode','append');
4)图像数据类型转换:
⑴ im2double函数:把图像数组转换成double精度类型
I2=im2double(I1) ---- 按比例把灰度图像的类型转换成double类型
RGB2=im2double(RGB1) ---- 按比例把真彩色图像类型转换成double类型
I=im2double(BW) ----把二值图像BW转换成double类型的灰度图像
X2=im2double(X1,'indexed') ---- 表示偏置数据法把索引图像的类型转换成double类型
⑵ im2uint8函数:把图像数组转换成uint8类型
I2=im2uint8(I1) ---- 按比例把灰度图像的类型转换成uint8类型
RGB2=im2uint8(RGB1) ---- 按比例把真彩色图像类型转换成uint8类型
I=im2uint8(BW) ----把二值图像BW转换成uint8类型的灰度图像
X2=im2uint8(X1,'indexed') ---- 表示偏置数据法把索引图像的类型转换成uint8类型
⑶ im2uint16函数:把图像数组转换成uint16类型
I2=im2uint16(I1) ---- 按比例把灰度图像的类型转换成uint16类型
RGB2=im2uint16(RGB1) ---- 按比例把真彩色图像类型转换成uint16类型
X2=im2uint16(X1,'indexed') ---- 表示偏置数据法把索引图像的类型转换成uint16类型
不支持把二值图像转换成uint16类型的序列。
5)图像文件格式转换:
MATLAB中改变图像文件格式的方法是,先用函数imread读取文件,然后再用函数imwrite以适当的格式保存文件。示例:
bitmap=imread('mybitmap.bmp','bmp')
imwrite(bitmap, 'mybitmap.png', 'png')
2. 图像显示:
MATLAB主要用image函数来显示图像,在显示图像时创建一个图像句柄对象,可以通过句柄的一些参数设置显示模式。MATLAB还提供了imagesc函数,会自动缩放输入的图像数据。图像处理工具箱还提供了imshow函数,还有打开图像显示浏览器的imview函数。
⑴ imshow函数格式:
imshow(I, n)
imshow(I, [low high])
imshow(BW)
imshow(X, map)
imshow(RGB)
imshow(... ,display_option)
imshow(x, y, A, ...)
imshow filename
h=imshow(...)
当用户调用imshow函数显示一幅图像时,自动设置图像窗口、坐标轴和图像属性。自动设置的属性包括图像的Cdata属性和CDataMapping属性、坐标轴的CLim属性、图像窗口的Colormap属性。
⑵ intsetpref函数:
用户可以通过intsetpref函数修改工具箱参数。调用intsetpref函数可以获取的参数有:
Preference |
值 |
说明 |
'ImshowBorder' |
'loose'(默认)或'tight' |
包含和隐藏图像边框 |
'ImshowAxesVisible' |
'on'或'off'(默认) |
显示或隐藏坐标轴及其标识 |
'ImshowTruesize' |
'auto'(默认)或'manual' |
调用函数truesize以显示没有颜色渐变效果图像 |
'ImviewInitialMagnification' |
100(默认)或'fit' |
在imview中显示图像的放大比例,fit表示充满 |
'TruesizeWarning' |
'on'(默认)或'off' |
当图像太大超过屏幕显示时输出警告信息 |
⑶ imview函数:打开图像浏览器
imview(I)
imview(RGB)
imview(X, map)
imview(I, range)
imview(filename)
imview(... , 'InitialMagnification', initial_mag)
h=imview(...)
imview close all
打开图像浏览器可以对图像进行一些简单操作,如缩放等。
3. 图像类型及显示:
MATLAB中,一幅图像可能包括一个数据矩阵,有可能包含一个色图矩阵。图像类型是指数组和像素之间定义的关系。MATLAB还支持由多帧图像组成的图像序列。MATLAB通常使用3种格式uint8、uint16、double来存储图像。
1)二值图像及其显示:
二值图像只需要一个数据矩阵,每个像素只取两个离散值中的一个,这两个值相当于开和关,对应于white和black。
调用imshow黑色显示二值图像的格式:
imshow(BW)
imshow(BW, map)
一个二值图像以0和1的逻辑矩阵存储,0为黑色,1为白色。可以使用逻辑操作符~进行颜色反转,也可以用色图map把0和1对应的像素点显示的颜色改变。
2)灰度图像及其显示:
一幅灰度图像是一个数据矩阵I,其中的数据代表在一定范围内的颜色灰度值。MATLAB中灰度图像存储为单一的数据矩阵,数据矩阵中的每个元素分别代表图像中的像素。矩阵中的元素可以是双精度的浮点型、8位或16位无符号整型数。
可以调用图像色彩缩放函数imagesc对图像预处理,然后再转换为灰度图以调整灰度的深浅,也可以用函数imshow来显示灰度图像。
imagesc函数的第二个参数确定灰度范围,灰度范围中第一个值(通常是0)对应于色图中的第一个值(颜色),灰度范围中的第二个值(双精度型是1,8位无符号整型是255,16位无符号整型是65535)对应于色图中的最后一个值(颜色)。在灰度范围内的数值线性对应于色图中其他值(颜色)。
调用imshow函数显示灰度图像的格式:
imshow(I)
imshow(I, n) ---- n代表所要显示图像的灰度等级数,缺省256,新版本不再支持
imshow(I, [low high]) ---- [low high]为图像数据的值域
3)索引图像及其显示:
索引图像包括一个数据矩阵X和一个色图阵MAP,其中X可以是无符号8位整型、无符号16位整型或者双精度浮点型数据,MAP是一个包含三列若干行的数据阵列,其每一个元素的值均为[0 1]之间的双精度浮点型数据。MAP矩阵的每一行分别表示红色、绿色、蓝色的颜色值。索引图像是从像素值到颜色值映射,值1指向矩阵MAP第1行,值2指向第2行,依次类推。
色图通常和索引图像存在一起,当调用函数imread时,自动将色图与图像同时加载。MATLAB可以选择所需要的色图,而不必局限于使用默认的色图,可以使用CDataMaping来选取其他色图,包括自定义的色图。
图像矩阵与色图之间的关系取决于图像数据矩阵的类型。如果图像数据矩阵是双精度数据类型,则值1指向矩阵MAP中的第1行,值2指向第2行,依次类推;如果图像矩阵是8位无符号整数或16位无符号整数,由于存在一个偏移量,使得值0指向矩阵MAP第1行,值1指向第2行,依次类推。
imshow函数显示索引图像格式:
imshow(X, map)
4)RGB图像及其显示:
RGB图像,即真彩色图像,存储为数据矩阵。数组中的元素定义了图像中每一个像素的红、绿、蓝颜色值,像素的颜色由保存在像素位置上的红、绿、蓝灰度值的组合确定。图形文件格式RGB存储为24位的图像,红、绿、蓝分别占8位,共有16777213种颜色。
RGB数组可以是双精度的浮点类型、8位或16位无符号的整数类型。在RGB的双精度型数组中,每一种颜色是用0和1之间的数值表示。每一像素的三个颜色值保存在数组的第三维中,例如像素(10,5)的红、绿、蓝颜色值分别保存在元素RGB(10,5,1)、RGB(10,5,2)、RGB(10,5,3)中。
MATLAB中可以调用image或imshow函数来显示RGB图像,格式为:
imshow(RGB)
其中,RGB是mxnx3的矩阵,任意像素点(r,c)颜色的显示由数组(r,c,l:3)决定。
5)图像序列:
对于大多数应用,需要一组与时间或视角有关联的图像序列。MATLAB的图像工具箱支持在同一的矩阵中存储多帧图像,把每个图像称为一帧。图像序列是一个四维数组,图像帧的序号在图像的长、宽、颜色深度之后构成四维。
MATLAB中用cat函数可以把一些单一的图像合并成图像序列,图像序列中每个图像需有相同的大小,如果是索引图像,色图也要一致。
示例:
A=cat(4, A1, A2, A3, A4, A5) %将5幅图像合成一个图像序列
FRM3=MULTI(:, :, :, 3) %从图像序列中提取出第三帧
6)图像类型判断:
对于上面4种类型的图像,MATLAB提供了函数来判断,调用格式为:
Image_Type_YN=Is_Image_Type_command(Image_Type_Array)
如果数组数据Image_Type_Array是对应的图像类型,Image_Type_YN值返回1,否则返回0。
函数 |
说明 |
函数 |
说明 |
isbw |
二值图像的判断 |
isind |
索引图像的判断 |
isgray |
灰度图像的判断 |
isrgb |
真彩色图像的判断 |
4. 特殊图像显示技术:
MATLAB图像处理工具还提供了一些特殊的显示功能函数。
1)显示色彩条:
可以用colorbar函数给坐标轴添加色彩条,用来指示图像中不同颜色对应的数据值。
colorbar
colorbar(... ,'peer', axes_handle) ---- 创建一个关联于axes_handle坐标轴的色彩条
colorbar( axes_handle) ---- 在axes_handle坐标轴右边位置添加一个色彩条
colorbar(... ,'PropertyName',peopertyvalue) ----添加色彩条并自定义属性对
cbar_axes=colorbar(... )
colorbar('location') ---- 在'location'指定的位置上添加一个色彩条
'location'的具体值有:
函数 |
说明 |
函数 |
说明 |
North |
显示在绘图区里顶端 |
NorthOutside |
显示在绘图区外顶端(靠近绘图区) |
South |
显示在绘图区里底端 |
SouthOutside |
显示在绘图区外底端 |
East |
显示在绘图区里右端 |
EastOutside |
显示在绘图区外右端 |
West |
显示在绘图区里左端 |
WestOutside |
显示在绘图区外左端 |
2)显示多帧图像序列:
一幅多帧的图像文件包含了一幅或多幅图像,MATLAB支持的多帧图像文件格式是HDF和TIFF。一旦读入MATLAB内,多帧图像的图像帧在数组第四维中保存。
多帧图像可以使用imread指令导入或者由MATLAB创建,有多种显示方法。
⑴ 显示单帧:
MATLAB中图像数组第四维保存多帧图像的帧位,需要显示单独一帧,指定标准索引序号调用imshow函数。示例:
imshow(I(:, :, :, 7))
代码显示多帧图像数组I的第7帧。
⑵ 显示多帧:
montage函数在同一时间显示多帧图像中的所有帧,所有的帧显示在同一image图形对象中。
montage(I) ---- 显示灰度图像I共k帧,I为mxnx1xk数组
montage(BW) ---- 显示二值图像BW共k帧,BW为mxnx1xk
montage(X,map) ---- 显示索引图像X共k帧,色图由map指定为所有的帧图像的色图
montage(RGB) ---- 显示真彩色图像RGB共k帧,RGB为mxnx3xk
h=montage(...)
montage函数以行方式显示图像,第一帧图像显示在第一行的第一个位置上,下一帧显示在第一行的第二个位置上,等等。montage函数把帧图像以近似正方形的方式排序,对于每一帧图像的色图必须相同。
⑶ 显示动画:
immovie函数可以从一个多帧图像数组中创建MATLAB动画。示例:
mov=immovie(X, map);
这里,X是一个四维数组。immovie函数一旦创建并显示动画,动画只是运行两次,而且只能在MATLAB环境下执行。如果需要把动画在MATLAB环境外运行,要用avifile函数和addframe函数创建AVI文件。AVI文件能够用类型为uint8和double的索引图像和真彩色图像创建,而不需要多帧图像。
3)显示多幅图像:
MATLAB对同时显示多少图像没有任何限制,通常依靠硬件系统的极限。电脑系统显示颜色数是有个极限的,依赖于每个像素点的比特数和存储的信息。从系统中获取支持的像素点的位数可以通过下述指令获取:
get(0, 'ScreenDepth')
⑴ 不同窗口中显示多幅图像:
显示多幅图像最简单的方法是在不同的窗口显示多幅图像。imshow函数始终在当前窗口显示图像,所以接连显示两幅图像,第二幅图像将会覆盖第一幅图像。为了避免图像被覆盖,可以用figure函数创建一个新空白的窗口对象,用以显示下一幅图像。例如:
imshow(I)
figure,imshow(I2)
figure,imshow(I3)
若显示8位图像,必须确保图数不超过256。例如,如果需要显示三幅图像,每一个图像都有不同的128个颜色的色图,则至少有一幅图像显示错误的色彩。解决这种现象的办法就是使用imapprox函数去减少图像中的色彩数,或者把图像转换成真彩色图像。
⑵ 相同窗口中显示多幅图像:
在一个窗口中显示多幅图像主要有两种方法,用imshow函数显示由subplot函数分割的区域,用subimage函数显示由subplot函数分割的区域。使用imshow函数显示多幅图像时,由于map2的影响,使得map1色图失去作用,只有将索引图像转换成RGB图像才能把色图的影响独立开来。subimage函数会把索引图像转换成RGB图像,把色图map的影响独立开来。
4)纹理映射:
纹理映射是一种将二维图像映射到三维图形表面的技术。warp函数通过插值实现图像的纹理映射技术,调用格式为:
warp(X, map) ---- 在一个简单矩形表面纹理映射显示索引图像X
warp(I, map) ---- 在简单的矩形表面纹理映射灰度级n的灰度图像I
warp(BW) ---- 在一个简单的矩形表面纹理映射显示二值图像BW
warp(RGB) ---- 在一个简单的矩形表面纹理映射显示真彩色图像RGB
warp(z, ...) ---- 在由z决定的表面图形上进行纹理映射
warp(x, y, z, ...) ---- 在由(x,y,z)决定的表面图形上进行纹理映射
h=warp(...)
5. 图像类型转换:
许多图像处理操作都对图像类型有要求,比如要对一幅索引图像滤波,首先要转换成真彩色图像,而直接滤波的结果毫无意义。
1)dither函数:
该函数通过颜色抖动来增强输出图像的颜色分辨率,从而达到转换图像的目的。所谓颜色抖动就是改变像素点的颜色,使像素颜色近似于色图的颜色,从而以空间分辨率来换取颜色分辨率。该函数可以把真彩色图像转换成索引图像,或把灰度图像转换成二值图像。格式:
BW=dither(I) ---- 将灰度图像I抖动成二值图像BW
X=dither(RGB, map) ---- 表示将真彩色图像RGB按指定的色图map抖动成索引图像
X=dither(RGB, map, Qm, Qe) ---- 以定义Qm、Qe两参数将真彩色图像RGB转换成索引图像,参数Qm定义了从转换色图map的每个颜色轴量化的比特位,参Qe定义从颜色空误差计算的量化比特位。如果Qe<Qm,不能完成转换,默认值Qm=5、Qe=8。
输入真彩图像或灰度图像支持数据类型uint8、uint16、double,所有其他图像类型的输入只支持double数据类型。map不能超过65536种颜色。如果输出索引图像的颜色种类超过255则是uint16类型,否则为unit8类型,输出的二值图像BW支持逻辑0、1类型,一般为double。
2)gray2ind函数:
该函数功能是把灰度图像或二值图像转换成索引图像。格式:
[X, map]=gray2ind(I, n) ---- 按指定的灰度级数n将灰度图像I转换成索引图像X,n缺省为64
[X, map]=gray2ind(BW, n) ---- 以灰度级数n将二值图像BW转换成索引图像X,n缺省为2
参数n的范围是1~65536。输入图像I可以是实数、非稀疏逻辑矩阵、uint8、uint16或double类型,也可为任何维数矩阵。输出图像X的色图的长度不大于256则是uint8类型,否则为uint16类型。
3)grayslice函数:
通过设定阈值将灰度图像转换成索引图像。格式为:
X=grayslice(I, n) ---- 将灰度图像I均匀量化为n个等级,然后转换成索引图像X
X=grayslice(I, v) ---- 按指定的阈值向量v对图像I的阈值进行划分,并转换成索引图像X
输入图像I可以是uint8、uint16或double类型,输出图像X的类型由阈值数量决定,如果阈值数量小于256,X是uint8类型,并且X的值域为[0 n]或[0 length(v)],否则X是double类型,值域为[1n+1]或[1 length(v)+1]。
4)im2bw函数:
功能是通过设定亮度阈值将灰度、真彩、索引图像转换成二值图像。格式为:
BW=im2bw(I, level) ---- 将灰度图像I转换成二值图像
BW=im2bw(X, map, level) ---- 将索引图像X转换成二值图像
BW=im2bw(RGB, level) ---- 将真彩色图像RGB转换成二值图像
参数level是归一化阈值,取值在[0 1],level可以由函数graythresh(I)计算得到。输入图像可以是uint8、uint16或double类型并必须为非稀疏矩阵。
5)ind2gray函数:
功能是将索引图像转换成灰度图像。格式为:
I=ind2gray(X, map) ---- 把索引图像X转换成灰度图像,其实就是从输入图像中删除色彩和位置信息,只保留亮度。输入图像X可以是uint8、uint16或double类型,输出图像I为double类型。
6)ind2rgb函数:
功能是将索引图像转换成真彩色图像。格式为:
RGB=ind2rgb(X, map)
输入图像X可以是uint8、uint16或double类型,输出图像RGB是double类型mxnx3矩阵。
7)mat2gray函数:
功能是将一个数据矩阵转换成一幅灰度图像。格式为:
I=mat2gray(A, [amin amax]) ---- 按指定区间将数据矩阵A转换成灰度图像
I=mat2gray(A) ---- 自动把矩阵中的最小值设为amin,最大值设为amax
输入图像A和输出图像I都为double类型。
8)rgb2gray函数:
功能是将真彩色转换成灰度图像或将彩色色图转换成灰度色图。格式为:
I=rgb2gray(RGB) ---- 表示将真彩色图像RGB转换成灰度图像I
newmap=rgb2gray(map) ---- 表示将彩色色图map转换成灰度色图newmap
如果输入的是真彩色图像RGB,则可以是uint8、uint16或double类型,输出图像I的类型和输入类型一致。如果输入的是色图,则输入和输出都是double类型。
9)rgb2ind函数:
功能是将真彩色图像转换成索引图像。把真彩色图像转换成索引图像有三种不同方法,均衡量化、最小值量化、色图映射。格式为:
[X, map]=rgb2ind(RGB, tol) ---- 以均匀量化把真彩色图像转换成索引图像,tol的取值范围为[0 1],map至多(floor(1/tol)+1)^3种颜色。
[X, map]=rgb2ind(RGB, n) ---- 以最小量化把真彩色图像转换成索引图像,n必须不大于65535,map至多n种颜色。
X=rgb2ind(RGB, map) ---- 把真彩色图像的色图映射成索引图像最近似匹配的色图,达到转换的目的。(map, 1)的大小不大于65535。
[...]=rgb2ind(... , dither_option) ---- 参数dither_option决定是否需要抖动来转换图像,参数值有dither和nodither两种,dither是默认值,通过抖动以损失空间为代价获取最佳的颜色;nodither表示没有抖动,原始图像的色图中每种颜色转换成新色图中的最近颜色。
输入图像可以是uint8、unit16或double类型,如果map的长度不大于256,输出图像是uint8类型,否则为uint16类型。
6. 8位和16位图像:
MATLAB中最基本的数据结构是数组,大多数图像用二维数组存储,其中的一个元素对应于所要显示图像的一个像素。也有一些图像,如RGB图像,需要用三维数组来存储,第一维表示红色像素的深度值,第二维表示绿色像素的深度值,第三维表示蓝色像素的深度值。
默认情况下,MATLAB将图像中的数据存储为双精度double类型,即64位浮点数,使用中不需要数据类型转换,因为几乎所有的MATLAB及其工具箱红色都可以使用double作为参数类型。但使用double会导致巨大的储存量,为了减少内存需要,MATLAB还提供了uint8和uint16数据类型,但MATLAB及工具箱中的大多数操作及函数都不支持uint8和uint16类型。
利用MATLAB提供的image函数可以直接显示unit8或uint16数据类型图像,而不必转换成double。但当图像是unit8或uint16类型时,MATLAB对矩阵的解释有所不同,而且与图像类型有关。
1)8位和16位索引图像:
如果图像数据矩阵的类型是uint8或uint16,则其值在作用于色图的索引前,必须进行值为1的偏移,即0值指向矩阵map的第1行,值1指向第2行,以此类推。并且因为image函数自动提供了这种偏移,所以不管图像数据矩阵是double类型,还是unit8或uint16,显示的方法相同。
但是,当用户在进行类型转换时,由于偏移量的存在,必须将unit8或uint16的数据加1,然后才能将其转换为double类型。例如:
X64=double(X8)+1 或 X64=double(X16)+1
相反,若将double类型转换为X64=double(X8)+1类型的数据时,在转换前,必须将其减1:
X8=uint8(X64-1) 或 X16=uint8(X64-1)
2)8位和16位灰度图像:
MATLAB中,double类型的图像数组中的数值的取值范围通常为[0 1],而unit8和uint16类型的图像的取值范围分别为[0 255]和[0 65535]。
MATLAB中,将一个灰度图从double类型转换为unit16,必须首先将其乘以65535:
I16=uint16round(I64x65535))
与此相反,将一个灰度图从unit16类型转换为double类型时,必须首先除以65535:
I64=double(I16)/65535
3)8位和16位RGB图像:
8位RGB图像的颜色数据是[0 255]之间的整数,而不是[0 1]之间的浮点值。所以,在8位RGB图像中,颜色值(255, 255, 255)的像素显示为白色。将RGB图像从double类型转换为uint8类型时,首先要乘以255:
RGB8=uint8(round(RGB64x255))
相反,如果将uint8类型的RGB图像转换成double类型时,首先要除以255:
RGB64=double(RGB8)/255
另外,对于uint16类型与double类型间RGB图像的转换时,只要把255的变换因子改为65535即可。
7. 图像色彩:
由于硬件上的原因,无法同时显示多种不同的色图,为了解决这种问题,通常减少索引图像或真彩图像的颜色数达到图像褪色的目的。
1)图像退色函数:
MATLAB提供了两个函数:
函数 |
说明 |
imapprox |
减少索引图像的色彩图,能够指定新色图的色彩数 |
rgb2ind |
把真彩色图像转换成索引图像,能够指定新色图的颜色数 |
imapprox的格式为:
[Y, newmap]=imapprox(X, map, n) ---- 把索引图像和色图map进行最小值量化逼近,色图至多有n种色彩
[Y, newmap]=imapprox(X, map, tol) ---- 把索引图像和色图map均衡量化逼近,新色图newmap包含至多(floor(1/tol)+1)^3种颜色,tol的范围必须为[0 1.0])
Y=imapprox(X, map, newmap) ---- 通过色图最佳映射逼近新色图
[...]=imapprox(... , dither_option) ---- 抖动参数dither_option有dither和nodither两种值,dither为默认,以损失空间分辨率获取最佳色彩结果;nodither没有抖动效果。
2)颜色模型:
彩色模型化的目的是按某种基色表示色彩。实际上,一种颜色模型是用一个三维坐标系统及这个系统的子空间来表示,在这个系统中的每个颜色都由一个单点表示。
常用的颜色模型有RGB、NTSC、YCbCr和HSV。
⑴ RGB模型:
在RGB模型中,每个颜色的主要光谱中都有红、绿、蓝的成分,这种模型是基于笛卡尔坐标系的。在这个模型中,灰度级沿着黑白两点的连线从黑延伸到白,其他各种颜色由位于立方体内或立方体上的点来表示,同时由原点延伸的矢量决定。为了处理方便,所有的颜色值都被归一化处理,也就是所有的RGB值都被假定在[0 1]范围内。
⑵ NTSC模型:
NTSC模式应用于彩色电视广播,它使用的是YIQ色彩坐标系,其中Y为亮度luminance、I为色调hue、Q为饱和度saturation。YIQ其实是RGB的编码,Y分量提供了黑白电视机要求的所有影像信息。RGB到YIQ的变换定义为:
YIQ系统称为普遍标准,主要优点是去掉了亮度Y和颜色信息I和Q间的紧密联系。
⑶ YCbCr模型:
YCbCr模型是数字视频常用的彩色模型。在模型中,亮度信息单独存储在Y中,色度信息存储在Cb和Cr中,Cb表示绿色分量相对于参考值,Cr表示红色分量相对于参考值。YCbCr模型数据可以是双精度类型,但颜色空间很适合uint8类型。对于uint8类型图像,Y值的范围是[16 235],Cb和Cr的范围是[16 240]。YCbCr模型保留uint8类型范围的顶端和低端空间保存附加信息,这些信息包括视频流。
⑷ HSV模型:
HSV模型是面向用户的,在通常使用的色彩轮和调色板选择的色彩都是基于HSV模型,比RGB色彩模型具有更好的视觉效果。
HSV模型对应于圆柱坐标系的一个圆锥子集,H对应色调hue,取值范围[0 1.0],对应颜色种类,一周的颜色从红、蓝、绿、蓝绿、蓝、紫、黑到红,红的值对应了0和1值;S对应饱和度saturation,取值范围[0 1.0],从锥轴到外缘对应于色调种类从不饱和(灰度梯度)到全饱和(无白色);V对应亮度value,取值范围[0 1.0],从锥尖到锥底面对应于色彩由暗变亮。
3)颜色模型转换:
实际应用中需要在不同颜色模型间转换,例如将计算机中的RGB模型图像输出到电视机上就需要RGB模型到NTSC模型的转换。MATLAB提供了一些色彩模型间的转换函数。
⑴ hsv2rgb函数:把HSV色图转换成RGB色图
M=hsv2rgb(H) ---- H是一个mx3数组,其中m为色图色彩数,列分别描述色调、饱和度和亮度。M也是一个mx3数组,列分别描述了红、绿、蓝。
rgb_image=hsv2rgb(hsv_image) ---- hsv_image是mxnx3数组,三面包含色调、饱和度和亮度,返回值rgb_image为对应红、绿和蓝的RGB图像。
⑵ ntsc2rgb函数:把NTSC色彩空间值转换成RGB色彩空间值
rgbmap=ntsc2rgb(yiqmap) ---- 把yiqmap的mx3的NTSC色彩值转换成RGB模型mx3数组
RGB=ntsc2rgb(YIQ) ---- 把NTSC模型图像YIQ转换成真彩色图像。
NTSC转换到RGB模型的变换方法为:
⑶ rgb2hsv函数:把RGB色图转换成HSV色图
cmap=rgb2hsv(M) ---- 转换RGB色图M为HSV色图cmap,色图都是mx3数组
hsv_imahe=rgb2hsv(rgb_image) ---- 把RGB图像转换成HSV图像,图像都是mxnx3数组
⑷rgb2ntsc函数:把RGB模型转换成NTSC模型
yiqmap=rgb2ntsc(rgbmap) ----把mx3的RGB数组转换成NTSC模型色彩
YIQ=rgb2ntsc(RGB) ---- 把真彩色图像RGB转换成NTSC图像YIQ
⑸rgb2ycbcr函数:把RGB模型转换成YCbCr模型
ycbcrmap=rgb2ycbcr(rgbmap) ---- 把RGB色图rgbmap值成YCbCr色图,都是mx3数组
YCBCR=rgb2ycbcr(RGB) ---- 转换真彩色图像RGB为YCbCr图像
⑹ycbcr2rgb函数:转换YCbCr模型到RGB模型
rgbmap=ycbcr2rgb(ycbcrmap) ---- 转换YCbCr色图到RGB色图,都是mx3数组
RGB=ycbcr2rgb(YCBCR) ---- 把YCbCr图像转换成真彩色图像RGB
4)色彩处理:
对色彩的处理主要包含色彩模型的转换、色彩的退化、色彩的增强及色彩的重排等。除前面所述的函数,还有其他一些函数。
⑴ cmpermute函数:对色图中的颜色进行重新排列
[Y, newmap]=cmpermute(X, map) ---- 把色图map中的颜色随机重排序成一个新的色图
[Y, newmap]=cmpermute(X, map, index) ---- 使用指定的数组顺序产生新的色图
⑵ cmunique函数:返回图像和它唯一的色图
[Y, newmap]=cmunique(X, map) ---- cmunique删除了色图中复制的行,校准图像数组索引
[Y, newmap]=cmunique(RGB) ---- 把真彩色图像RGB转换成索引图像Y和色图newmap
[Y, newmap]=cmunique(I) ---- 把灰度图像I转换成一个索引图像Y和色图mewmap
⑶ rgbplot函数:绘制色图
rgbplot(cmap)
绘制cmap色图的三列,分别对应三条曲线。cmap是mx3的色图数组,rgbplot绘制第一列红色、第二列绿色、第三列蓝色。