Implementing an algorithm, math error.

Hi, im making a program that can convert RGB to HSI. Hue, Saturation and Intensity.

HSI is abit more complex than HSV and HSB.

Im using OpenCV for doing it. But i however cant used the premade funcs in opencv.

Im loading my input image into a matrix, and im dragging out the rgb-info i want.

Done in a loop for x,y.

i have succesfully made the conversion of S and I, but im stuggling alot with H.

This is the formulas for the conversion:

http://www.xplanet.dk/hsi.jpg

Code equivalent:

Code:

`float H, S, I;`

I = ((R+G+B)/3);

float min=R;

if (min>G) min=G;

if (min>B) min=B;

S = 1-(3*(min/(R+G+B)));

H, is more complex though. It rely on whether (G>=B) is true or false.

Code:

`if (G>=B)`

{

H = acos((1/2)*(((R-G)+(R-B))/(sqrt(((R-G)*(R-G))+((R-B)*(G-B))))));

cout << "without 360-part H = " << H << endl; //writes the S value

}

else

{

H = 360-(acos((1/2)*(((R-G)+(R-B))/(sqrt(((R-G)*(R-G))+((R-B)*(G-B)))))));

cout << "360-part H = " << H << endl; //writes the S value

}

when i manually plug in some static RGB values to test if the results is correct, then with (0,255,0) Green i get this:

I=85

S=1

H=1.5708

and the correct results would be:

I=85

S=1

H=120

so my question is, have I implemented it wrong in c++ ?

and how is the right way?

also i have found another formula of the H-part, but i think its the same, though im not sure how to implement the squared part. but its on this link: http://www5.informatik.tu-muenchen.d...csc/COL_24.htm

Re: Implementing an algorithm, math error.

Im using codeblocks though, but quite sure it has nothing to do with the program, but error in the c++ language ive made.

Re: Implementing an algorithm, math error.

cos^(-1) from the formula is not acos. you need 1/cos(...).

Re: Implementing an algorithm, math error.

1) You do the following:

This will do integer arithmetic (giving a value of 0). Change to:

2) acos returns the value in radians , not degrees

Code:

`H = acos((1.0/2.0)*(((R-G)+(R-B))/(sqrt(((R-G)*(R-G))+((R-B)*(G-B))))));`

H = H *180 / 3.14159;

cout << "without 360-part H = " << H << endl; //writes the S value

The second part will have a similar problem

Re: Implementing an algorithm, math error.

if i write "1/cos" it just returns "1" on a 0,255,0 green. Where it should return a 120 value.

Code:

`H = 1/cos((1/2)*(((R-G)+(R-B))/(sqrt(((R-G)*(R-G))+((R-B)*(G-B))))));`

Re: Implementing an algorithm, math error.

1) The inverse cosine is the arc-cosine ... you were correct on that.

2) see my previous post

Re: Implementing an algorithm, math error.

Yes, i crossposted, but thanks alot. Changing the ½ to your suggestions and making radians to degrees did the trick.

Code:

`//Calculating "H" Hue`

if (G>=B)

{

H = acos((1.0/2.0)*(((R-G)+(R-B))/(sqrt(((R-G)*(R-G))+((R-B)*(G-B))))));

H = H *180 / 3.14159;

cout << "without 360-part H = " << H << endl; //writes the S value

}

else

{

H = (acos((1.0/2.0)*(((R-G)+(R-B))/(sqrt(((R-G)*(R-G))+((R-B)*(G-B)))))));

H = 360-(H *180 / 3.14159);

cout << "360-part H = " << H << endl; //writes the S value

}