彩色图像处理

《数字图像处理》 –冈萨雷斯 第六章学习笔记

MATLAB中彩色图像的表示方法

  • RGB 图像

    数据类型为double 型

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

    其中fR,fG和fB分别代表三种RGB分量图像

    RGB彩色空间常常用一个RGB彩色立方体加以图解展示。

    >> rgbcube(5, 5, 10)

  • 索引图像

    索引图像有两个分量,即整数的数据矩阵X和

    imapprox函数

    [Y, newmap] = imapprox(X, map, n)

    指定一幅彩色图

    >> map(k, :) = [r(k) g(k) b(k)]

    更换背景颜色

    >> whitebg = ('g')

    ​ (三种表达)

  • IPT函数

    dither函数

    bw = dither(gray_image)

    抖动后的结果为二值图像

    grayslice函数

    X = grayslice(gray_image, n)

    该函数通过赋给 gray_image 一个阈值来生成一幅索引图像

    gray2ind函数

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

    该函数执行必要的缩放

    ind2gray函数

    gray_image = ind2gray(X, map)

    该函数把一幅由X和map构成的索引图像转换成一幅灰度图像。

    rgb2ind函数

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

    其中,n决定map的长度,dither_option可以有一个或两个值:’dither’执行抖动,’nodither’将原图像上的每一种颜色映射到新图像上与其最接近的颜色,不执行抖动。

    rgb2gray函数

    gray_image = ind2rgb(X, map)

    该函数将一幅RGB图像转换成一幅灰度图像.

    例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    >> f = imread('https://raw.githubusercontent.com/Cristal-yin/MarkdownPhotos/master/images/secondAssignment/iris.jpg');
    [x1, map1] = rgb2ind(f, 8, 'nodither');
    [x2, map2] = rgb2ind(f, 8, 'dither');
    b = ind2rgb(x1, map1);
    c = ind2rgb(x2, map2);
    g = rgb2gray(f);
    g1 = dither(g);
    subplot(1, 5, 1);
    imshow(f);
    subplot(1, 5, 2);
    imshow(b);
    subplot(1, 5, 3);
    imshow(c);
    subplot(1, 5, 4);
    imshow(g);
    subplot(1, 5, 5);
    imshow(g1);

    图片:

转换至其他彩色空间

  • NTSC彩色空间

    主要优势:灰度信息和彩色信息是分离的

    在此制式中,图像数据是由三部分组成

    • 亮度(Y)
    • 色度(I)
    • 饱和度(Q)
  • 函数rgb2ntsc、ntsc2rgb

    rgb2ntsc 输出的图像是double类 , 输入的图像可以是 uint8、uint16或double类

    ntsc2rgb 输入、输出的图像都是double 类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    >> f = imread('Triangle.tif');
    >> yiq = rgb2ntsc(f);
    >> rgb = ntsc2rgb(yiq);
    >> subplot(1, 5, 1);
    >> imshow(rgb);
    >> title('原图');
    >> subplot(1, 5, 2);
    >> imshow(yiq);
    >> title('YIQ');
    >> subplot(1, 5, 3);
    >> figure, imshow(yiq(:, :, 1));
    >> imshow(yiq(:, :, 1));
    >> title('亮度');
    >> subplot(1, 5, 4);
    >> imshow(yiq(:, :, 2));
    >> title('色度');
    >> subplot(1, 5, 5);
    >> imshow(yiq(:, :, 3));
    >> title('饱和度');

    实例图像:

  • YCbCr 彩色空间

    函数ycbCr2rgb、rgb2ycbcr

    ​ 两个函数的输入图像都可以是uint8、uint16或者double类,输出图像和输入图像的类相同。

    1
    2
    3
    >> f = imread('Triangle.tif');
    >> ycb = rgb2ycbcr(f);
    >> rgb = ycbCr2rgb(ycb);

  • HSV彩色空间 (色调、饱和度、数值)

    函数rgb2hsv、hsv2rgb

    ​ rgb2hsv 输入图像可以是 uint8、 uint16或double类,输出图像是double类;hsv2rgb 输入图像必须是 double 类 ,输出图像也是。

    1
    2
    3
    >> f = imread('Triangle.tif');
    >> ycb = rgb2ycbcr(f);
    >> rgb = ycbCr2rgb(ycb);

  • CMY 和 CMYK 彩色空间

    函数imcomplement

  • HSI 彩色空间(色度、饱和度、亮度)

    rgb2hsi.m

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    function hsi = rgb2hsi(rgb)
    rgb = im2double (rgb);
    r = rgb(:, :, 1);
    g = rgb(:, :, 2);
    b = rgb(:, :, 3);
    num = 0.5 * ((r - g) + (r - b));
    den = sqrt( (r - g).^2 + (r - b).* (g - b));
    theta = acos(num./(den +eps));
    H = theta;
    H(b > g) = 2*pi - H(b > g);
    H = H/(2*pi);
    num = min(min(r, g), b);
    den = r + g + b;
    den(den == 0) = eps;
    S = 1 - 3.* num ./ den;
    H (S == 0) = 0;
    I = (r + g + b)/3;
    hsi = cat(3, H, S, I);
    subplot(3, 3, 1);
    imshow(rgb),title('rgb');
    subplot(3, 3, 2);
    imshow(hsi),title('hsi');
    subplot(3, 3, 4);
    imshow(r),title('r');
    subplot(3, 3, 5);
    imshow(g),title('g');
    subplot(3, 3, 6);
    imshow(b),title('b');
    subplot(3, 3, 7);
    imshow(H),title('h');
    subplot(3, 3, 8);
    imshow(S),title('s');
    subplot(3, 3, 9);
    imshow(I),title('i');

