第六章
彩色图像处理
MATLAB中彩色图像的表示
RGB图像
一幅RGB图像一幅RGB图像是一个M×N×3的彩色像素数组,其中每个色彩像素是一个三值组,这三个值分别对应一个特定空间位置处该RGB图像的红,绿,蓝分量。
令fR,fG,fB分别表示三幅RGB分量图像,一幅RGB图像就是使用cat(连接)运算符通过堆叠这些分量图像形成的:
rgb_image = cat(3,fR,fG,fB)
该运算中,要求图像按顺序放置。
用下面的命令提取三幅分量图像:
fR = rgb_image(:,:,1);
fG = rgb_image(:,:,2);
fB = rgb_image(:,:,3);
>> subplot(141),imshow(f);
>> subplot(142),imshow(fR);
>> subplot(143),imshow(fG);
>> subplot(144),imshow(fB);
一幅图像和它的三个分量
RGB色彩空间通常以图解方式显示为一个RGB色彩立方体。
可以使用自定义函数rgbcube来查看彩色立方体:
rgbcube(vx, vy, vz)
索引图像
索引图像有两个分量:一个整数数据矩阵X和一个彩色映射矩阵map。矩阵map是一个大小为m×3的double类数组。
矩阵X中的每个像素值对应着map中的一个颜色,从而形成一种映射关系,构成了索引图象。
显示索引图像,可以写作:
>> imshow(X, map)
或者
>> image(X)
>> colormap(map)
处理RGB和索引图像的函数
函数dither
这个函数采用抖动从RGB图像创建索引图像
>> gR=dither(fR);
将RGB图像的一个分量当作灰度图像,进行抖动处理。效果图如下
函数grayslice
采用阈值处理从灰度图像创建索引图像
下面是效果图
彩色空间转换
颜色基本概念
- 亮度
明亮程度,光作用于人眼时所引起的明亮程度不同。
它与被观察物体的发光强度有关,强度大小,决定我们的感觉亮或暗。
如果彩色光的强度降到使人们看不到了,在亮度这个分量上他就以黑色对应,如果其强度变得很大,那么亮度就以白色对应。亮度是非彩色的属性,它描述亮还是暗,彩色图象中的亮度对应于黑白图象中的灰度。
对同一物体照射的光越强,反射光也越强,则越亮。
对不同物体在相同照射情况下,发射越强者看起来越亮。(例如:镜子的反射)
亮度还与人类视觉系统的视觉敏感函数相关,即使强度相同,不同颜色的光当照射同一物体时也会产生不同的亮度。
- 色调
明亮程度,光作用于人眼时所引起的明亮程度不同。
它与被观察物体的发光强度有关,强度大小,决定我们的感觉亮或暗。
如果彩色光的强度降到使人们看不到了,在亮度这个分量上他就以黑色对应,如果其强度变得很大,那么亮度就以白色对应。亮度是非彩色的属性,它描述亮还是暗,彩色图象中的亮度对应于黑白图象中的灰度。
对同一物体照射的光越强,反射光也越强,则越亮。
对不同物体在相同照射情况下,发射越强者看起来越亮。(例如:镜子的反射)
亮度还与人类视觉系统的视觉敏感函数相关,即使强度相同,不同颜色的光当照射同一物体时也会产生不同的亮度。
- 饱和度
饱和度是指颜色的纯度即掺入白光的程度。
饱和度(saturation)是颜色的另一个属性,它描述纯颜色用白色冲淡的程度,高饱和度的颜色含有较少的白色。
饱和度也是可以指颜色的深浅程度。对于同一个色调的彩色光,饱和度越深颜色越鲜明或者说越纯。
例如:当红色加进白光之后冲淡为粉红色,其基本色调还是红色,但饱和度降低;也就是说,淡色的饱和度比鲜艳的颜色要低一些。
饱和度还和亮度有关,如果在就饱和的彩色光中加入白光的成分,增加了光的强度,会变得更亮,但它的饱和度降低了。如果在某色调的彩色光中,掺入别的彩色光,则会引起色调的变化,既基本的颜色变了,只有掺入白光时,仅仅引起饱和度的变化。
- 色度
通常,把色调和饱和度称为色度,则亮度表示某彩色光的明亮程度,色度表示颜色的类别和深浅程度。
NTSC彩色空间
主要用于电视信号传送,兼容黑白和彩色两种模式。由YIQ三部分组成。
YIQ分量是由一幅图像的RGB分量变换得到的。
可以使用rgb2ntsc函数从RGB转换到NTSC,使用ntsc2rgb从NTSC转换到RGB。
RGB图像
NTSC图像
其余彩色空间类似NTSC,可以使用工具箱函数互相转换。
彩色图像处理基础
彩色图像处理可以细分为三个领域:
- 彩色变换(彩色映射)
- 各个彩色平面的空间处理
- 彩色向量处理
彩色变换
在这里,使用了自定义函数ice(交互颜色编辑)。
其语法为
g = ice(\'Property Name\', \'Property Value\',...)
其中,Property Nmae和Property Value必须成对出现,且这些点指明了输入对组成的重复模式。
具体函数代码见M函数文件夹。
PS:这个函数没调试通过,所以没有效果图,MATLAB文件导入部分出了故障,需要继续调试一下。
彩色图像的空间滤波
彩色图像平滑
可以使用imfilter函数。运行如下代码
>> f=imread(\'5-1-1.jpg\');
>> fR=f(:,:,1);
>> fG=f(:,:,2);
>> fB=f(:,:,3);
>> w=fspecial(\'average\',25);
>> gR=imfilter(fR,w,\'replicate\');
>> gG=imfilter(fG,w,\'replicate\');
>> gB=imfilter(fB,w,\'replicate\');
>> g=cat(3,gR,gG,gB);
>> imshow(g)
也可运行
g=imfilter(f,w,\'replicate\');
效果如下
彩色图像锐化
为了锐化图像,使用了拉普拉斯滤波器模板。
运行如下代码:
>> lapmask = [1 1 1;1 -8 1;1 1 1];
>> f=tofloat(f);
>> fen=f-imfilter(f,lapmask,\'replicate\');
>> imshow(fen)
效果如下
直接在RGB向量空间的处理
使用梯度进行彩色边缘检测
[VG,A,PPG] = colorgrad(f,T)
其中,f是RGB图像,T是区间[0,1]内的一个可选阈值(默认为0);VG是RGB向量梯度Fθ(x, y);A是以弧度计的角度θ(x, y),PPG是由单独彩色平面的二维梯度之和形成的梯度图像。计算上述方程时,要求全部微分都可用函数clorgrad中的Sobel算子来实现。输出VG和PPG通过clorgrad被归一化到区间[0, 1],且它们经过了阈值处理。所以,它们的值小于或等于T,VG(x,y)=0;对于其他的情况,VG(x,y) = VG(x,y)。类似的解释可用于PPG。
运行代码
>> [VG, A, PPG] = colorgrad(f);
>> imshow(VG)
>> imshow(A)
>> imshow(PPG)
效果如下
在RGB向量空间中进行图像分割
使用自定义函数colorseg,函数代码见M函数文件夹。
该函数的语法为
S = colorseg(method,f,T,parameters)
运行测试代码
mask = roipoly(f); % Select region interactively.
red = immultiply(mask, f(:, :, 1));
green = immultiply(mask, f(:, :, 2));
blue = immultiply(mask, f(:, :, 3));
g = cat(3, red, green, blue);
figure, imshow(g);
效果如下