Search code examples
opencvgrayscalehsv

Convert HSV to grayscale in OpenCV


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?


Solution

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