第五章 彩色图像处理

第五章 彩色图像处理

  • MATLAB中彩色图像的表示
    • RGB图像
    • 索引图像
    • 处理RGB和索引图像的函数
  • 彩色空间转换
    • NTSC彩色空间
    • YCbCr彩色空间
    • CMY和CMYK彩色空间
    • HSI彩色空间
    • 与设备无关的彩色空间
  • 彩色图像处理基础
  • 彩色变换
  • 彩色图像的空间滤波
    • 彩色图像平滑
    • 彩色图像锐化
  • 直接在RGB向量空间的处理
    • 使用梯度进行彩色边缘检测
    • 在RGB向量空间中进行图像分割

一.MATLAB中彩色图像的表示

RGB图像

一幅RGB图像是一个MxNx3的彩色像素组。可视为三幅灰度图像形成的“堆叠”。
- 堆叠图像

rgb_image = cat(3, fR, fG, fB)

进行三幅分量图像的提取

fR = rgb_image(:, :, 1);

fG = rgb_image(:, :, 2);

fB = rgb_image(:, :, 3);

>> fR = f(:, :, 1);
>> fG = f(:, :, 2);
>> fB = f(:, :, 3);
>> subplot(221), imshow(f);
>> subplot(222), imshow(fR);
>> subplot(223), imshow(fG);
>> subplot(224), imshow(fB);

image

  • 自定义函数rgbcube
    可以从任意角度查看彩色立方体
    rgbcube(vx, vy, vz)
function rgbcube(vx, vy, vz)
vertices_matrix = [0 0 0; 0 0 1; 0 1 0; 0 1 1; 1 0 0; 1 0 1; 1 1 0; 1 1 1];
faces_matrix = [1 5 6 2; 1 3 7 5; 1 2 4 3; 2 4 8 6; 3 7 8 4; 5 6 8 7];
colors = vertices_matrix;

patch('Vertices', vertices_matrix, 'Faces', faces_matrix, 'FaceVertexCData', colors, 'FaceColor', 'interp', 'EdgeAlpha', 0)

if nargin == 0
    vx = 10;
    vy = 10;
    vz = 4;
elseif nargin ~= 3
    error('Wrong number of inputs.')
end

axis off
view([vx, vy, vz])
axis square

image

索引图像
索引图线有两个分量:一个整型数组矩阵X和一个彩色映射矩阵map。在我自己的理解看来就是把RGB图像分成了两部分存储。 map的每一行都指定单一颜色的红、绿、蓝分量。

imshow(X, map)

或者

image(X);
colormap(map);

后面对索引图像有更多的应用。 - 指定图像的背景色
>> whitebg('g');
>> whitebg('green');
>> whitebg([0 1 0]);
处理RGB和索引图像的函数
  • “抖动”——dither函数
    使用于灰度图像和彩色图像。这种技术常在由点组成的印刷页上给出色调变化的直观印象。

    g = dither(gray_image)


g是抖动处理过的二值图像(logical类)
>> bw = dither(g);
>> subplot(121), imshow(g);
>> subplot(122), imshow(bw);

image

  • 处理索引图像的函数

    • 将灰度图像处理为索引图像

    [X, map] = gray2ind(gray_image, n)

函数可以显示出整型的数据矩阵和彩色映射矩阵

>> [X, map] = gray2ind(g);
>> subplot(131), imshow(g);
>> subplot(132), imshow(X);
>> subplot(133), imshow(map);

image

将彩色图像处理为索引图像也是同样的方法。

[X, map] = rgb2ind(rgb_image, n, dither_option)

dither_option有两个值:‘dither’(默认),以损失空间分辨力为代价达到更好的颜色分辨力;‘nodither’将原始图像中的每个颜色映射为新映射中最接近的颜色,不执行抖动。

>> [X1, map1] = rgb2ind(g, 4, 'nodither');
>> imshow(X1, map1);

image

