Convert HSV to grayscale in OpenCV

35,952

Solution 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();

Solution 2

hsv1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)

h, s, v1 = cv2.split(hsv1)

cv2.imshow("gray-image",v1)

Solution 3

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.

Share:
35,952
Amateur
Author by

Amateur

Updated on July 18, 2020

Comments

  • Amateur
    Amateur almost 4 years

    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?