【九】彩色图像处理

1 RGB彩色模型理论基础

在计算机中,RGB就是三基色,彩色全域(并不是所有的可见颜色)均可以由RGB三色混合而成。

2 彩色模型

下面是常见的彩色模型,它们互相之间都可转换。

2.1 RGB模型

最常见的彩色模型

2.2 CMY、CMYK模型

基色为青、品红、黄,采用的是减色法,是根据光线被物体及收掉一部分后反射回来的剩余光线所产生的,常用于打印机等。

2.3 HSI模型

从人的视觉系统出发,采用颜色三要素色调、饱和度、亮度来描述颜色。
Matlab实现

rgb转HSI

rgb2hsi.m

function hsi = rgb2hsi(rgb)
% hsi = rgb2hsi(rgb)把一幅RGB图像转换为HSI图像,
% 输入图像是一个彩色像素的M×N×3的数组,
% 其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝三个分量。
% 假如所有的RGB分量是均衡的,那么HSI转换就是未定义的。
% 输入图像可能是double(取值范围是[0, 1]),uint8或 uint16。
%
% 输出HSI图像是double,
% 其中hsi(:, :, 1)是色度分量,它的范围是除以2*pi后的[0, 1];
% hsi(:, :, 2)是饱和度分量,范围是[0, 1];
% hsi(:, :, 3)是亮度分量,范围是[0, 1]。

% 抽取图像分量
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)); %防止除数为0

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; %防止除数为0
S = 1 - 3.* num./den;

H(S == 0) = 0;

I = (r + g + b)/3;

% 将3个分量联合成为一个HSI图像
hsi = cat(3, H, S, I);

主程序

rgb = imread('lena.jpg');
hsi = rgb2hsi(rgb)
imwrite(hsi,'lena_hsi.jpg');%保存用于学习反过程
subplot(1,2,1),imshow(rgb);
title('RGB图');
subplot(1,2,2),imshow(hsi);
title('HSI图');

在这里插入图片描述
HSI转RGB:

hsi2rgb.m

function rgb = hsi2rgb(hsi)
% rgb = hsi2rgb(hsi)把一幅HSI图像转换为RGB图像,
% 其中hsi(:, :, 1)是色度分量,它的范围是除以2*pi后的[0, 1];
% hsi(:, :, 2)是饱和度分量,范围是[0, 1];
% hsi(:, :, 3)是亮度分量,范围是[0, 1]。
%
% 输出图像分量:
% rgb(:, :, 1)为红;
% rgb(:, :, 2)为绿;
% rgb(:, :, 3)为蓝。

% 抽取图像分量
hsi = im2double(hsi);
H = hsi(:, :, 1) * 2 * pi;
S = hsi(:, :, 2);
I = hsi(:, :, 3);

% 执行转换方程
R = zeros(size(hsi, 1), size(hsi, 2));
G = zeros(size(hsi, 1), size(hsi, 2));
B = zeros(size(hsi, 1), size(hsi, 2));

% RG扇形(0 <= H < 2*pi/3)
idx = find( (0 <= H) & (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));

% BG扇形(2*pi/3 <= H < 4*pi/3)
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));

% BR扇形
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));

% 将3个分量联合成为一个RGB图像
rgb = cat(3, R, G, B);
rgb = max(min(rgb, 1), 0);

主程序

hsi = imread('lena_hsi.jpg');
rgb = hsi2rgb(hsi);
subplot(1,2,1),imshow(hsi);
title('HSI图');
subplot(1,2,2),imshow(rgb);
title('RGB图');

在这里插入图片描述

2.4 HSV模型

这是从调色板中调颜色的方法,三个基础元素是色调、饱和度和数值,颜色控件可用倒立的六凌锥表示。

RGB转HSV

Matlab实现

rgb = imread('lena.jpg');
hsv = rgb2hsv(rgb);
imwrite(hsv,'lena_hsv.jpg');
subplot(1,2,1),imshow(rgb);
title('RGB图');
subplot(1,2,2),imshow(hsv);
title('HSV图');

在这里插入图片描述
HSV转RGB

