OpenCV конвертация изображений из RGB в HSV - PullRequest
9 голосов
/ 10 июня 2010

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

Ответы [ 3 ]

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

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

3 голосов
/ 09 декабря 2013

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

Если вы хотите извлечь толькоV-канал, вы можете использовать cvtColor и использовать 3-й (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);
0 голосов
/ 01 июня 2018
cv::Mat hsv;
std::vector<cv::Mat> channels;
cv::split(hsv, channels);

также возможно

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