【问题标题】:OpenCV image conversion from RGB to HSV从 RGB 到 HSV 的 OpenCV 图像转换
【发布时间】:2010-06-10 18:58:40
【问题描述】:

当我在示例图像 (RGB) 上运行以下代码,然后对其进行处理以显示转换后的 HSV 图像时,两者似乎不同......

谁能解释为什么会这样?

你能建议一个解决方案来避免这种情况发生吗...因为它毕竟是同一张图片

Mat img_hsv,img_rgb,red_blob,blue_blob;
img_rgb = imread("pic.png",1);
cvtColor(img_rgb,img_hsv,CV_RGB2HSV);
namedWindow("win1", CV_WINDOW_AUTOSIZE);
imshow("win1", img_hsv);

【问题讨论】:

  • 您需要将HSV 图像转换回BGR 以便与imshow() 一起显示。

标签: c++ image visual-c++ opencv image-processing


【解决方案1】:
  1. 我还不太了解新的 (2.x) OpenCV,但通常在 OpenCV 中加载的图像是 CV_BGR 通道顺序而不是 RGB,因此您很可能需要 CV_BGR2HSV

    李>
  2. OpenCV 实际上并不“了解” HSV,它只会在第一个通道中编码色调,在第二个通道中编码饱和度,在第三个通道中编码值。如果您在 OpenCV 中显示图像,highgui 会假定它是 BGR 图像,从而将第一个通道(现在的 Hue)解释为蓝色等。

【讨论】:

  • 即使我尝试过那个家伙... din 也可以工作...只是输出图像中的一些细微变化...它不使用以下公式来转换给出的图像opencv.willowgarage.com/documentation/cpp/…
  • @kaushalyjain:是的,但正如我所说:色调在第一个通道结束,S 在第二个通道,V 在第三个通道。 imshow 不解释色彩空间,它假定 BGR(至少 2.x 之前的 cvShowImage 是这种情况)。你看到的是 HSV 编码为 BGR ;)
  • 哦!明白了……非常感谢!!我有另一个基于此的问题...我将把它作为一个新问题发布..请努力回答这个问题...! :)
【解决方案2】:

正如这里已经解释的那样,在图像转换为 HSV 后立即显示图像是没有意义的,但是这里有一个如何使用 V 通道的示例:

如果您只想提取 V 通道,您可以使用 cvtColor 并使用 HSV 图像的第 3 (V) 通道来设置此图像的灰度副本强度:

Mat grayImg, hsvImg;
cvtColor(img, grayImg, CV_BGR2GRAY);
cvtColor(img, hsvImg, CV_BGR2HSV);
uchar* grayDataPtr = grayImg.data;
uchar* hsvDataPtr = hsvImg.data;
for (int i = 0; i < img.rows; i++)
{
    for (int j = 0; j < img.cols; j++)
    {
        const int hi = i*img.cols*3 + j*3,
                  gi = i*img.cols + j;
        grayDataPtr[gi] = hsvDataPtr[hi + 2];
    }
}
imshow("V-channel", grayImg);

【讨论】:

    【解决方案3】:
    cv::Mat hsv;
    std::vector<cv::Mat> channels;
    cv::split(hsv, channels);
    

    也可以

    [0] = H
    [1] = S
    [2] = V
    

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 2010-12-14
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      相关资源
      最近更新 更多