这样从图中就可以清晰的数出map中有4种颜色数量。

  • 整型的数据矩阵和彩色映射矩阵整合成灰度图像或彩色图像

rgb_ image = ind2rgb(X, map)

  • RGB图像转换为灰度图像

gray_image = rgb2gray(rgb_image)

>> f1 = rgb2gray(f);
>> imshow(f1);
>> subplot(121), imshow(f);
>> subplot(122), imshow(f1);

image

  • 总结使用函数
>> [X1, map1] = rgb2ind(g, 8, 'nodither');
>> subplot(231),imshow(g);
>> subplot(232),imshow(X1, map1);
>> [X2, map2] = rgb2ind(g, 8, 'dither');
>> subplot(233),imshow(X2, map2);
>> g1 = rgb2gray(g);
>> subplot(234),imshow(g1);
>> g2 = dither(g1);
>> subplot(235),imshow(g2);

image

二.彩色空间转换

NTSC彩色空间

NTSC格式中,图像数据由三个分量组成:亮度(Y), 色调(I), 饱和度(Q)。

Y:Luminance,颜色的明视度即亮度,其实就是图像的灰度值(Gray value);I和Q携带颜色信息,In-phase从橙色到青色,Quadrature-phase从紫色到黄绿色。

相互转换过程

yiq_image = rgb2ntsc(rgb_image)

rgb_image = ntsc2rgb(yiq_image)

>> y = rgb2ntsc(g);
>> subplot(131), imshow(g);
>> subplot(132), imshow(y);
>> y = ntsc2rgb(y);
>> subplot(133), imshow(y);

image

YCbCr彩色空间

Cb是蓝色分量和参考值的差,Cr是红色分量和参考值的差。

ycbcr_image = rgb2ycbcr(rgb_image)

rgb_image = ycbcr2rgb(ycbcr_image)

>> y = rgb2ycbcr(f);
>> subplot(131), imshow(f);
>> subplot(132), imshow(y);
>> y = ycbcr2rgb(y);

image

HSV彩色空间

HSV是更接近于人们描述彩色感觉时所用的方式, 也就是色调、饱和度和数值。

hsv_image = rgb2hsv(rgb_image)

rgb_image = hsv2rgb(hsv_image)

>> y = rgb2hsv(g);
>> subplot(131), imshow(g);
>> subplot(132), imshow(y);
>> y = hsv2rgb(y);
>> subplot(133), imshow(y);

image

CMY和CMYK彩色空间

大多数要将材料淀积与纸上的设备都要求输入CMY数据, 比如彩色打印机和复印机等。

cmy_image = imcomplement(rgb_image)

rgb_image = imcomplement(cmy_image)

这个函数很熟悉,其实就是==图像转负片==的处理

>> y = imcomplement(g);
>> subplot(131), imshow(g);
>> subplot(132), imshow(y);
>> y = imcomplement(y);
>> subplot(133), imshow(y);

image

HSI彩色空间

自定义的HSI和RGB之间转换的函数使用方法同上

>> y = rgb2hsi(g);
>> imshow(y);

image

与设备无关的彩色空间
  • CIE和sRGB彩色空间转换

cform = makecform(type)

g = applycform(f, cform)

applycform使用cform结构来转换颜色

以上函数可用于几个设备无关的彩色空间之间进行转换

>> cform = makecform('srgb2xyz');
>> g3 = applycform(g, cform);
>> subplot(121), imshow(g);
>> subplot(122), imshow(g3);

image

  • 构建一个可用于彩色和灰度出版的彩色标尺
>> L = linspace(40, 80, 1024);
>> radius = 70;
>> theta = linspace(0, pi, 1024);
>> a = radius * cos(theta);
>> b = radius * sin(theta);
>> L = repmat(L, 100, 1);
>> a = repmat(a, 100, 1);
>> b = repmat(b, 100, 1);
>> lab_scale = cat(3, L, a, b);
>> cform = makecform('lab2srgb');
>> rgb_scale = applycform(lab_scale, cform);
>> imshow(rgb_scale);

