Преобразование изображений OpenCV из RGB в HSV

Когда я запускаю этот следующий код на образце (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);

Ответ 1

  • Я не знаю нового (2.x) OpenCV достаточно хорошо, но обычно изображения, загруженные в OpenCV, находятся в порядке канала CV_BGR, а не RGB, поэтому вы, скорее всего, хотите CV_BGR2HSV

  • OpenCV фактически не "знает" HSV, он просто кодирует Hue в первом канале, Saturation во втором и Value в третьем. Если вы показываете изображение в OpenCV, highgui принимает это изображение BGR, таким образом интерпретируя первый канал (теперь Hue) как синий и т.д.

Ответ 2

Как уже объяснялось здесь, нет смысла отображать изображение сразу после его преобразования в HSV, однако вот пример того, как можно использовать V-канал:

Если вы хотите извлечь только V-канал, вы можете использовать cvtColor и использовать третий (V) канал из изображения HSV, чтобы установить интенсивность полутоновой копии этого изображения:

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