2011-09-18 13 views
15

PNGファイルからOpenCVアプリケーションに24ビットRGBイメージをロードしています。OpenCVイメージ変換によるRGBからグレースケールへの変換が悪い結果をもたらす

しかし、imreadを使用して直接画像をグレースケールとして読み込むと、結果が非​​常に悪くなります。

Mat src1 = imread(inputImageFilename1.c_str(), 0); 

RGBとしてRGB画像をロードし、グレースケールに変換するには、はるかに良い探し結果を与えます。

Mat src1 = imread(inputImageFilename1.c_str(), 1); 
cvtColor(src1, src1Gray, CV_RGB2GRAY); 

画像タイプにimreadを正しく使用しているのでしょうか。誰も同じような行動を経験していますか?

画像がここに表示されimreadを使用してグレースケールに変換: Good result

+5

OpenCVの "Color"イメージはBGRを意味します。したがって、コードの2番目のバージョンが正しくありません。色変換には 'CV_BGR2GRAY'を使うべきです。 –

+0

コメントありがとうございます。 CV_RGB2GRAYの代わりにCV_BGR2GRAYを使って画像をグレースケールに変換しようとしましたが、同じ結果が得られました。 – tisch

+0

オリジナルの画像も添付できますか? –

答えて

16

私は今日同じ問題を抱えていました。方法2は、異なる結果を生成しながら、

//method 1 
cv::Mat gs = cv::imread(filename, CV_LOAD_IMAGE_GRAYSCALE); 

//method 2 
cv::Mat color = cv::imread(filename, 1); //loads color if it is available 
cv::Mat gs_rgb(color.size(), CV_8UC1); 
cv::cvtColor(color, gs_rgb, CV_RGB2GRAY); 

//method 3 
cv::Mat gs_bgr(color.size(), CV_8UC1); 
cv::cvtColor(color, gs_bgr, CV_BGR2GRAY); 

方法1(ローディング階調)及び3(CV_BGR2GRAY)同じ結果を生む:最終的に、私は3つのメソッドを比較しました。私の目的のために、私はCV_BGR2GRAYを使い始めました。

私の入力ファイルはjpgですので、特定の画像フォーマットに関連する問題があります。

+0

Opencv imreadはBGR形式の画像を返すので、3番目の方法で述べたように、GRAY Scaleへの正しい変換はCV_BGR2GRAYだと思います。 – evk1206

1

私はOpenGLのシェーダでの作業、一度同様の問題があった: Bad result

は画像がここに表示されcvtColorを使用してグレースケールに変換しました。 OpenCVが画像を読み取る最初のコンテナは、すべての色の範囲をサポートしていないため、画像のグレースケール変換が悪いことがわかります。ただし、cvtColorを使用して元のイメージをグレースケールに変換すると、コンテナは最初のイメージとは異なり、すべての範囲をサポートします。私の意見では、最初のものは、グレースケールに8ビット以下を使用するか、グレースケールに変更することは悪い方法を使用します。しかし、第2のものは、グレーチャンネルのビット数が多いために滑らかな画像を与える。

+0

この推論をサポートする文書が見つかりましたか?同様の問題に直面し、私はこれが当てはまるかもしれないと思う傾向があるが、私の推論では決して決定的なものを見つけることができない – Ani

+0

フレームバッファには各色の255の範囲が含まれているので、スペクトラム。より良い範囲をサポートするには浮動小数点が必要です。 –

10

簡単な答えは、openCV関数がBGR形式を使用するということです。 imreadまたはVideoCaptureで画像を読むと、常にBGRになります。 RGB2GRAYを使用する場合は、青のチャンネルを緑に置き換えます。明るさを得るための式は

y = 0.587*green + 0.299*red + 0.114*blue 

ので、あなたは緑と青変更した場合で、これは膨大な計算エラーが発生します。

greets

+1

それでは赤のチャンネルも交換していませんか?この場合、与えられた 'BGR'を' RGB'と解釈すると(実際の) 'B'は誤って' R'と解釈され、 'R'は' B'となります。 あなたの答えによれば、修正は 'CV_BIG2GRAY'を' CV_BGR2GRAY'で 'cvtColor'呼び出しの代わりに' CV_BGR2GRAY'ですか? –

関連する問題