How to display HSV image after using RGBtoHSV converter function in c++?

17,485

Solution 1

It doesn´t make sense to display an image that has been converted to HSV using imshow().

imshow() thinks, the Matrix is in BGR order. Converting the image to HSV just converts the RGB values to HSV channel values.

It was before 3 channel and after the conversion it is also 3 channel but other values. imshow() still wants to display the image as RGB image but then with HSV values which leads to an invalid image.

Just convert it back to RGB to make imshow() show the image correctly.

Edit

Mat hsv, bgr; // hsv is the hsv image you want to display
cvtColor(hsv, bgr, CV_HSV2BGR);
imshow("lolz", bgr);

Solution 2

You have a misunderstanding about color space conversion. You are probably expecting that the image will look visually different when doing color space conversion, but no.

The image will still contain the same information, just in a different format. Like when you are storing the image file in the form of .jpg, .png, etc. They are still semantically the same image. You don't need to convert from jpg to png and view it again because you know it will look the same. The binary content will be different but the semantic content is exactly the same.

HSV, BGR, RGB, LAB, are simply different representations of the same image. The image will look the same no matter what color space you are using. OpenCV expects that imshow() will be fed with BGR color space so you need to convert whatever image into BGR before displaying.

You already had the BGR image, so you don't need to convert it to HSV to display it.

The only time that the image will be truly changed is when you convert it to grayscale. That's when you lose some information and the image will look different.

If you are displaying HSV image using imshow(), it will show you an invalid image that you might interpret as something useful or cool. But it's not. It's like a beautiful bug that you think it's a feature.

So, just show the BGR image, it has the same semantic content as HSV.

Share:
17,485
Tomek eM
Author by

Tomek eM

Updated on June 16, 2022

Comments

  • Tomek eM
    Tomek eM almost 2 years

    Good evening, on the internet we can find a lot of algorithm to convert RGB pixel values to HSV, but I can't find function to display it. I'm using MS Visual Studio 2013 and openCV library. I know there is built function to get HSV image: cvtColor(obrazeczek1, obrazeczek1, CV_BGR2HSV); but I try to do this without this function. For example, to get gray images I using function:

    #define NORMALIZE_RGB(x) \
        (x > 255 ? 255 : (x < 0 ? 0 : x))
    
    cv::Mat rgb2grey(cv::Mat& I)
    {
    CV_Assert(I.depth() != sizeof(uchar));
    cv::Mat  res(I.rows, I.cols, CV_8UC3);
    switch (I.channels())  {
    case 3:
        cv::Mat_<cv::Vec3b> _I = I;
        cv::Mat_<cv::Vec3b> _R = res;
    
        for (int i = 0; i < I.rows; ++i)
            for (int j = 0; j < I.cols; ++j){
    
            int grey = ((_I(i, j)[0]) + (_I(i, j)[1]) + (_I(i, j)[2])) / 3;
    
                _I(i, j)[0] = NORMALIZE_RGB(grey);
                _I(i, j)[1] = NORMALIZE_RGB(grey);
                _I(i, j)[2] = NORMALIZE_RGB(grey);
            }
    
        res = _I;
        break;
    }
    return res;
    }
    

    and to call function and display image:

    cv::Mat image = cv::imread("name.jpg");
    cv::Mat img = rgb2grey(image);
    cv::imshow("Grey image", img);
    

    I found here Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both tips. I know how to convert RGB pixel to HSV, but how to display this matrix using imshow? I also found function rgb2hsv but I dont have any idea what to change, to display it. This is a function:

    void rgb2hsv(double r, double g, double b, double &h, double &s, double &v)
    {
    v = max(max(r, g), b);
    double t = min(min(r, g), b);
    double delta = v - t;
    if (v != 0.0)
        s = delta / v;
    else
        s = 0.0;
    if (s == 0.0)
        h = 0.0;
    else
    {
        if (r == v)
            h = (g - b) / delta;
        else
            if (g == v)
                h = 2.0 + (b - r) / delta;
            else
                if (b == v)
                    h = 4.0 + (r - g) / delta;
        h = h * 60.0;
        if (h < 0.0)
            h += 360;
    }
    }
    

    There is not here similar question so plese help.

    • Thomas Matthews
      Thomas Matthews over 9 years
      What is your media or graphics controller? Many graphics controllers don't have API that support HSV directly. Are you sending to a color printer?
    • Tomek eM
      Tomek eM over 9 years
      I have only built graphics card (Intel HD3000) on motherboard, but I see difference beetwen color RGB and HSV if I using this built function CV_BGR2HSV.
    • Thomas Matthews
      Thomas Matthews over 9 years
      You may have to convert your HSV changes back to RGB before displaying.
    • Mark Ransom
      Mark Ransom over 9 years
      Computer displays, and the video circuitry and drivers that drive them, work in RGB exclusively. There are some video formats that are expressed in YUV, but even those must be translated to RGB somewhere in the pipeline.
    • Tomek eM
      Tomek eM over 9 years
      My question: I have rgb images and access to r,g,b channels, Im using formula to change r,g,b channels to h,s,v and I will have matrix with values likes "190, 0.92, 0.87" and if I using function imshow with this matrix it display image in HSV model?
    • Tomek eM
      Tomek eM over 9 years
      I did not have a problem to convert RGB image to Grey or BW but this HSV model scary me ..
    • be_good_do_good
      be_good_do_good over 7 years
      I exactly did what @ThomasMatthews said. I use opencv in python. Here is what I did cv2.imshow('contrast', cv2.cvtColor(imghsv, cv2.COLOR_HSV2BGR))
    • Thomas Matthews
      Thomas Matthews over 7 years
      I did not say to use OpenCV in Python. I don't know OpenCV and only have a basic understanding of Python.
    • n. m.
      n. m. about 7 years
      Why do you convert it to HSV in the first place?