プログラミングとコナン

Pythonで画像のRBG・HSV色空間の値を取得しExcelに出力する方法

今回は、Pythonを用いて、画像内でクリックした箇所の色情報を、自動的にExcelに出力するプログラムを作成しました。

実行環境

※Anacondaは特に必要ないです。

プログラミングスクールに関しては下の記事で詳しく記述しています。

こちらで紹介しているスクールは、すべて無料期間がある優良なスクールのみで、特徴を明確にし、読者のニーズに絞って丁寧に解説しました。初めての一歩として、無料説明会に参加してみてください。

【全スクール無料体験あり!】プログラミングを学びたい人におすすめのスクール5選!

RGBとHSV色空間について

普段の生活の中で、「淡いピンク」とか、「藤の色」など似た色や曖昧な色を表現することがあると思います。それらは、光の三原色をもとにした、「赤」、「緑」、「青」の色を、数字で表した場合にも、私たちが見ている性質と似たような傾向をとることがあります。

一方で、別の色空間で見た時には、先ほどの似たような色も、全く異なる性質として表現できる場合があり、色でクラス分けをするための閾値を設定する際にも便利なことがあります。

今回扱う色空間は2つあります。「RGB色空間」と「HSV色空間」です。

RGB色空間は、普段人間が見ている世界です。R:Red、G:Green、B:Blueの頭文字をとってRGBです。一方で、HSVは、美術の時間で習ったかと思いますが、H:Hue(色相)、S:Saturation(彩度)、V:Value(明度)の頭文字です。

似た色の性質

先ほどの、「似た色でも性質が異なる」とはどういうことでしょうか?具体例を示します。以下の2つの色を見てください。


カラーコード:#99A7A8

(R, G, B)=(153, 167, 168)
(H, S, V)=(184, 8, 65)


カラーコード:#AEA7A8

(R, G, B)=(174, 167, 168)
(H, S, V)=(351, 4, 68)

比較すると、全然色が違うと思うかもしれませんが、単体で見た時には両方とも「ネズミ色」と答える方もいるのではないでしょうか?

1枚目の画像に少しだけ赤の要素を強くしたのが2枚目になります。ここで、RGB色空間では、Rの値が21の差がありますが、HSV色空間で見た時、Hの値は167も異なります。

別の色空間で見た時には、似た色でも異なる性質として分類することが出来るとはこういう理由です。

さて、今回は、各パラメータの値をExcelに出力していくので、それぞれの値の範囲を確認していきます。

パラメータ値の範囲
R, G, B0 ~ 255(2 ^ 8種)
H0 ~ 360
S, V0 ~ 100

カラースポイトによって求められたRGBの値からHSVへの変換が可能です。変換式が多少複雑ではありますが紹介していきます。(プログラムによって直接HSVの値を求めるとこも当然可能ですが、今回は変換式を利用しました。)

色について詳しく知りたい方は以下の本を参考にしてみてください!

色情報の変換式

ここは変換公式の紹介なので、興味がある方は読んでみてください。
画像出典:プチモンテさん

Hue(色相)の求め方

※Max = max(R, G, B)、Min = min(R, G, B)とします。

Rが最大値の時: H = 60 × ((G – B) ÷ (Max – Min)
Gが最大値の時: H = 60 × ((B – R) ÷ (Max – Min)) + 120
Bが最大値の時: H = 60 × ((R – G) ÷ (Max – Min)) + 240


3つとも同じ値の時: H = 0

ただし、求めた値が負の数だった場合、360を足して正の数にします。(H += 360)

Saturation(彩度)の求め方

※Max = max(R, G, B)、Min = min(R, G, B)とします。

S = 100 × (Max – Min) ÷ Max

Value(明度)の求め方

※Max = max(R, G, B)、Min = min(R, G, B)とします。

V = 100 × Max ÷ 255

コード紹介

ここからが本題ですね。

改めて、今回の目的は、「画像内でクリックした箇所の色情報を、自動的にExcelに出力する」でした。画像を扱ったり、Excelを扱うためライブラリを準備していきましょう!

必要なライブラリ

実行した際にエラーが出てくる場合は、ライブラリをインストールしてください。コマンドプロンプト(Anaconda)で以下のコードを入力するとデータがダウンロードされます。

全体のコード

最初に、Pythonの実行環境と同じフォルダに画像とExcelファイルを準備してください。サンプルコードでの名前はそれぞれ、”picture_filename”, “Excel_filename”としました。

Excelに出力するのがたったの5行でかけてしまうのがすごいですね。実行する際に各自でファイル名やクリック数を調整しやすいように最初のほうに記述しました。

関数は全部で3つあります。関数「Calc_HSV」は、受け取ったRBGの値からHSVの値を返り値とする関数です。グレースケール画像(白や黒、灰色など)に関しては、返り値は事前に設定しました。

また、この場合RGBの値はすべて同じになるので、(Max – Min)が0になるのですが、Hを計算する際に0で割る可能性があるので、例外処理を設けました。

ただ、その前に真っ黒と真っ白の時の処理を入れたので意味はないように思います。。。

今回使った画像はこちらです。自由にダウンロードしてください。

今回のコードの場合、メモリのことをあまり考えていないので、もっと大量のデータをExcelに出力したい場合は、クリックしたときに、逐一データを出力する手法がいいと思います。

出力結果

ランダムな10箇所から値を出力した結果です。データがちゃんと入っていない場合は、Excelのファイル名が間違っているか、実行環境と同じフォルダにファイルが存在していないなどが考えられます。

まとめ

今回は、画像のRGBの値を取得し、得られた値からHSV色空間の値の変換を行いました。また、それらのデータをExcelに出力する方法も記述しました。次回はExcelファイルを用いて、3D散布図を作成することにより、画像の特徴を抽出していきます。

具体的には、今回の色空間のRGB、HSVのデータセットを作成し、色空間で特徴が現れるかを分析しています。

PythonでExcelのデータから3D散布図を作成

今回の記事で、Excelへの出力がこんなにも簡単にできるんだと思われた方も多いと思います。これが可能なのもモジュールがあるからですね!感謝です笑。

最後に、下の本は昔読んでわかりやすかった代物です。よろしければどうぞ!

プログラミングスクールに関しては下の記事で詳しく記述しています。

こちらで紹介しているスクールは、すべて無料期間がある優良なスクールのみで、特徴を明確にし、読者のニーズに絞って丁寧に解説しました。初めての一歩として、無料説明会に参加してみてください。

【全スクール無料体験あり!】プログラミングを学びたい人におすすめのスクール5選!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA