こんにちは、お久しぶりです。
大学で服に関する研究をしている者です。
研究で画像の色相分布を分析するということでopenCVのcalHist関数を使うといいよ!というお話をいただき、
早速使ってみたのですが、困ったことがあったので、備忘録的に記録を残します。
teratailの自己解決の回答に高評価を貰ったからまとめたなんて言えない
まずはCSVデータの読み込み。
読み込みに関しては、
変数A = cv2.imread("hogehoge.png")
hogehogeには、ファイル名を入力します。相対パスも絶対パスも入力できます。
絶対パスってなんぞや?
本来ならこのプログラムを編集している同じディレクトリ(ファイルと同じようなもの)と同じところに画像などがないとダメなのですが、
直接パスの場合は違うディレクトリにあっても大丈夫なのです。
その方法として、まずはファイルのプロパティを開いてそのファイルのディレクトリをコピーしてください。
その後、ファイル名の部分に、/Users/hoge/piyo/poyopoyo.pngなどのように記入すればOKです。
表色系の変換など
今回自分の研究では表色系をBGR⇒HSVに変換しないといけないため、以下のコードを入力します。
変数B = cv2.cvtColor(変数A, cv2.COLOR_BGR2HSV)
2をtoと掛けてるようです。英語ではよくあることらしい・・・?
画像の色相分布行列化
いよいよ本番です。
変数C = cv2.calcHist([変数B], [0], None, [180], [0, 180])
と入力すると、画像を色相分布の行列として変換します。
cv2.calcHist()の中の変数に関してはこちらのページが非常にわかりやすいため引用させていただきます。
OpenCVを使ったヒストグラムの計算
それでは cv2.calcHist() 関数を使ってヒストグラムを計算してみましょう.関数とそのパラメータについて慣れましょう :
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
images : 入力画像です.画素値のデータ型はuint8かfloat32のどちらかです.記号[]を使って “[img]” のように指定します.
channels : ヒストグラムを計算する画像のチャンネルのインデックスです.入力画像がグレースける画像であれば[0]を指定します.カラー画像であればヒストグラムを計算するB,G,Rの色相に対応する[0],[1],[2]のどれかの値を指定します.
mask : マスク画像です.画像中の全画素のヒストグラムを計算する場合 “None” を指定します.画像中の特定領域のヒストグラムを計算する場合は特定領域を表すマスク画像を指定します(以下に例を示します).
histSize : ビンの数です.この引数も記号[]を使って指定します.全画素値を対象とするのであれば [256] を指定します.
ranges : ヒストグラムを計測したい画素値の範囲を表す RANGE です.通常は [0,256] を指定します.
サンプル画像のヒストグラムを計算してみましょう.サンプル画像をグレースケール画像として読み込み,全範囲のヒストグラムを計算します.
img = cv2.imread('home.jpg',0)
hist = cv2.calcHist([img],[0],None,[256],[0,256])
histは256x1の配列で,各要素は対応する画素値を持つ画素の数を表します.
今回は色相Hに関して着目するため、HSVで1個目にあるので、2番目の引数は[0]のままにします。
結果に関して
今回、仮に、すべて透過した画像を入力したとします。
すると以下のように行列が表示されます
[[ 500.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]]
全部透過してるのに・・・オカシイデスネ。
つまり、
言いたいこと
透過されている分は色相0という行に格納されます。
ということなので何か画像解析をしたときに、
「赤色おおすぎ!」ってなった場合、このページを思い出していただけると有難いです。