openCVで画像の色空間を確認するにはどうすればよいですか?
CvCvtColor()関数を使用して別の色に変換する前に、RGBであることを確認したい
ありがとう
残念ながら、OpenCVはIplImage構造内の色空間については何の指示も提供しないため、どこかから盲目的にIplImageを取得した場合、それがどのようにエンコードされたかを知る方法はありません。さらに、画像をHSV対RGBとして解釈する必要があるかどうかをアルゴリズムが明確に示すことはできません。これは、マシンにとっては単なるバイトの集まりです( this はHSVまたはRGBである必要がありますか?)。この情報を追跡できるように、IplImageを別の構造体(またはテンプレートを使用したC++クラス!)でラップすることをお勧めします。あなたが本当に必死で、特定のタイプの画像(屋外のシーン、オフィス、顔など)だけを扱っている場合は、画像の統計を計算してみてください(たとえば、自然なRGB画像のヒストグラム統計と自然なHSV画像)、次に、画像に近い色空間を比較して、完全に未知の画像を分類してみます。
txandiは興味深い点を指摘しています。 OpenCVには、デフォルトで使用されるBGR色空間があります。これはRGBカラースペースに似ていますが、BチャネルとRチャネルが画像内で物理的に切り替えられる点が異なります。物理チャネルの順序が重要な場合は、この関数で画像を変換する必要があります:cvCvtColor(defaultBGR、imageRGB、CV_BGR2RGB)。
rcv で述べたように、画像コンテンツのアプリオリ知識がない限り、3つのカラーチャネルを検査して色空間をプログラムで検出する方法はありません。 (例えば、色がわかっている画像にマーカーがあります)。不明なソースからの画像を受け入れる場合は、ユーザーが画像の色空間を指定できるようにする必要があります。デフォルトとしては、RGBを想定することをお勧めします。
表示する前にピクセルカラーのいずれかを変更し、OpenCV以外のビューアを使用している場合は、すべてのカラーフィルタの実行が完了した後で、おそらくcvCvtColor(src,dst,CV_BGR2RGB)
を使用する必要があります。ビューアにOpenCVを使用している場合、または画像をファイルに保存する場合は、BGRカラースペースにあることを確認する必要があります。
IplImage struct には、4文字で構成されるcolorModel
という名前のフィールドがあります。残念ながら、OpenCVはこのフィールドを無視します。ただし、このフィールドを使用して、さまざまなカラーモデルを追跡できます。
基本的に、チャンネルを分割して表示し、使用している画像の色空間を把握します。それは最善の方法ではないかもしれませんが、私にとってはうまくいきます。
詳細な説明については、以下のリンクを参照してください。
https://dryrungarage.wordpress.com/2018/03/11/image-processing-basics/