【python-openCV】指定色の物体のみを抽出する方法!みかんを例に実演!

f:id:yshgs_elec:20210227215459p:plain

「ある画像の中から、特定の物体だけを取り出したい。」

「その物体は色に特徴があるので、指定色の部分だけを取り出すようにしたい。」

 

この記事ではこんな悩みを解決するために、ある画像から指定した色の物体を取り出す方法をご紹介します。

 

みかんの画像を使って実演していきますので、ぜひあなたも何かの画像を使って一緒にやってみましょう。 

 

それでは早速やっていきます!

 

スポンサーリンク

紹介するスキルの概要説明

まずははじめに、あなたのやりたいことと、この記事の内容が一致しているか確認しておきましょう。

 

今回は、以下の画像のように、ある画像からみかんの部分だけを抜き取ってくるということをやってみようと思います。

f:id:yshgs_elec:20210227210518j:plain

今回はオレンジ色に着目して物体抽出を試みます。

しかし、ある色の部分だけを取り出すことが目的ではなく、あるメインカラーの物体全体を取り出すことを目的としています。

要は、みかんを取り出したい場合は、へた部分もしっかり残したいわけです。

(上の画像は、へたがしっかり残っていますよね。)

 

この記事では、こんなことをやっていきます。

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

 

※今回は色に着目して物体を抽出します。例えば、しまうまみたいにメインカラーが2つあるような物体は取り出すことができませんので、ご了承ください。

 

スポンサーリンク

必要なライブラリ

◆openCV:Ver.4.5.1.48

◆numpy:Ver.1.19.5

バージョンは参考情報です。

おそらくバージョンが違っても動作するはずです。 

 

インストールしていない場合は、インストールしておきましょう。

やりかたはググればすぐに出てきます。

 

スポンサーリンク

特定色の物体全体を取り出すコード

下準備が整ったところで、早速コードを記述していきましょう。

以下がオレンジ色の部分に着目し、みかんの部分だけを抜き出してくるpythonコードです。

#必要なライブラリインポート
import cv2
import numpy as np
#読み込む画像を指定
pic_name="mikan.jpg"
#opencvで配列化
img = cv2.imread(pic_name,cv2.IMREAD_COLOR)
#画像サイズを取得
height, width = img.shape[:2]
#BGRからHSV形式に変換
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)
#画像をぼかして、へたの部分をあいまいにする
hsv2=cv2.blur(hsv,(40,40))
#オレンジ色の部分だけを取り出すための事前処理
h = hsv2[:, :, 0]
s = hsv2[:, :, 1]
v = hsv2[:, :, 2]
#マスキング用の配列を準備
img_blk=np.zeros((height,width,3),np.uint8)
#オレンジ色の部分だけはマスクしないようにする
img_blk[(h <60) & (h > 10) & (s > 120)& (v > 20)] = 1
ttt=img_blk*hsv
#BGR形式に戻す
bgr = cv2.cvtColor(ttt, cv2.COLOR_HSV2BGR_FULL)
#画像を出力する
cv2.imwrite('mikan_out.jpg',np.array(bgr))

 

◆コードのポイント解説①画像をぼかしてメインカラー以外の部分が取り除かれないようにする

今回は以下の処理を行って、40×40ピクセルの範囲で画像をぼかすという作業を行っています。

hsv2=cv2.blur(hsv,(40,40))

この処理を行うことで、みかんのへたの部分がぼやけてオレンジ色として扱われるため、へたの部分にマスクがされないようにすることができます。

 

◆コードのポイント解説②指定した色の部分だけを抜き出す方法

コード中の以下の部分にて、抜き出す色を指定しています。

img_blk[(h <60) & (h > 10) & (s > 120)& (v > 20)] = 1

 

ここはHSV画像の概念をわかっていなければ調整することができませんので、まずは【HSV 概念】などと検索してHSVとは何かを理解しておきましょう。

そこが理解できれば、取り出したい色を変えたいときに上記コード内の数値をどう変えれば良いかわかるはずです。

(まぁhの部分だけを自分でいろいろいじって調整してもOKです。)

 

スポンサーリンク

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

というわけで最後に先ほど紹介したサンプルコードを実行してみましょう。

※実行前にコードを記述したファイルと同じフォルダに画像が入っていることを確認しておきましょう。

 

プログラムを実行した結果、以下の画像のようにもとの画像からみかんの部分だけを取り出した画像が出力されていることが確認できました。

(若干背景の白い部分が残ってますが、まぁこれはある程度仕方ないですね。)

f:id:yshgs_elec:20210227214403j:plain

スポンサーリンク

おわりに

というわけで今回はpythonを使って、ある画像から指定した色の物体を取り出す方法をご紹介しました。

なにかの参考になれば幸いです。

 

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

・もっと革新的なことをやりたい。

・プログラミングについてもっと詳しくなりたい。

こんな思いを持っている人は、ぜひ他の記事も見てみてくださいね。

 

この記事が役に立ったという方は、ぜひ応援よろしくお願いします。

 ↓ 応援ボタン

にほんブログ村 IT技術ブログへ
にほんブログ村

 

それではまた!

 

コメント

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