彩色图像的处理基础

  • 颜色变换(彩色映射)
  • 单独彩色平面的空间处理
  • 颜色向量处理

彩色变换

  • ice函数

    1
    2
    >> f = imread('breast.tif');
    >> g = ice('image', f);

  • 伪彩色映射

  • 单色和彩色对比度增强

  • 彩色平衡

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

彩色图像的空间滤波

图像平滑和图像锐化

  • 彩色图像平滑

    • 单色图像的平滑(空间平均)可以通过空间掩模中的相应系数(全是1)去

      乘所有像素的值,并用掩模中元素的总数去除来实现。

    • 用邻域平均的平滑可以在独立分量的基础上进行。

    • 使用线性空间滤波器平滑RGB彩色图像fc

      1
      2
      3
      fR = fc(:, :, 1), fG = fc(:, :, 2), fB = fc(:, :, 3);
      fR_filtered = imfilter(fR, w);
      fc_filtered = imfilter(fc, w);

      此方法将RGB图像三幅分量图像提取出来,分别进行分量图像滤波,最后重建滤波。

      1
      2
      三步合一:
      fc_filtered = imfilter(fc, w);

      RGB图像及其分量图像

    1
    2
    3
    4
    5
    6
    7
    f = imread('iris.tif');
    fR = f(:, :, 1);
    fG = f(:, :, 2);
    fB = f(:, :, 3);

    图片:

    HSI分量图像

    平滑后图像

  • 彩色图像锐化

    拉普拉斯算子

    1
    2
    3
    4
    >> 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'));

    图片:

在RGB向量空间直接处理

彩色边缘检测和区域分割

  • 使用梯度的彩色边缘检测

    函数colorgrad实现RGB图像的彩色梯度

    f 是一幅RGB图像,T是范围[0, 1]内的一个可选阈值;

    VG 是RGB 向量梯度,A是以弧度计的角度,用于实现RGB的彩色梯度

    PPG是对单独彩色平面的二维梯度求和形成的梯度

    1
    2
    3
    4
    >> r = f(:,:,1);
    >> g = f(:,:,2);
    >> b = f(:,:,3);
    >> [VG, A, PPG] = colorgrad(f);

    图片:

  • RGB向量空间中的图像分割

    分割是把一幅图像分成一些区域的处理

    使用RGB彩色向量进行分割

    • 函数colorseg