真彩图像与HSI图像转换-附Matlab源代码

一、真彩图像与索引图像、灰度图像之间的转换

对MATLAB自带的pepper.png图像进行图像格式的转换。真彩图像如图1(a)所示,由真彩图像转换为索引图像,如图1(b)所示;索引图像的灰度部分如图1(c)所示;由真彩图像转换为灰度图像如图1(d)所示。

图1

代码如下:

RGB = imread('peppers.png');
[X,map] = rgb2ind(RGB,128);%真彩图像转化为索引图像
G = rgb2gray(RGB); %真彩色图像转化为灰度图像;
size(RGB)%真彩图像是三维数组,每个通道每个像素点有其颜色值,颜色取值为[0,255]
size(map)%三个通道颜色值量化为128个颜色,每个颜色有R,G,B三个通道值。
size(X)%图像像素对应map中一个值,取值为[0,128]
size(G)%灰度图像每个像素对应一个灰度值,取值为[0,255]

figure,
subplot(2,2,1),imshow(RGB);xlabel('(a)')
subplot(2,2,2),imshow(X,map);;xlabel('(b)')%索引图像,为彩色的
subplot(2,2,3), imshow(X);;xlabel('(c)')%量化为[0,128]的灰度图
subplot(2,2,4), imshow(G);;xlabel('(d)')%灰度图像,灰度值[0,255]

二、真彩图像与HSI图像之间的转换

RGB 图像是最常用的图像格式,它还可以转换为 HSI(色度,饱和度,亮度),YUV(亮度,色度参数),CMY(青,品红,黄彩色),CMYK(青,品红,黄,黑彩色)等图像格式。其中,HSI格式各个通道的相关性最小,适合网络传输和压缩,在图像格式中占有很重要的地位。这些转换不是MATLAB自带的程序,需要编写程序进行转换。本博文以RGB转换为HSI图像为例,编程实现这种转换。

将[0,255]取值的R、G、B通道值拉伸为[0,1]区间的数r、g、b,然后,进行下面的转换。

RGB与HSI的转换关系:

 反过来,由HSI变换为RGB坐标的公式如下:

对于MATLAB自带的图像pepper.png进行HSI通道转换,HSI对应的通道图像如图2a)~(c)所示,其真彩图像对应的RGB三个颜色通道的图像如图2d)~(f)所示。

图2

程序如下:


rgb = imread('peppers.png');
hsi = Rgb2hsi(rgb);
H = hsi(:,:,1);
S = hsi(:,:,2);
I = hsi(:,:,3);
Nrgb = Hsi2rgb(hsi);
Nrgb = im2uint8(Nrgb);%图像格式转化
max(max(rgb-Nrgb))
R = Nrgb(:,:,1);
G = Nrgb(:,:,2);
B = Nrgb(:,:,3);


figure,
subplot(3,2,1),imshow(H, []);xlabel('(a)HSI图像色度H分量')
subplot(3,2,2),imshow(S, []);;xlabel('(b)HSI图像饱和度S分量')%索引图像,为彩色的
subplot(3,2,3), imshow(I, []);;xlabel('(c)HSI图像亮度分量')%量化为[0,128]的灰度图
subplot(3,2,4), imshow(R,[]);;xlabel('(d)真彩图像红色R分量')%灰度图像,灰度值[0,255]
subplot(3,2,5), imshow(G,[]);;xlabel('(e)真彩图像红色G分量')%灰度图像,灰度值[0,255]
subplot(3,2,6), imshow(B,[]);;xlabel('(f)真彩图像红色B分量')%灰度图像,灰度值[0,255]

 子程序:

%R :[0,255],G: [0,255],B: [0,255]
%H :[0,2*pi],S :[0,1],I: [0,1]
%输入变量X为真彩图像,输出变量Y为HSI图像

function Y = Rgb2hsi(X)

%图像格式转化
X1 = im2double(X);

%获取rgb分量
r = X1(:,:,1);
g = X1(:,:,2);
b = X1(:,:,3);

% 图像亮度分量I
I = (r + g + b)./3;

% 图像色度分量H,是角度值
F = 0.5*((r - g) + (r - b))./(sqrt((r - g).^2+(r - b).*(g - b))+eps);%此处为避免除零,加入小量eps。
st = zeros(size(r));% H的常数项
sig = ones(size(r));% H中符号量
st(find(b>g)) = 1;
sig(find(b>g)) = -1;
H = (2 * pi * st + sig .* acos(F));
% H可以除以(2*pi)归一化到了[0,1],如果这样在反变换过程中要注意反归一化,将该分量乘以(2*pi)。

%图像饱和度分量S
den = r + g + b;
den(den==0) = eps;%此处为避免除零,进行该操作。
S = 1 - 3 * min(min(r,g),b)./(den);%为更精确未直接用I带入。

%补充一下,在饱和度为零时,其色度分量也为零。
H(S == 0) = 0;
%组成一个矩阵
Y = cat(3,H,S,I);

 子程序:

%输入变量X为HSI图像,输出变量Y为真彩图像

function Y = Hsi2rgb(X)
%获取HSI分量
H = X(:,:,1);
S = X(:,:,2);
I = X(:,:,3);
%分配RGB空间
R = zeros(size(H));
G = zeros(size(H));
B = zeros(size(H));
%分情况计算RGB取值
s1 = find( (H>=0) & (H < 2*pi/3));%找寻满足条件的指标集
R(s1) = I(s1).*(1 + S(s1).*cos(H(s1))./cos(pi/3 - H(s1)));
B(s1) = I(s1).*(1 - S(s1));
G(s1)= 3.*I(s1) - R(s1) - B(s1);

d1 = find((2*pi/3<= H) & (H <4*pi/3));%找寻满足条件的指标集
G(d1) = I(d1).*(1 + S(d1).*cos(H(d1)-2*pi/3)./cos(pi - H(d1)));
R(d1) = I(d1).*(1 - S(d1));
B(d1)= 3.*I(d1) - R(d1) - G(d1);

e1 = find((4*pi/3<= H) & (H <= 2*pi));%找寻满足条件的指标集
B(e1) = I(e1).*(1 + S(e1).*cos(H(e1) - 4*pi/3)./cos(5.*pi/3 - H(e1)));
G(e1) = I(e1).*(1 - S(e1));
R(e1)= 3.*I(e1) - G(e1) - B(e1);
Y = cat(3,R,G,B);%组成一个矩阵
Y = max(min(Y, 1), 0);%进行[0,1]区间控制

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值