-
November 5th, 2009, 08:23 AM
#1
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:
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
-
November 5th, 2009, 08:28 AM
#2
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.
-
November 5th, 2009, 08:29 AM
#3
Re: Implementing an algorithm, math error.
cos^(-1) from the formula is not acos. you need 1/cos(...).
-
November 5th, 2009, 08:38 AM
#4
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
-
November 5th, 2009, 08:40 AM
#5
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))))));
-
November 5th, 2009, 08:45 AM
#6
Re: Implementing an algorithm, math error.
1) The inverse cosine is the arc-cosine ... you were correct on that.
2) see my previous post
-
November 5th, 2009, 08:51 AM
#7
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
}
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|