hsi应该是不能在电脑上显示的,要转化为rgb图像。表述或许不准确,体会一下吧。
imshow()函数默认接收的是rgb图像,按RGB对应矩阵中的值显示。或者显示灰度图imshow(I(:,:,1));
在hsi输入下,hsi矩阵的值会被当成rgb的值来输出。具体结果见附图。
function rgb = hsi2rgb( hsi ) %rgb = hsi2rgb( hsi ) 将hsi图像转化为rgb %hsi(:,:,1)色调,范围0-1 double 以下同 %hsi(:,:,2)饱和度 %hsi(:,:,3)亮度 % hsi = im2double(hsi); H = hsi(:,:,1)*2*pi; S = hsi(:,:,2); I = hsi(:,:,3); %执行转化 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扇形 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扇形 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扇形 (4*pi/3) <= H <= (2*pi) 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); end
执行测试代码,rgb2hsi见另一篇文
I = input('input the picture path:\n'); figure(1); imshow(I),title('原图RGB'); I1 = rgb2hsi(I); figure(2); imshow(I1),title('hsi'); figure(3); imshow(hsi2rgb(I1)),title('rgb');