web-dev-qa-db-ja.com

RGBからHSVへのOpenCV画像変換

サンプル画像(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);
9
Kaushal
  1. 新しい(2.x)OpenCVはまだ十分にわかりませんが、通常、OpenCVに読み込まれる画像はRGBではなくCV_BGRチャネルの順序であるため、CV_BGR2HSVが必要になる可能性があります。

  2. OpenCVは実際にはHSVを「認識」していません。最初のチャネルで色相、2番目のチャネルで彩度、3番目のチャネルで値をエンコードするだけです。 OpenCVで画像を表示する場合、highguiはそれがBGR画像であると見なし、最初のチャネル(現在はHue)を青などとして解釈します。

27
zerm

ここですでに説明したように、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
LihO
cv::Mat hsv;
std::vector<cv::Mat> channels;
cv::split(hsv, channels);

可能

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