RGB-HSI

RGB空间和HSI空间互转

  • 1.HSI彩色空间

1.1 HSI彩色空间的概念
HSI颜色空间是从人的视觉系统出发,用色调(Hue)、色饱和度(Saturation或Chroma)和亮度(Intensity或Brightness)来描述色彩。HSI颜色空间可以用一个圆锥空间模型来描述。用这种描述HIS色彩空间的圆锥模型相当复杂,但确能把色调、亮度和色饱和度的变化情形表现得很清楚。
RGB 向HSI 模型的转换是由一个基于笛卡尔直角坐标系的单位立方体向基于圆柱极坐标的双锥体的转换。基本要求是将RGB 中的亮度因素分离,将色度分解为色调和饱和度,并用角向量表示色调,如下图所示。
图1 RGB(左)与HSI(右)模式示意图
1.3 RGB与HSI互相转换公式
此处的RGB转HSI的公式采用算法1(几何推导法),HSI转RGB是算法1的逆运算。
首先是RGB转HSI:
这里写图片描述

然后是HSI转RGB:
这里写图片描述

1.3 RGB和HSI互相转换的matlab程序

1.RGB转 HSI

function hsi = rgb2hsi(rgb) 
rgb = im2double(rgb); 
r = rgb(:, :, 1); 
g = rgb(:, :, 2); 
b = rgb(:, :, 3); 
% Implement the conversion equations. 
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;
% Combine all three results into an hsi image. 
hsi = cat(3, H, S, I);
2.HSI 转 RGB
function rgb = hsi2rgb(hsi) 
% Extract the individual HSI component images. 
H = hsi(:, :, 1) * 2 * pi; 
S = hsi(:, :, 2); 
I = hsi(:, :, 3); 
% Implement the conversion equations. 
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 sector (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 sector (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 sector. 
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); 
  
  
  • 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
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 2.Matlab实现

在Matlab中实现,先选取一张RGB的图片”test1.jpg”,然后调低亮度并另存为一副本”test2.jpg”,如图1所示。然后分别对它们转灰度图,并在原图的基础上对其转成HSI空间模型,如图2所示。这时可以得到HSI模型的3个强度的分量H,S,I。因为对于两幅原图,我们只做了亮度差异的处理,所以分别转换成HSI彩色空间的后,只需要将它们的亮度分量I设为一致就可以了。代码中我们使test2的亮度分量与test1的亮度分量一致,即将test1的亮度分量赋给test2的亮度分量。最后再将他们转换回RGB图像。最后发现转换会的图有相同的亮度,如图4所示。再取他们的灰度共生矩阵,得到他们的GLCM参数对比后发现,各参数基本相同。
图1 原图的GLCM参数  图2 转换后的GLCM参数
Stata1 : 原图1灰度图的GLCM参数;
Stats2 : 原图2灰度图的GLCM参数;
Stats3 : 图1转换后灰度图的GLCM参数;
Stats4 : 图2的HSI调整亮度分量后灰度图的GLCM。

这里写图片描述
图2 原图
这里写图片描述
图3 HSI彩色空间图
这里写图片描述
图4 修改后原图

  • 3.结论

原图test1和原图test2只是做了亮度的差异,处理后test2的亮度明显低于test2的亮度。实验数据结果显示,stats1中的各属性参数,与stats3和stats4中的参数数据差别不大,正因为stats3是原图经过HSI变换后在变到RGB图像的。而stats4中的参数是经过在HSI空间中对原图2的亮度调整成与原图1一致后的RGB图像的GLCM的歌属性参数数据。而stats2中的数据与其他3个相差较多正说明亮度的差异。
所以,经过RGB转HSI后,对HSI空间模型中的光照强度I的调整,可以实现将只有亮度不同的两幅图像通过在HSI空间的调节,使得两张照片的亮度达到一致。

代码:

rgb1=imread('C:\Users\Administrator\Desktop\test1.jpg');
rgb2=imread('C:\Users\Administrator\Desktop\test2.jpg');

figure;imshow(rgb1);title('原图1');
figure;imshow(rgb2);title('原图2');

P1=rgb2gray(rgb1);
P2=rgb2gray(rgb2);
rgb1=im2double(rgb1);
rgb2=im2double(rgb2);

hsi1=rgb2hsi(rgb1);
hsi2=rgb2hsi(rgb2);

figure;imshow(hsi1);title('图1的HSI空间图');
figure;imshow(hsi2);title('图2的HSI空间图');

B=hsi1(:, :, 3);
hsi2(:, :, 3)=B;

G1=hsi2rgb(hsi1);
G2=hsi2rgb(hsi2);

I1=rgb2gray(G1);
I2=rgb2gray(G2);

figure;imshow(G1);title('经转换后的图1');
figure;imshow(G2);title('修改亮度分量后的图2');

GLCM1 = graycomatrix(P1,'NumLevels',8,'Offset',[0,2]);
stats1 = graycoprops(GLCM1) 

GLCM2 = graycomatrix(P2,'NumLevels',8,'Offset',[0,2]);
stats2 = graycoprops(GLCM2)

GLCM1 = graycomatrix(I1,'NumLevels',8,'Offset',[0,2]);
stats3 = graycoprops(GLCM1) 

GLCM2 = graycomatrix(I2,'NumLevels',8,'Offset',[0,2]);
stats4 = graycoprops(GLCM2)
  
  
  • 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
  • 37
  • 38
  • 39
  • 40
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
            </div>

RGB空间和HSI空间互转

猜你喜欢

转载自blog.csdn.net/qq_32790593/article/details/83862317
HSI