image

  • ICC彩色剖面

为了在输入、输出和显示设备间高质量地再现颜色,需要创建一个变换,来将颜色从一种设备映射到另一种设备中。

在进行练习之前,我先从ICC剖面网站上下载了一个新的.icc剖面作为输出,这样进行对比。

在图片周围加上白框更易于显示图片产生的变化。

>> ff = Fig0612;
>> ff = padarray(f, [40 40], 255, 'both');
>> ff = padarray(ff, [4 4], 230, 'both');
>> subplot(121), imshow(ff);
>> p_srgb = iccread('sRGB.icm');
>> p_snap = iccread('PSOcoated_v3.icc');
>> cform1 = makecform('icc', p_srgb, p_snap);
>> fp_newsprint = applycform(ff, cform1);
>> cform2 = makecform('icc', p_snap, p_srgb, 'SourceRenderingIntent', 
   'AbsoluteColorimetric', 'DestRenderingIntent', 'AbsoluteColorimetric');
>> fp_proof = applycform(fp_newsprint, cform2);
>> subplot(122), imshow(fp_proof);

image

这个剖面是,根据ISO 12647-2:2013标准涂布纸(印刷基材1)进行单张纸和热固式卷筒纸胶印。

图片显示是打印出原图片之后发生的变化。

三.彩色图像处理基础

彩色图像处理细分为三个领域:

1.彩色变换(也称彩色映射)

2.各个彩色平面的空间处理

3.彩色向量处理

四.彩色变换

这一节引入一种使用图形法操作控制点的方法交互产生,并实时显示被处理的图形结果。

先说一下函数ice的开发,ice是一种自定义的函数,在学习过程中我们可以使用DIPUM工具箱里已有的ice.mat包和ice.fig显示。

g = ice(‘Property Name’, ‘Property Value’)

  • 图像及界面显示
>> g = ice('image', f);

image

>> g = ice('image', f, 'space', 'hsi');

image

该图片的负片如下图所示

image

  • 彩色对比增强

image

  • 单色对比增强

image

  • 伪彩色映射

image

image

在RGB彩色空间中表示衣服单色图像且对结果分量分别映射时,变换的结果是一幅伪彩色图像,其中输入图像的灰度级已被任意彩色代替。

  • 彩色平衡

一个重要的应用是照片的增强

>> f2 = ice('image', f, 'space', 'CMY');

image

image

将图片中过量的红色修改。

  • 直方图的映射

image

image

HSI在空间中处理RGB图像,ice中的参数值使用‘space’/‘hsi’

五.彩色空间滤波

彩色图像平滑

线性滤波器平滑一幅RGB图像:
1.抽取三幅分量图像

>> fR = f(:, :, 1);
>> fG = f(:, :, 2);
>> fB = f(:, :, 3);
>> subplot(221), imshow(f), title('RGB');
>> subplot(222), imshow(fR), title('R');
>> subplot(223), imshow(fG), title('G');
>> subplot(224), imshow(fB), title('B');

image

2.分别对每幅分量图像滤波,w表示使用special生成的平滑滤波器

fR_filtered = imfilter(fR, w, ‘replicate’)

>> w = [0.2 0.3 0.3; 0.3 0.2 0.4; 0.2 1 0.5];
>> fR_filtered = imfilter(fR, w, 'replicate');
>> fG_filtered = imfilter(fG, w, 'replicate');
>> fB_filtered = imfilter(fB, w, 'replicate');
>> fc_filtered = cat(3, fR_filtered, fG_filtered, fB_filtered);
>> subplot(221), imshow(fR_filtered), title('R');
>> subplot(222), imshow(fG_filtered), title('G');
>> subplot(223), imshow(fB_filtered), title('B');
>> subplot(224), imshow(fc_filtered), title('fc');

image

3.重建滤波后的RGB图像

