Reputation: 160
I'm a newbie in OpenCV. I'm learning the Segmentation by Watershed algorithm and I have a problem.
I have to convert the image color to grayscale for using Watershed. When I use the BGR color space, no problem but with HSV, I'm not sure that the code below is correct.
Mat im = imread("./Image/118035.jpg", CV_LOAD_IMAGE_COLOR);
Mat imHSV;
cvtColor(im, imHSV, CV_BGR2HSV);
imshow("HSV", imHSV);
cvtColor(imHSV, imHSV, CV_BGR2GRAY);
imshow("HSV to gray", imHSV);
imshow("BGR", im);
cvtColor(im, im, CV_BGR2GRAY);
imshow("BGR to gray", im);
I think, after converting from BGR to HSV, Hue = Blue, Saturation = Green, Value = Red and I can use the operator BGR2GRAY for convert from HSV to grayscale.
The 2 output images are different. Can I convert HSV to grayscale like that?
//Is it similaire with color space LAB?
Upvotes: 9
Views: 47559
Reputation: 1074
The conversion from HSV to gray is not necessary: you already have it. You can just select the V channel as your grayscale image by splitting the HSV image in 3 and taking the 3rd channel:
Mat im = imread("C:/local/opencv248/sources/samples/c/lena.jpg", CV_LOAD_IMAGE_COLOR);
Mat imHSV;
cvtColor(im, imHSV, CV_BGR2HSV);
imshow("HSV", imHSV);
//cvtColor(imHSV, imHSV, CV_BGR2GRAY);
Mat hsv_channels[3];
cv::split( imHSV, hsv_channels );
imshow("HSV to gray", hsv_channels[2]);
imshow("BGR", im);
cvtColor(im, im, CV_BGR2GRAY);
imshow("BGR to gray", im);
waitKey();
Upvotes: 27
Reputation: 103
in HSV color-space, V channel is defined as max(R, G, B) but in gray-scale, value is defined by mean(R, G, B). in RGB2HSV conversion, we use these formulas for S and V channel:
V = max(R, G, B)
S = (max(R, G, B) - min(R, G, B)) / max(R, G, B)
so if S is zero, max(R, G, B) equals to min(R, G, B) and they are equal to mean(R, G, B). so if this criteria holds, V channel is equal to gray-scale value. other wise, they are different.
one way is to convert image to RGB and then convert it to GRAY. but if you look for a more straight way, you can use picture below:
and hence gray value is mean(R, G, B) you can calculate it as:
gray = m + (c + x) / 3
where you can compute m,c and x from formula in image.
Upvotes: 1
Reputation: 79
hsv1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)
h, s, v1 = cv2.split(hsv1)
cv2.imshow("gray-image",v1)
Upvotes: 3
Reputation: 434
Unfortunately I am unable to comment because of insufficient earned reputation.
Taking the 3rd channel alone will may give grey values you do not expect, as increasingly fully saturated colors,as an extreme example RGB 0,0,255 will appear as pure white once converted to grey scale by taking the value hsv channel.
This could certainly affect watershed (dependent on image content) as saturated red, greens and blues would not be differentiated in the V channel.
The obvious, converting to BGR then Grayscale could be a better option.
Upvotes: 0