私は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で両方の画像を使用する場合、キーポイントが異なるため、特に品質の悪い画像を処理するときに異なる結果が生じる可能性があります。
注:これは重複ではありません、OPは_cv2.imread
_からの画像がBGR形式であることを認識しているため(提案された重複質問とは異なります) RGBであると想定したため、提供された回答はその問題にのみ対処しています)
説明のために、この同じカラーのJPEG画像を開きました。
一度変換を使用して
_img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_
もう1つは、グレースケールモードで読み込むことです。
_img_gray_mode = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
_
あなたが文書化したように、2つの画像間の差分は完全に0ではありません、左と下に向かって差分ピクセルを見ることができます
私も差分をまとめて見ました
_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)