MATLAB学习笔记 彩色空间转换

彩色空间转换

我们之前都是对RGB图像对彩色图像进行操作(间接或直接),很少用到其他的彩色空间,这章我们学习从RGB变换得到的彩色空间(彩色模型)。
这些彩色空间包括NTSC、YCbCr、HSV、CMY、CMYK、HSI。

NTSC彩色空间

NTSC彩色模型为模拟电视, 分为三个分量,YIQ ,分为别亮度,色调, 对比度(就是我们常常调自己家电视的亮度、色调、对比度),这个模型使得同一个信号,可以在彩色电视显示,也可以在黑白电视显示。

rgb2ntsc(image) 将RGB图像变换为NTSC
f = imread('onion.png');
g = rgb2ntsc(f);
subplot(1, 2, 1), imshow(f), title('RGB');
subplot(1, 2, 2), imshow(g), title('NTSC');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述
ntsc2rgb(image) 将NTSC图像变换为RGB图像
f = imread('onion.png');
g = rgb2ntsc(f);
img = ntsc2rgb(g);
subplot(1, 3, 1), imshow(f), title('原图');
subplot(1, 3, 2), imshow(g), title('NTSC');
subplot(1, 3, 3), imshow(img), title('RGB');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述
myRgb2ntsc(image) 自制的rgb2ntsc,将RGB变换NTSC格式
f = imread('onion.png');
g = rgb2ntsc(f);
img = myRgb2ntsc(f);
subplot(1, 3, 1), imshow(f), title('原图');
subplot(1, 3, 2), imshow(g), title('NTSC rgb2ntsc');
subplot(1, 3, 3), imshow(img), title('NTSC myRgb2ntsc');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述
myNtsc2rgb(image) 自制的ntsc2rgb, 将NTSC变换为RGB
f = imread('onion.png');
g = rgb2ntsc(f);
img = myNtsc2rgb(g);
subplot(1, 3, 1), imshow(f), title('原图');
subplot(1, 3, 2), imshow(g), title('NTSC');
subplot(1, 3, 3), imshow(img), title('RGB');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述

YCbCr彩色空间

YCbCr彩色模型用于数字视频中。模型分为3个分量,Y(亮度) Cb(蓝色分量和参数值的差) Cr(红色分量和参考值的差)

rgb2ycbcr(image) 将RGB图像转为YCbCr
f = imread('onion.png');
g = rgb2ycbcr(f);
subplot(1, 2, 1), imshow(f), title('原图');
subplot(1, 2, 2), imshow(g), title('YCbCr');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述
ycbcr2rgb(image) 将YCbCr转为RGB
f = imread('onion.png');
g = rgb2ycbcr(f);
img = ycbcr2rgb(g);
subplot(1, 3, 1), imshow(f), title('原图');
subplot(1, 3, 2), imshow(g), title('YCbCr');
subplot(1, 3, 3), imshow(img), title('RGB');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述

HSV彩色空间

HSV分别代表色调、饱和度、数值,该模型更加贴近人们的经验和描述彩色感觉时所采用的方式,在艺术领域,称为色泽、明暗、调色。

rgb2hsv(image) 将RGB转为HSV
f = imread('onion.png');
g = rgb2hsv(f);
subplot(1, 2, 1), imshow(f), title('原图');
subplot(1, 2, 2), imshow(g), title('HSV');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述
**hsv2rgb(image) 将HSV转为RGB
f = imread('onion.png');
g = rgb2hsv(f);
img = hsv2rgb(g);
subplot(1, 3, 1), imshow(f), title('原图');
subplot(1, 3, 2), imshow(g), title('hsv');
subplot(1, 3, 3), imshow(img), title('RGB');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述

CMY和CMYK彩色空间

该模型常常用于彩色打印。
CMY模型分为三个分量,C 青色(Cyan)、M 深红色(Magenta)、Y 黄色(Yellow)。
CMYK则是在CMY上加一个黑色

imcomplement(image) 获取图片负片, 可以实现CMY模型与RGB互换
f = imread('onion.png');
g = imcomplement(f);
img = imcomplement(g);
subplot(1, 3, 1), imshow(f), title('原图');
subplot(1, 3, 2), imshow(g), title('CMY');
subplot(1, 3, 3), imshow(img), title('RGB');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述

HSI彩色空间

HSI模型三个分量为, H 色彩(hue), S 饱和度(saturation), I 强度(intensity)

rgb2hsi(image) 将rgb图像转为hsi图像
f = imread('onion.png');
g = rgb2hsi(f);
subplot(1, 2, 1), imshow(f), title('原图');
subplot(1, 2, 2), imshow(g), title('HSI');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述
hsi2rgb(image) 将hsi图像变换为rgb图像
f = imread('onion.png');
g = rgb2hsi(f);
img = hsi2rgb(g);
subplot(1, 3, 1), imshow(f), title('原图');
subplot(1, 3, 2), imshow(g), title('HSI');
subplot(1, 3, 3), imshow(img), title('RGB');
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述

附录

代码

myRgb2ntsc.m
function img = myRgb2ntsc(f)
    f = im2double(f);
    d =  [0.229, 0.587, 0.114; 0.596, -0.274, -0.332; 0.211, -0.523, 0.312] ;
    r = f(:, :, 1);
    g = f(:, :, 2);
    b = f(:, :, 3);
    y = r * d(1, 1) + g * d(1, 2) + b * d(1, 3);
    i = r * d(2, 1) + g * d(2, 2) + b * d(2, 3);
    q = r * d(3, 1) + g * d(3, 2) + b * d(3, 3);
    img = cat(3, y, i, q);
end
myNtsc2rgb.m
function img = myNtsc2rgb(f)
    f = im2double(f);
    d =  [1.0, 0.956, 0.621; 1.0, -0.272, -0.647; 1.0, -1.106, 1.703];
    y = f(:, :, 1);
    i = f(:, :, 2);
    q = f(:, :, 3);
    r = y * d(1, 1) + i * d(1, 2) + q * d(1, 3);
    g = y * d(2, 1) + i * d(2, 2) + q * d(2, 3);
    b = y * d(3, 1) + i * d(3, 2) + q * d(3, 3);
    img = cat(3, r, g, b);
end
rgb2hsi.m
function hsi = rgb2hsi(image)
    rgb = im2double(image);
    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);
end
hsi2rgb.m
function rgb = hsi2rgb(hsi)
    H = hsi(:, :, 1) * 2 * pi;
    S = hsi(:, :, 2);
    I = hsi(:, :, 3);
    width = size(hsi, 1);
    height =  size(hsi, 2);
    R = zeros(width, height);
    G = zeros(width, height);
    B = zeros(width, height);

    idx = find(0 <= H < 2 * pi / 3);
    B(idx) = I(idx) .* (1 - S(idx));
    R(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx)) ./ cos(pi / 3 - H(idx)));
    G(idx) = 3 * I(idx) - (R(idx) + B(idx));

    idx = find((2 * pi / 3 <= H & H < 4 * pi / 3));
    R(idx) = I(idx) .* (1 - S(idx));
    G(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 2 * pi / 3) ./ cos(pi - H(idx)));
    B(idx) = 3 * I(idx) - (R(idx) + G(idx));

    idx = find((4 * pi / 3 <= H) & (H <= 2 * pi));
    G(idx) = I(idx) .* (1 - S(idx));
    B(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 4 * pi / 3) ./ cos(5 * pi / 3 - H(idx)));
    R(idx) = 3 * I(idx) - (G(idx) + B(idx));

    rgb = cat(3, R, G, B);
    rgb = max(min(rgb, 1), 0);
end
  • 12
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值