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)
RGB色彩空间通常以图解方式显示为一个RGB色彩立方体
为从任意角度查看该彩色立方体,可使用自定义函数 rgbcube(vx,vy,vz)
rgbcube(5,5,2)
索引图像
索引图像有两个分量:一个整数数据矩阵X和一个彩色映射矩阵map.矩阵map是一个m*3的double类数组,其值是区间[0,1]上的浮点数。
要显示一幅索引图像,可写出imshow(x,map)或image(x);colormap(map)
有时需要用具有较少颜色的映射去近似一个索引映射。为此,我们使用函数imapprox
语法:[Y,newmap] = imapprox(X,map,n)
处理RGB和索引图像的函数
dither 采用“抖动”方法从RGB图像创建索引图像
grayslice 从灰度图像通过阈值处理创建索引图像
gray2ind 从灰度图像创建索引图像
ind2gray 从索引图像创建灰度图像
rgb2ind 从RGB图像创建索引图像
ind2rgb 从索引图像创建RGB图像
rgb2gray 从RGB图像创建灰度图像使用dither
使用grayslice
[X map]=rgb2ind(f,256);subplot(241),imshow(X,map);title('256索引');
[X map]=rgb2ind(f,128);subplot(242),imshow(X,map);title('128索引');
[X map]=rgb2ind(f,64);subplot(243),imshow(X,map);title('64索引');
[X map]=rgb2ind(f,32);subplot(244),imshow(X,map);title('32索引');
[X map]=rgb2ind(f,16);subplot(245),imshow(X,map);title('16索引');
[X map]=rgb2ind(f,8);subplot(246),imshow(X,map);title('8索引');
[X map]=rgb2ind(f,4);subplot(247),imshow(X,map);title('4索引');
[X map]=rgb2ind(f,2);subplot(248),imshow(X,map);title('2索引');
彩色空间转换
颜色基本概念:
亮度
明亮程度,光作用于人眼时所引起的明亮程度不同。
它与被观察物体的发光强度有关,强度大小,决定我们的感觉亮或暗。
如果彩色光的强度降到使人们看不到了,在亮度这个分量上他就以黑色对应,如果其强度变得很大,那么亮度就以白色对应。亮度是非彩色的属性,它描述亮还是暗,彩色图象中的亮度对应于黑白图象中的灰度。
对同一物体照射的光越强,反射光也越强,则越亮。
对不同物体在相同照射情况下,发射越强者看起来越亮。(例如:镜子的反射)
亮度还与人类视觉系统的视觉敏感函数相关,即使强度相同,不同颜色的光当照射同一物体时也会产生不同的亮度。色调
明亮程度,光作用于人眼时所引起的明亮程度不同。
它与被观察物体的发光强度有关,强度大小,决定我们的感觉亮或暗。
如果彩色光的强度降到使人们看不到了,在亮度这个分量上他就以黑色对应,如果其强度变得很大,那么亮度就以白色对应。亮度是非彩色的属性,它描述亮还是暗,彩色图象中的亮度对应于黑白图象中的灰度。
对同一物体照射的光越强,反射光也越强,则越亮。
对不同物体在相同照射情况下,发射越强者看起来越亮。(例如:镜子的反射)
亮度还与人类视觉系统的视觉敏感函数相关,即使强度相同,不同颜色的光当照射同一物体时也会产生不同的亮度。饱和度
饱和度是指颜色的纯度即掺入白光的程度。
饱和度(saturation)是颜色的另一个属性,它描述纯颜色用白色冲淡的程度,高饱和度的颜色含有较少的白色。
饱和度也是可以指颜色的深浅程度。对于同一个色调的彩色光,饱和度越深颜色越鲜明或者说越纯。
例如:当红色加进白光之后冲淡为粉红色,其基本色调还是红色,但饱和度降低;也就是说,淡色的饱和度比鲜艳的颜色要低一些。
饱和度还和亮度有关,如果在就饱和的彩色光中加入白光的成分,增加了光的强度,会变得更亮,但它的饱和度降低了。如果在某色调的彩色光中,掺入别的彩色光,则会引起色调的变化,既基本的颜色变了,只有掺入白光时,仅仅引起饱和度的变化。色度
通常,把色调和饱和度称为色度,则亮度表示某彩色光的明亮程度,色度表示颜色的类别和深浅程度。
NTSC彩色空间
NTSC彩色空间用于模拟电视。这种格式的主要优势是灰度信息和彩色数据是分离开来的,所以同一信号可以用于彩色电视机和黑白电视机。在NTSC格式中,图像数据由三部分组成:亮度(Y)、色调(I)和饱和度(Q)。在这里,字母YIQ的选择常常是按照惯例进行的。亮度分量描述灰度信息,其他两个分量携带电视信号的彩色信息。YIQ分量都是用线性变换从一幅图像的RGB分量得到的:
f = imread('hua.png');
g = rgb2ntsc(f);
subplot(121),imshow(f),title('原图');
subplot(122),imshow(g),title('rgb2ntsc');
相应的函数ntsc2rgb可以将图片转化回去
YCbCR彩色空间
YCbCr彩色空间广泛用于数字视频。在这种格式中,亮度信息用单独的分量Y来表示,彩色信息是用两个色差分量Cb和Cr来存储的。分量Cb是蓝色分量与参考值的差,分量Cr是红色分量与参考值的差。工具箱采用的从RGB转换为YcbCr的变换是:
g = rgb2ycbcr(f);
subplot(121),imshow(f),title('原图');
subplot(122),imshow(g),title('rgb2ycbcr');
相应的函数ycbr2rgb可以将图片转化回去
HSV彩色空间
HSV(色调、饱和度、值)是人们用来从颜色轮或调色板中挑选颜色(例如颜料或墨水)时使用的彩色系统之一,值得考虑的是,这个颜色系统比RGB系统更接近人们的经验和对彩色的感知。在画家的术语里,色调、饱和度和数值被称作色调、明暗和色值。
HSV彩色空间可以通过从RGB彩色立方体沿灰度轴(连接黑色顶点和白色顶点的轴)用公式来表达,从而得出图6-5(a)所示的六边形表示的彩色调色板。当我们沿着图6-5(b)中的垂直轴(灰)轴移动时,这个与轴垂直的六边形平面的大小是变化的,并产生了图中描述的量。
g = rgb2hsv(f);
subplot(121),imshow(f),title('原图');
subplot(122),imshow(g),title('rgb2hsv');
使用函数rgb2hsv,hsv2rgb可以转换回去
CMY和CMYK彩色空间
imcomplement
HSI彩色空间
HSI模型是美国色彩学家孟塞尔(H.A.Munseu)于1915年提出的,它反映了人的视觉系统感知彩色的方式,以色调、饱和度和强度三种基本特征量来感知颜色。
rgb = rgb2hsi(‘img’),rgb = hsi2rgb(‘img’)可以转换回来
彩色图像处理的基础知识
1) 颜色变换(也叫彩色映射)
2) 单独彩色平面的空间处理
3) 颜色向量的处理
- ice函数(交互颜色编辑)
属 性 名 属 性 值
image 一幅RGB或单色输入图像f,由交互指定的映射来变换
space 被修改的分量彩色空间。可能的值是’rgb’、’cmy’、’hsi’、’hsv’、’ntsc’(或’yiq’)和’ycbcr’,默认值是’rgb’
wait 如果是’on’(默认),g是被映射的图像;如果是’off’,g是映射输入图像的句柄
g = ice('image',f);
![ice](https://img-blog.csdn.net/20170628173852874?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![这里写图片描述](https://img-blog.csdn.net/20170628174242345?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![这里写图片描述](https://img-blog.csdn.net/20170628174909261?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![这里写图片描述](https://img-blog.csdn.net/20170628192501656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![这里写图片描述](https://img-blog.csdn.net/20170629133220145?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
彩色图像的空间滤波
彩色图像平滑
- 抽取三幅分量图
f = imread('hua.png');
fR = f(:, :, 1);
fG = f(:, :, 2);
fB = f(:, :, 3);
subplot(221);imshow(f);title('原图');
subplot(222);imshow(fR);title('原图');
subplot(222);imshow(fR);title('RED');
subplot(223);imshow(fG);title('GREEN');
subplot(224);imshow(fB);title('BLUE');
- 分别对每幅分量图像滤波
w = fspecial('average',5);
fR_filtered = imfilter(fR,w,'replicate');
fR_filtered = imfilter(fG,w,'replicate');
fR_filtered = imfilter(fB,w,'replicate');
- 重建滤波后的RGB图像
fc_filtered = cat(3,fR_filtered,fG_filtered,fB_filtered);
上诉三步可以合并为:fc_filtered = imfilter(f,w,’replicate’);
HSI亮度分量平滑
h = rgb2hsi(f);
H = h(:,:,1);
S = h(:,:,2);
I = h(:,:,3);
w = fspecial('average',25);
I_filtered = imfilter(I,w,'replicate');
h = cat(3,H,S,I_filtered);
fc = hsi2rgb(h);
imshow(fc)
彩色图像锐化
w = fspecial('average',5);
fa = imfilter(f, w, 'replicate');
lapmask = [1 1 1; 1 -8 1; 1 1 1];
fen = imsubtract(fa, imfilter(fa, lapmask, 'replicate'));
subplot(121),imshow(fa);
subplot(122),imshow(fen);
直接在RGB向量空间的处理
使用梯度进行色彩边缘检测
[VG,A,PPG] = colorgrad(f);
其中,f是RGB图像,T是[0,1]范围内的阈值选项(默认为0);VG是RGB向量梯度Fθ(x, y);A是以弧度计的角度θ(x, y),并且PPG是由单独彩色平面的2D梯度之和形成的梯度图像。计算上述方程时,要求全部微分都可用函数clorgrad中的Sobel算子来实现。输出VG和PPG通过clorgrad被归一化到[0, 1]范围内,并且把它们作为阈值进行处理。所以,它们的值小于或等于T,VG(x,y)=0;对于其他的情况,VG(x,y) = VG(x,y)。类似的解释可用于PPG。
f1 = imread('1.jpg');
f2 = imread('2.jpg');
f3 = imread('3.jpg');
g = cat(3,f1,f2,f3);
[VG, A, PPG] = colorgrad(g);
在RGB向量空间中进行图像分割
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);