「ある画像の中から、特定の物体だけを取り出したい。」
「その物体は色に特徴があるので、指定色の部分だけを取り出すようにしたい。」
この記事ではこんな悩みを解決するために、ある画像から指定した色の物体を取り出す方法をご紹介します。
みかんの画像を使って実演していきますので、ぜひあなたも何かの画像を使って一緒にやってみましょう。
それでは早速やっていきます!
紹介するスキルの概要説明
はじめに、あなたのやりたいことと、この記事の内容が一致しているか確認しておきましょう。
今回は以下の画像のように、ある画像からみかんの部分だけを抜き取ってくるということをやってみようと思います。
今回はオレンジ色に着目して物体抽出を試みます。
※ある色の部分だけを取り出すことが目的ではなく、あるメインカラーの物体全体を取り出すことを目的としています。
要はみかんを取り出したい場合、へた部分もしっかり残したいわけです。
(上の画像は、へたがしっかり残っていますよね。)
この記事では、こんなことをやっていきます。
あなたのやりたいことと一致していれば、ぜひ続きをご覧ください。
※今回は色に着目して物体を抽出します。例えば、しまうまみたいにメインカラーが2つあるような物体は取り出すことができませんので、ご了承ください。
※この作業をpythonというプログラミング言語を用いて実行していきます。インストールから始めたい方は以下からご覧ください。
必要なライブラリ
◆openCV
◆numpy
numpyはAnacondaを使用すればあらかじめインストールされていますが、openCVは自分で追加インストールが必要です。
openCVのインストール方法については以下の記事で解説しています。
特定色の物体全体を取り出すコード
下準備が整ったところで、早速コードを記述していきましょう。
以下がオレンジ色の部分に着目し、みかんの部分だけを抜き出してくる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です。)
サンプルコードの実行結果
というわけで最後に先ほど紹介したサンプルコードを実行してみましょう。
※実行前にコードを記述したファイルと同じフォルダに画像が入っていることを確認しておきましょう。
プログラムを実行した結果、以下の画像のようにもとの画像からみかんの部分だけを取り出した画像が出力されていることが確認できました。
(若干背景の白い部分が残ってますが、まぁこれはある程度仕方ないですね。)
おわりに
というわけで今回はpythonを使って、ある画像から指定した色の物体を取り出す方法をご紹介しました。
なにかの参考になれば幸いです。
このように、私のブログでは様々なプログラミングスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
それではまた!
コメント