web-dev-qa-db-ja.com

Opencv-グレースケールモードとグレー色変換

私はopencv(2.4.11)python(2.7)で作業しており、灰色の画像で遊んでいました。画像をグレースケールモードでロードし、画像をBGRからGRAYに変換すると、異常な動作が見つかりました。以下は私の実験的なコードです:

import cv2

path = 'some/path/to/color/image.jpg'

# Load color image (BGR) and convert to gray
img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Load in grayscale mode
img_gray_mode = cv2.imread(path, 0)

# diff = img_gray_mode - img_gray
diff = cv2.bitwise_xor(img_gray,img_gray_mode)

cv2.imshow('diff', diff)
cv2.waitKey()

差分画像を見ると、真っ黒な画像ではなく、取り残されたピクセルが見えます。何か理由はありますか?灰色の画像を扱う正しい方法は何ですか。

P.S。SIFTで両方の画像を使用する場合、キーポイントが異なるため、特に品質の悪い画像を処理するときに異なる結果が生じる可能性があります。

35
Gagandeep Singh

注:これは重複ではありません、OPは_cv2.imread_からの画像がBGR形式であることを認識しているため(提案された重複質問とは異なります) RGBであると想定したため、提供された回答はその問題にのみ対処しています)

説明のために、この同じカラーのJPEG画像を開きました。

enter image description here

一度変換を使用して

_img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_

もう1つは、グレースケールモードで読み込むことです。

_img_gray_mode = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
_

あなたが文書化したように、2つの画像間の差分は完全に0ではありません、左と下に向かって差分ピクセルを見ることができます

enter image description here

私も差分をまとめて見ました

_import numpy as np
np.sum(diff)
# I got 6143, on a 494 x 750 image
_

すべてのcv2.imread()モードを試しました

cv2.imread()のすべての_IMREAD__モードの中で、_IMREAD_COLOR_と_IMREAD_ANYCOLOR_だけが_COLOR_BGR2GRAY_を使用して変換でき、どちらにも同じ差分が与えられました_IMREAD_GRAYSCALE_で開かれた画像

違いはそれほど大きくないようです。私の推測は、2つの方法(グレースケールの読み込みとグレースケールへの変換の読み込み)での数値計算の違いから来ています

当然、避けたいのは、特定のバージョンのイメージでコードを微調整して、別のソースからのイメージに最適ではないことを確認することです。

簡単に言えば、処理パイプラインでバージョンとタイプを混在させないでください。

だから私は画像のソースを均質に保ちます、例えばBGRでビデオカメラから画像をキャプチャしている場合、BGRをソースとして使用し、BGRをグレースケールに変換しますcv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

逆に、私の最終的なソースがグレースケールの場合は、ファイルとビデオキャプチャをグレースケールで開きますcv2.imread(path, cv2.IMREAD_GRAYSCALE)

37
bakkal