function z = hsi2rgb(x) % L = 2^ceil(log2(max(max(x)))); % you may replace 255 with L-1 L = 256; x = double(x)/(L-1); h = x(:, :, 1); s = x(:, :, 2); i = x(:, :, 3); r = h; b = s; g = i; % RG Sector h = x(:, :, 1)*2*pi; k = h < 2*pi/3; l = cos(pi/3 - h(k)) == 0; h(k(l)) = h(k(l)) - eps; b(k) = i(k) .* (1 - s(k)); r(k) = i(k) .* ( 1 + s(k) .* cos(h(k)) ./ cos(pi/3 - h(k)) ); g(k) = 3*i(k) - ( r(k) + b(k) ); % GB Sector h = x(:, :, 1)*2*pi; k = (h >= 2*pi/3) & (h < 4*pi/3); h(k) = h(k) - 2*pi/3; l = cos(pi/3 - h(k)) == 0; h(k(l)) = h(k(l)) - eps; r(k) = i(k) .* (1 - s(k)); g(k) = i(k) .* ( 1 + s(k) .* cos(h(k)) ./ cos(pi/3 - h(k)) ); b(k) = 3*i(k) - ( r(k) + g(k) ); % BR Sector h = x(:, :, 1)*2*pi; k = (h >= 4*pi/3); h(k) = h(k) - 4*pi/3; l = cos(pi/3 - h(k)) == 0; h(k(l)) = h(k(l)) - eps; g(k) = i(k) .* (1 - s(k)); b(k) = i(k) .* ( 1 + s(k) .* cos(h(k)) ./ cos(pi/3 - h(k)) ); r(k) = 3*i(k) - ( g(k) + b(k) ); z(:,:,1) = r; z(:,:,2) = g; z(:,:,3) = b; z = round(z*255); k = z > 255; z(k) = 255; z = uint8(z);