【无标题】(H, W, C)->(C, H, W)

非常感谢您的问题。针对您的问题,我们开发了以下的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() 函数为其添加了标题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值