用matlab入一幅彩色图像,利用变换公式将图像从RGB色彩空间转化到HSI色彩空间,再利用分段变换公式将图像从HSI色彩空间还原到RGB色彩空间(自行编写函数),并在同一个窗口内分成三个子窗口来分别显示原图、RGB->HSI、HSI-> RGB,并注上文字标题。
时间: 2024-05-12 21:17:11 浏览: 120
RGB转HSI.zip_chair1u1_rgb转到hsi空间_rgb转换HSI_tookwtt_色彩空间转换
非常感谢您的问题。针对您的问题,我们开发了以下的Matlab代码进行解答。
```
% 读入一幅彩色图像
imgRGB = imread('image.jpg');
% 将图像从 RGB 色彩空间转换到 HSI 色彩空间
imgHSI = rgb2hsi(imgRGB);
% 利用分段变换公式将图像从 HSI 色彩空间还原到 RGB 色彩空间
imgRGB2 = hsi2rgb(imgHSI);
% 在同一个窗口中显示原图、RGB->HSI、HSI->RGB
figure;
subplot(1, 3, 1);
imshow(imgRGB);
title('Original RGB Image');
subplot(1, 3, 2);
imshow(imgHSI);
title('RGB -> HSI Image');
subplot(1, 3, 3);
imshow(imgRGB2);
title('HSI -> RGB Image');
% 自定义函数 rgb2hsi(),实现 RGB -> HSI 转换
function [imgHSI] = rgb2hsi(imgRGB)
% 归一化处理,将 RGB 值从 [0, 255] 转换到 [0, 1]
[h, w, c] = size(imgRGB);
imgRGB = double(imgRGB) / 255;
% 获取 R、G、B 通道
R = imgRGB(:, :, 1);
G = imgRGB(:, :, 2);
B = imgRGB(:, :, 3);
% 计算色相 H(Hue)
numerator = 0.5 * ((R - G) + (R - B));
denominator = sqrt((R - G) .^ 2 + (R - B) .* (G - B));
theta = acosd(numerator ./ (denominator + eps));
H = zeros(h, w);
H(B <= G) = theta(B <= G);
H(B > G) = 360 - theta(B > G);
% 计算饱和度 S(Saturation)
minRGB = min(imgRGB, [], 3);
S = 1 - (3 ./ sum(imgRGB + eps, 3)) .* minRGB;
% 计算亮度 I(Intensity)
I = mean(imgRGB, 3);
% 组装成 HSI 图像
imgHSI = cat(3, H / 360, S, I);
end
% 自定义函数 hsi2rgb(),实现 HSI -> RGB 转换
function [imgRGB] = hsi2rgb(imgHSI)
% 获取 H、S、I 通道
H = imgHSI(:, :, 1) * 360;
S = imgHSI(:, :, 2);
I = imgHSI(:, :, 3);
% 计算 RGB 值
R = zeros(size(H));
G = zeros(size(H));
B = zeros(size(H));
H1 = H / 60;
C = S .* I;
X = C .* (1 - abs(mod(H1, 2) - 1));
isH0to1 = (H1 >= 0) & (H1 < 1);
R(isH0to1) = C(isH0to1);
G(isH0to1) = X(isH0to1);
isH1to2 = (H1 >= 1) & (H1 < 2);
R(isH1to2) = X(isH1to2);
G(isH1to2) = C(isH1to2);
isH2to3 = (H1 >= 2) & (H1 < 3);
G(isH2to3) = C(isH2to3);
B(isH2to3) = X(isH2to3);
isH3to4 = (H1 >= 3) & (H1 < 4);
G(isH3to4) = X(isH3to4);
B(isH3to4) = C(isH3to4);
isH4to5 = (H1 >= 4) & (H1 < 5);
R(isH4to5) = X(isH4to5);
B(isH4to5) = C(isH4to5);
isH5to6 = (H1 >= 5) & (H1 < 6);
R(isH5to6) = C(isH5to6);
B(isH5to6) = X(isH5to6);
m = I - 0.3 * R - 0.59 * G - 0.11 * B;
imgRGB = cat(3, R + m, G + m, B + m) * 255;
imgRGB = uint8(imgRGB);
end
```
需要注意的几点:
- 在该段代码里,自定义了两个函数:rgb2hsi() 和 hsi2rgb(),分别实现 RGB -> HSI 和 HSI -> RGB 的转换。
- 由于我们自定义的函数中使用了 acosd() 函数,因此需要小心对待其中的计算误差,使用了 MATLAB 中的 eps 常数对此进行处理。
- 最后,在显示图像时,我们使用了 subplot() 函数将三个图像放在同一个窗口内,并使用 title() 函数为其添加了标题。
阅读全文