【python-opneCV】カラー画像から指定した色だけを取り出す方法!

この記事では以下の画像のようにある画像内の指定した色だけを取り出す方法をご紹介していきます。

カラー画像から赤色の部分だけを取り出した例

 

今回は中学校の美術の授業で習った12色相環に含まれる色で抽出できるようになっています。

以下が先ほどのサンプル画像を12色相環の各色に分割した出力結果です。

カラー画像を12色に分解した結果

 

あなたのやりたいこと一致していれば、ぜひ続きをご覧ください。

 

それでは早速やっていきましょう。

 

スポンサーリンク

必要なライブラリ一覧

今回の記事では以下の2つのライブラリを使用します。

〇openCV

〇numpy

インストールしていない方は、まずはインストールからはじめましょう。

 

スポンサーリンク

カラー画像から指定色を取り出すサンプルコード

早速ですが、以下が冒頭に紹介した処理を実施してくれるサンプルコードです。

import cv2
import numpy as np

#情報を入力する
file_name='sample.jpg'
color='yellow'

#色を算出する関数
def index_judge(color):
    color_wheel=['red','red-orange','yellow-orange',
                 'yellow','yellow-grren','green',
                 'blue-green','green-blue','blue',
                 'blue-violet','violet','red-violet']
    index_value=color_wheel.index(color)
    hmax=7.5*(2*index_value+1)
    hmin=7.5*(2*index_value-1)
    return hmax,hmin,index_value
    
#画像の読み込み⇒加工
img=cv2.imread(file_name,cv2.IMREAD_COLOR)
hmax,hmin,index_value=index_judge(color)
imghsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
upper=np.where((imghsv[:,:,0]>hmax),0,1)
if color=='red':
    lower=np.where((imghsv[:,:,0]<hmin)&(imghsv[:,:,0]>hmax),0,1)
else:
    lower=np.where((imghsv[:,:,0]<hmin),0,1)
imghsv[:,:,2]=imghsv[:,:,2]*upper*lower
final_img = cv2.cvtColor(imghsv, cv2.COLOR_HSV2BGR)
#画像の読み込み⇒加工
cv2.imwrite(str(index_value).zfill(2)+color+'.jpg',final_img)

 

やっていることを簡単に解説しておきます。

①画像を読み込みます。

②取り出したい色のH(色相)を算出します。

※画像の出力形式のひとつにHSV形式というものがあります。このHSV形式では、H(色相)という数値が割り当てられており、赤が0、青が120といった形で色を数値化することが可能です。

③読み込んだ画像をHSV形式に変換します。

④③のH値と②で算出したH値を比較し、数値が近い場所はそのまま、外れていれば黒く塗りつぶします。

 

やっかいなことにこのHSV形式では、赤色の領域が2つ存在しています。(0~7.5と172.5~180)

このあたりをうまく処理するために途中にIF文を挟んでいます。

 

ざっくりと処理内容はこんな感じですね。

 

取り出したい色を指定している’color’の変数には、以降の’color_wheel’リストの中の色を入力していなければエラーになりますのでご注意ください。

 

またベースとなる画像(sample.jpg)はプログラムの実行フォルダ内にあることを想定して書いています。

 

スポンサーリンク

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

それでは先ほどのサンプルコードをいくつかの色を指定しながら実行してみましょう。

 

(比較対象としてベースとなる画像を載せておきます。)

指定色を取り出したいサンプル画像

まずはcolor=’red-orange’で実行してみましょう。

サンプル画像から赤みの橙を取り出した結果

問題なく赤~オレンジっぽい色が取り出されていますね。

 

次は’green’で実行してみましょう。サンプル画像から緑色だけを取り出した結果

若干黄緑っぽいですがまぁ良いでしょう。

 

というわけで問題なく実行できていることが確認できましたね。

 

スポンサーリンク

おわりに

というわけで今回はpython-openCVを使って、任意のカラー画像から指定した色だけを取り出す方法をご紹介しました。

実験データの整理の際などにぜひご活用ください。

 

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

過去記事一覧

 

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

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

 

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

それではまた!

コメント

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