用matlab实现rgb2hsi函数
时间: 2024-03-14 12:46:49 浏览: 385
在 MATLAB 中,可以使用以下公式实现 RGB 到 HSI 的转换:
H = atan2((G - B), (R - B))
if (H < 0)
H = H + 2 * pi
end
S = 1 - 3 * min(R, G, B) / (R + G + B)
I = (R + G + B) / 3
其中,R、G、B 分别为 RGB 颜色空间中的三个分量,H、S、I 分别为 HSI 颜色空间中的色相、饱和度和亮度。需要注意的是,H 的取值范围为 [0, 2π),需要做一下范围调整。
以下是一个用 MATLAB 实现的 RGB2HSI 的函数:
```matlab
function hsi = rgb2hsi(rgb)
% 将 RGB 值归一化到 [0, 1] 范围内
rgb = double(rgb) / 255.0;
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);
h = atan2(g - b, r - b);
h(h < 0) = h(h < 0) + 2 * pi;
s = 1 - 3 * min(rgb, [], 3) ./ sum(rgb, 3);
i = mean(rgb, 3);
hsi = cat(3, h, s, i);
end
```
这个函数可以将一张 RGB 图像转换成 HSI 图像。
相关问题
用matlab实现hsi2rgb函数
在 MATLAB 中,可以使用以下公式实现 HSI 到 RGB 的转换:
if (H < 2 * pi / 3)
B = I * (1 - S)
R = I * (1 + S * cos(H) / cos(pi / 3 - H))
G = 3 * I - (R + B)
elseif (H < 4 * pi / 3)
H = H - 2 * pi / 3
R = I * (1 - S)
G = I * (1 + S * cos(H) / cos(pi / 3 - H))
B = 3 * I - (R + G)
else
H = H - 4 * pi / 3
G = I * (1 - S)
B = I * (1 + S * cos(H) / cos(pi / 3 - H))
R = 3 * I - (G + B)
end
其中,R、G、B 分别为 RGB 颜色空间中的三个分量,H、S、I 分别为 HSI 颜色空间中的色相、饱和度和亮度。需要注意的是,H 的取值范围为 [0, 2π),需要做一下范围调整。
以下是一个用 MATLAB 实现的 HSI2RGB 的函数:
```matlab
function rgb = hsi2rgb(hsi)
% 将 HSI 值归一化到 [0, 1] 范围内
h = hsi(:, :, 1);
s = hsi(:, :, 2);
i = hsi(:, :, 3);
h = mod(h, 2 * pi);
r = zeros(size(h));
g = zeros(size(h));
b = zeros(size(h));
% 第一种情况
idx = (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 = (h < 4 * pi / 3) & (h >= 2 * pi / 3);
h(idx) = h(idx) - 2 * pi / 3;
r(idx) = i(idx) .* (1 - s(idx));
g(idx) = i(idx) .* (1 + s(idx) .* cos(h(idx)) ./ cos(pi / 3 - h(idx)));
b(idx) = 3 * i(idx) - (r(idx) + g(idx));
% 第三种情况
idx = (h >= 4 * pi / 3);
h(idx) = h(idx) - 4 * pi / 3;
g(idx) = i(idx) .* (1 - s(idx));
b(idx) = i(idx) .* (1 + s(idx) .* cos(h(idx)) ./ cos(pi / 3 - h(idx)));
r(idx) = 3 * i(idx) - (g(idx) + b(idx));
rgb = cat(3, r, g, b) * 255.0;
rgb(rgb < 0) = 0;
rgb(rgb > 255) = 255;
rgb = uint8(rgb);
end
```
这个函数可以将一张 HSI 图像转换成 RGB 图像。需要注意的是,最后得到的 RGB 值需要进行范围调整,保证在 [0, 255] 的整数范围内。
使用matlab,不借用matlab自带函数,实现RGB到HSI空间的转换
RGB到HSI的转换公式如下:
H = arccos(0.5*((R-G)+(R-B))/sqrt((R-G)^2+(R-B)*(G-B)))
if B > G
H = 360 - H
end
S = 1 - 3*(min(R,G,B))/(R+G+B)
I = (R+G+B)/3
其中,H表示色调,S表示饱和度,I表示亮度。
下面是一个实现RGB到HSI转换的Matlab代码:
```matlab
% 输入RGB图像
rgb_img = imread('input.png');
% 取出各通道数据
R = double(rgb_img(:,:,1));
G = double(rgb_img(:,:,2));
B = double(rgb_img(:,:,3));
% 计算H
numerator = 0.5*((R-G)+(R-B));
denominator = sqrt((R-G).^2+(R-B).*(G-B));
theta = acosd(numerator./(denominator+eps));
H = theta;
H(B>G) = 360 - H(B>G);
% 计算S
S = 1 - 3.*min(min(R,G),B)./(R+G+B+eps);
% 计算I
I = (R+G+B)./3;
% 合并为HSI图像
hsi_img = cat(3,H,S,I);
% 显示HSI图像
imshow(hsi_img);
```
需要注意的是,由于arccos函数的返回值是弧度制的角度,因此需要使用acosd函数将其转换为角度值。此外,在计算S时,需要将R、G、B的最小值分别与每个像素的和相除,因此使用min函数时需要使用两次嵌套,或者使用min函数的dim参数。
阅读全文