【python-openCV】カラー画像における指定位置の色を判定する方法!

この記事ではpython&openCVを使って、カラー画像内における指定してピクセル位置での色を12色相環の中から判定するサンプルプログラムをご紹介します。

 

ざっくりとイメージ図を紹介すると以下のような感じですね。

カラー画像から指定位置の色を判定するという処理イメージ図

 

何に使えるかはわかりませんが、画像処理やpythonの勉強にはなると思います。

とりあえずやっていきましょう。笑

 

スポンサーリンク

必要なライブラリを準備

今回もいつもおなじみの以下2つのライブラリを使用します。

〇openCV

〇numpy

 

どちらもよく使うライブラリですので、この機会にインストールしておきましょう。

 

スポンサーリンク

色を判定する方法

サンプルコードの紹介に入る前にどうやって色を判定するのかを簡単にご紹介しておきます。

 

今回は以下の流れで判定していきます。

①読み込んだ画像をまずHSVの色空間に変換

②指定ピクセル位置でのH(色相)を算出

③②のH(色相)と一番近いH(色相)を持つ色を12色相環の中から判定

④判定された色を結果として出力する

 

HSVやら12色相環やら、よくわからないワードを並んでいますね。

 

12色相環についてはおそらく中学校の美術の授業でならっているはずなので、検索すれば思い出せると思います

 

HSVについては以下の記事で詳細解説していますので、ぜひこちらもあわせてご覧ください。

 

また、指定したいピクセル位置がどこなのかを簡単に確認する方法は以下の記事でご紹介しています。

興味があればこちらもあわせてご覧ください。

 

スポンサーリンク

指定位置における色判定サンプルプログラム

だいたいの作業内容がわかったところで、さっそく冒頭に紹介した作業を実施してくれるサンプルプログラムをご紹介します。

import cv2
import numpy as np

#情報を入力する
file_name='sample.jpg'
search_posx=100
search_posy=100

#色を算出する関数
def color_judge(value):
    color_wheel=['red','red-orange','yellow-orange',
                 'yellow','yellow-grren','green',
                 'blue-green','green-blue','blue',
                 'blue-violet','violet','red-violet','red']
    index_value=int(round(value/(180/(len(color_wheel)-1)),0))
    return color_wheel[index_value]
    
#選択した場所の色を出力する
img=cv2.imread(file_name,cv2.IMREAD_COLOR)
cv2.circle(img,center=(search_posx,search_posy),radius=10,color=(255,255,255),thickness=3)
cv2.imwrite('img_point_'+str(search_posx)+'_'+str(search_posy)+'.jpg',img)
imghsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
color=color_judge(imghsv[search_posy,search_posx,0])
print(color)

#選択した場所の色を確認するための画像を出力
check=np.zeros((256,256,3),np.uint8)
check[:,:]=imghsv[search_posy,search_posx]
check = cv2.cvtColor(check, cv2.COLOR_HSV2BGR)
cv2.imwrite('img_check_'+str(search_posx)+'_'+str(search_posy)+'.jpg',check)

 

今回はプログラムの実行フォルダ内にあるsample.jpgという画像に対して処理を実行していくようにしています。

また、search_posx,search_posyが画像内の探索したい場所を指定しているところです。

 

プログラムを実行するとベースとなる画像(sample.jpg)に対して、指定位置に白丸を追加し、さらにその位置でのピクセル画像を拡大したものを出力するようにしています。

 

なお、今回のコードは12色相環の中から算出しますが、世のなかには24色相環なるものも存在しますので、より細かく色分けしたい場合は、コード中のcolor_wheelのところにデータを追加していけばOKです。

 

スポンサーリンク

サンプルコードの実行結果

それではサンプルコードを実際に実行してみましょう。

 

まずは以下の条件です。

search_posx=100
search_posy=100

 

これで実行すると以下の画像と一緒に「blue」のメッセージが出力されました。

指定位置における色判定プログラムを実行した結果

指定位置における色判定プログラムを実行した結果

 

 

 

人間が見ても確かに青ですね。

 

次は以下で実行してみましょう。

search_posx=280
search_posy=280

これで実行すると以下の画像と一緒に「red-orange」のメッセージが出力されました。

指定位置における色判定プログラムを実行した結果

指定位置における色判定プログラムを実行した結果

 

 

 

まぁ赤みがかったオレンジって感じはしますね。

 

最後は以下で実行してみましょう。

search_posx=280
search_posy=280

これで実行すると以下の画像と一緒に「red」のメッセージが出力されました。

指定位置における色判定プログラムを実行した結果

指定位置における色判定プログラムを実行した結果

 

 

 

これはどう見ても赤ですね。

 

というわけで狙い通りプログラムは動いているみたいですね。

 

※今回はそもそもの画像が非常に鮮やかな色で構成されているので、人間の感覚と近い結果を出力してくれましたが、くすんだ色なんかの判定は感覚とずれてくる場合が想定されます。その点はあらかじめご了承ください。

スポンサーリンク

おわりに

というわけで今回はpython-openCVを使って、画像の指定位置における色を判定するプログラムをご紹介しました。

(自分でもどこに使えるかわかりませんので、こんなときに役に立った!という情報があればぜひコメント欄から教えてください。)

 

このように、私のブログでは様々なスキルを紹介しています。

過去記事一覧

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました