RGB to HSV and HSV to RGB conversion

It took me way too long to figure these out, so I post them here. For RGB <> HSL you can use ImageTransform instead. Both functions use the multiple-return syntax and do not check the correctness of the input. Can be directly used with Igor R,G,B colors which have a 16 bit range. If you have 8 bit colors, simply multiply with 257 first.

// assumes R,G,B values in the range [0..65535]
Function [variable H, variable S, variable V] RGB2HSV(int R, int G, int B)
	variable Mx = max(R,G,B), Mn = min(R,G,B)
	H = acos((R-G/2-B/2)/sqrt(R^2+G^2+B^2-R*G-R*B-G*B))*180/pi
	H = G>=B ? 360-H : H; H = numtype(H)!=0 ? 0 : H
	S = Mx==0 ? 0 : (1-Mn/Mx)
	V = Mx/65535
	return [H,S,V]	// outputs H = [0..360], S,V = [0..1]
End

// assumes a H value in the range [0..360] and S,V values in the range [0..1]
Function [int R, int G, int B] HSV2RGB(variable H, variable S, variable V)
	variable C = V*65535, M = C*(1-S), X = (C-M)*(1-abs(mod(H/60,2)-1))
	if     (H >=   0 && H < 60)
		R = C; G = M; B = X+M;
	elseif (H >=  60 && H < 120)
		R = X+M; G = M; B = C;
	elseif (H >= 120 && H < 180)
		R = M; G = X+M; B = C;
	elseif (H >= 180 && H < 240)
		R = M; G = C; B = X+M;
	elseif (H >= 240 && H < 300)
		R = X+M; G = C; B = M;
	elseif (H >= 300 && H <= 360)
		R = C; G = X+M; B = M;
	endif
	return [R,G,B]	// outputs R,G,B = [0..65535]
End

 

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More