fc_filtered = cat(3, fR_filtered, fG_filtered, fB_filtered)

也可以将==前面三个步骤合并为一步==

fc_filtered = imfilter(fc, w, ‘replicate’)

>> fc_filtered = imfilter(f, w, 'replicate');
>> imshow(fc_filtered);

image

与上面图片中的fc是同样的。

  • 彩色图像平滑

==fspecial函数==用于建立预定义的滤波算子,下面代码中用到的fspecial(‘average’, 25), 表示使用大小25 x 25像素的同一滤波器来对亮度分量滤波。平均滤波器大到足以产生有意义的模糊度。

>> h = rgb2hsi(f);
>> H = h(:, :, 1);
>> S = h(:, :, 2);
>> I = h(:, :, 3);
>> w = fspecial('average', 25);
>> hsi_filter = imfilter(h, w, 'replicate');
>> fH_imfiltered = imfilter(H, w, 'replicate');
>> Hsi_filtered = cat(3, fH_imfiltered, S, I);
>> subplot(231), imshow(H), title('H');
>> subplot(232), imshow(S), title('S');
>> subplot(233), imshow(I), title('I');
>> subplot(234), imshow(hsi_filter), title('HSI都平滑');
>> subplot(235), imshow(Hsi_filtered), title('H平滑');

image

彩色图像锐化

在处理灰度图像时我们使用了拉普拉斯滤波器, 在进行彩色图像锐化时,我们也可以使用拉普拉斯算子来锐化图像。

>> f = Fig0625;
>> w = [1 1 1; 1 -8 1; 1 1 1];
>> fdouble = tofloat(f);
>> g = fdouble - imfilter(fdouble, w, 'replicate');
>> subplot(121), imshow(f), title('原');
>> subplot(122), imshow(g), title('锐化');

image

图片可以清楚的显示出对比,图像的清晰度得到了明显的增强。

六.直接在RGB向量空间的处理

各个彩色平面的处理不等于直接在RGB向量空间的处理,所以需要有彩色图片的向量处理。

使用梯度进行彩色边缘检测
  • RGB图像的彩色梯度

[VG, A, PPG] = colorgrad(f, T)

colorgrad是自定义函数,可以实现计算RGB图像空间中的梯度。

VG是RGB向量梯度Fθ(x, y);A是以弧度计的角度图像θ(x, y);PPG是通过对各个彩色平面的二维梯度图像求和形成的梯度图形。

  • 检测RGB图像边缘示例

给出RGB图像的三个分量来形成RGB图像,并观察边缘。

>> g = cat(3, a, b, c);
>> subplot(231), imshow(a);
>> subplot(232), imshow(b);
>> subplot(233), imshow(c);
>> subplot(234), imshow(g), title('合成');
>> [VG, A, PPG] = colorgrad(g);
>> subplot(235), imshow(VG), title('VG');
>> subplot(236), imshow(PPG), title('PPG');

image

上图使用方块可能对显示结果不明显,所以我们处理一幅颜色更丰富的图片

>> f = Fig0604;
>> subplot(141), imshow(f), title('原图');
>> [VG, A, PPG] = colorgrad(f);
>> subplot(142), imshow(VG), title('RGB空间中梯度');
>> subplot(143), imshow(PPG), title('合成梯度');
>> subplot(144), imshow(abs(VG - PPG)), title('绝对差');

image

在RGB向量空间中进行图像分割
  • 分割函数

s = colorseg(method, f, T, parameters)

  • RGB彩色图像分割示例
>> mask = roipoly(f);
>> red = immultiply(mask, f(:, :, 1));
>> green = immultiply(mask, f(:, :, 2));
>> blue = immultiply(mask, f(:, :, 3));
>> g = cat(3, red, green, blue);
>> figure, imshow(g);

image

roipoly是形成交互选择区域的一个二值模板,可以切割成任意多边形图样。

猜你喜欢

转载自blog.csdn.net/qq_39227338/article/details/80108740