问题
I'm newbie in OpenCV. I'm learning Segmentation by Watershed algorithm and i have a problem.
I have to convert image color to image grayscale for using Watershed. When I use color space BGR, no problem but with space HSV, i'm not sure that the code belows 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 convert from BGR to HSV, Hue = Blue, Saturation = Green, Value = Red and I can use the operator BGR2GRAY for convert from HSV to grayscale.
2 images output are different, can I convert HSV to grayscale like that?
//Is it similaire with color space LAB?
回答1:
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();
回答2:
hsv1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)
h, s, v1 = cv2.split(hsv1)
cv2.imshow("gray-image",v1)
回答3:
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.
回答4:
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:
HSV2RGB converion
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.
来源:https://stackoverflow.com/questions/23811638/convert-hsv-to-grayscale-in-opencv