Matlab实现

hsv = imread('lena_hsv.jpg');
hsv2 = im2double(hsv);%Matlab中hsv的输入为double类型,故需要先将uint8转为double.
rgb = hsv2rgb(hsv2);
subplot(1,2,1),imshow(hsv);
title('HSV图');
subplot(1,2,2),imshow(rgb);
title('RGB图');

在这里插入图片描述

2.5 YUV模型

这是一种电视信号,Y代表亮度,U和V代表色差,当只有Y时,画面就是黑白电视的了。

Matlab实现

RGB转YUV

rgb2yuv.m

function yuv = rgb2yuv(rgb)
% yuv = rgb2yuv(rgb)把一幅RGB图像转换为YUV图像,
% 输入图像是一个彩色像素的M×N×3的数组,
% 其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝三个分量。
% 假如所有的RGB分量是均衡的,那么HSI转换就是未定义的。
% 输入图像可能是double(取值范围是[0, 1]),uint8或 uint16。
%
% 输出YUV图像是uint8。
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);

% 执行转换函数
y = 0.299*r + 0.587*g + 0.114*b;
u = 0.567*(b - y);
v = 0.713*(r - y);

% 防止溢出
if(y < 0)
    y = 0;
end;
if(y > 1.0)
    y = 1.0;
end;
if(u < 0)
    u = 0;
end;
if(u > 1.0)
    u = 1.0;
end;
if(v < 0)
    v = 0;
end;
if(v > 1.0)
    v = 1.0;
end;
    
% 联合yuv,并转成uint8类型
y = y*255;
u = u*255;
v = v*255;
yuv = cat(3, y, u, v);
yuv = uint8(yuv);

主程序

rgb = imread('lena.jpg');
yuv = rgb2yuv(rgb);
imwrite(yuv,'lena_yuv.jpg')
subplot(1,2,1),imshow(rgb);
title('RGB图');
subplot(1,2,2),imshow(hsv);
title('YUV图');

在这里插入图片描述
**YUV转RGB

yuv2rgb.m

function rgb = yuv2rgb(yuv)
% yuv = rgb2yuv(rgb)把一幅RGB图像转换为YUV图像,
% 输入图像是一个彩色像素的M×N×3的数组,
% 其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝三个分量。
% 假如所有的RGB分量是均衡的,那么HSI转换就是未定义的。
% 输入图像可能是double(取值范围是[0, 1]),uint8或 uint16。
%
% 输出YUV图像是uint8。
yuv = im2double(yuv);
y = yuv(:, :, 1);
u = yuv(:, :, 2);
v = yuv(:, :, 3);

% 执行转换函数
r = y + 1.402*v;
g = y - 0.344*u - 0.714*v;
b = y + 1.772*u;

% 防止溢出
if(r < 0)
    r = 0;
end;
if(r > 1.0)
    r = 1.0;
end;
if(g < 0)
    g = 0;
end;
if(g > 1.0)
    g = 1.0;
end;
if(b < 0)
    b = 0;
end;
if(b > 1.0)
    b = 1.0;
end;
    
% 联合rgb
r = r*255;
g = g*255;
b = b*255;
rgb = cat(3, r, g, b);
rgb = uint8(rgb);

主程序

yuv = imread('lena_yuv.jpg');
rgb = yuv2rgb(yuv);
subplot(1,2,1),imshow(hsv);
title('YUV图');
subplot(1,2,2),imshow(rgb);
title('RGB图');

在这里插入图片描述

2.6 YIQ模型

北美的彩色制式,跟YUV模型具有同样的优势,Y代表亮度,I代表色调,Q代表饱和度。

Matlab实现

RGB转YIQ

rgb = imread('lena.jpg');
yiq = rgb2ntsc(rgb);
imwrite(yiq,'lena_yiq.jpg');
subplot(1,2,1),imshow(rgb);
title('RGB图');
subplot(1,2,2),imshow(yiq);
title('YIQ图');

在这里插入图片描述

YIQ转RGB

