ディープラーニング(深層学習)の自動着色技術を応用してOpenCVと組み合わせ植物画像のマスキングを試してみました。マスキングは画像中の背景が邪魔な場合や背景を変えたい場合などに使えます。
ここではマツの幹の画像をTensorFlowで学習させてマスキング画像を作りました。

(1)マスキング手順の概要
方法はいくつかあると思いますがOpenCVを使って以下のような手順で処理します。

①元の画像とマスク画像をビット演算AND処理で合成

img_wrk1 = cv2.bitwise_and(元の画像, マスク画像)

②マスク画像を白黒反転後、背景画像をビット演算AND処理で合成

反転マスク画像  = cv2.bitwise_not(マスク画像)
img_wrk2 = cv2.bitwise_and(背景画像, 反転マスク画像)

③マスキング後の画像をビット演算OR処理で合成

img_new = cv2.bitwise_or(img_wrk1, img_wrk2)

 

(2)ディープラーニング学習

マスク画像生成にTensorFlowを使い、特定の植物(マツの幹)の写真の正解を白一面の画像、その他の画像の正解を一面の画像として学習させました。

プログラム
maskinglearn.py(言語 Python、テキストファイル UTF-8)

学習用データ
maskingtrain.zip
マツ属にはクロマツ・アカマツ・・・などありますが、ここではまとめて「MATSU…」で始まるファイル名としています。

学習用の画像はマツの幹を切り出した画像とその他の画像で、ファイル名に”MATSU”含むことで区別、
教師データは次のようにプログラム中で画像用の配列にカラーコードを設定して生成しました。

マツの幹画像なら color = 255  # 白
その他なら color = 0  # 黒
rgb = np.array([[[color] * 3 for i in range(PIC_SIZE) ] for i in range(PIC_SIZE)]).astype(np.uint8)

 

(3)学習結果の評価とマスク画像の確認

makemask.py(言語 Python、テキストファイル UTF-8)

テスト用の画像と結果の画像

テスト用画像 maskingtest.zip

学習済みモデル masking_model.zip

結果の画像 maskingresults.zip

maskingresults

まだ学習不十分でムラがありますので、後からOpenCVの膨張処理と収縮処理で補正することにしました。
(4)マスキング

プログラム
masktrees.py(言語 Python、テキストファイル UTF-8)

以下のようにOpenCVの膨張処理と収縮処理でマスク画像のノイズを除去しています。
# ノイズ除去 (細かい白領域を除去後細かい黒領域を除去)
img_msk = cv2.morphologyEx(img_msk, cv2.MORPH_OPEN,  None, iterations=MORPH_OPEN_ITER)
img_msk = cv2.morphologyEx(img_msk, cv2.MORPH_CLOSE, None, iterations=MORPH_CLOSE_ITER)

元画像 orgimage.jpg と背景画像 bckimage.jpg マスキング画像 mskimage.jpg (OpenCVによる補正前)

orgimagebckimage

mskimage

 

この画像をマスキングした結果は次のようになりました。

マスキング結果 newiamge.jpg

newiamge

 

(2022/05/21 Shin Onda)