yiq = imread('lena_yiq.jpg');
rgb = ntsc2rgb(yiq);
subplot(1,2,1),imshow(yiq);
title('YIQ图');
subplot(1,2,2),imshow(rgb);
title('RGB图');

在这里插入图片描述

2.7 Lab模型

Lab模型可以表示自然界任何色彩,且与设备无关,其中L代表亮度;a的正数代表红色,负数代表绿色;b的正数代表黄色,负数代表蓝色。

3 全彩色图像处理基础

总的可分为两大类,一是将彩色图像分为3个分量单独处理,二是对彩色像素逐个处理。

3.1 彩色补偿

有些物体可根据颜色区分出来,但在彩色成像设备中易出现颜色扩散,这时就需要彩色补偿。
Matlab实现

im=double(imread('plane.bmp'));
[m,n,p]=size(im);
[h1,k1]=min(255-im(:,:,1)+im(:,:,2)+im(:,:,3));
[j1,minx]=min(h1);
 i1=k1(j1);%提取图像中最接近红色的点,其在im中的坐标为i1,j1
 r1=im(i1,j1,1);
 g1=im(i1,j1,2);
 b1=im(i1,j1,3);
R=0.30*r1+0.59*g1+0.11*b1;

[h2,k2]=min(255-im(:,:,2)+im(:,:,1)+im(:,:,3));
[j2,minx]=min(h2);
 i2=k2(j2);%提取图像中最接近绿色的点,其在im中的坐标为i2,j2
 r2=im(i2,j2,1);
 g2=im(i2,j2,2);
 b2=im(i2,j2,3);
G=0.30*r2+0.59*g2+0.11*b2;

[h3,k3]=min(255-im(:,:,3)+im(:,:,1)+im(:,:,2));
[j3,minx]=min(h3);
 i3=k3(j3);%提取图像中最接近蓝色的点,其在im中的坐标为i3,j3
 r3=im(i3,j3,1);
 g3=im(i3,j3,2);
 b3=im(i3,j3,3);
B=0.30*r3+0.59*g3+0.11*b3;

A1=[r1 r2 r3
    g1 g2 g3
    b1 b2 b3];
A2=[R 0 0
    0 G 0
    0 0 B];
C=A1*inv(A2);

for i=1:m
    for j=1:n

          imR=im(i,j,1);
          imG=im(i,j,2);
          imB=im(i,j,3);
          temp=inv(C)*[imR;imG;imB];
          S(i,j,1)=temp(1);
          S(i,j,2)=temp(2);
          S(i,j,3)=temp(3);
    end
end
S=uint8(S);
subplot(1,2,1),imshow(uint8(im));
title('原始图');
subplot(1,2,2),imshow(S);
title('补偿后');

在这里插入图片描述

3.2 彩色平衡

一幅图像数字化后颜色可能出现小问题,由三基色不平衡造成,将其校正的国产就是彩色平衡。

Matlab实现

im=double(imread('lena.jpg'));
[m,n,p]=size(im);
F1=im(1,1,:);
F2=im(1,2,:);
F1_(1,1,1)=F1(:,:,2);
F1_(1,1,2)=F1(:,:,2);
F1_(1,1,3)=F1(:,:,2);
F2_(1,1,1)=F2(:,:,2);
F2_(1,1,2)=F2(:,:,2);
F2_(1,1,3)=F2(:,:,2);
K1=(F1_(1,1,1)-F2_(1,1,1))/(F1(1,1,1)-F2(1,1,1));
K2=F1_(1,1,1)-K1*F1(1,1,1);
L1=(F1_(1,1,3)-F2_(1,1,3))/(F1(1,1,3)-F2(1,1,3));
L2=F1_(1,1,3)-L1*F1(1,1,3);
for i=1:m
    for j=1:n
          new(i,j,1)=K1*im(i,j,1)+K2;
          new(i,j,2)=im(i,j,2);
          new(i,j,3)=L1*im(i,j,3)+L2;
    end
end
im=uint8(im);
new=uint8(new);
subplot(1,2,1),imshow(im);
title('原始图');
subplot(1,2,2),imshow(new);
title('平衡后');

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值