【python-openCV】背景減算画像から物体の投影面積を算出!

この記事では、画像の中に写っている物体の投影面積を算出する方法をご紹介していきます。

 

具体的には、光学計測などでよく用いられる背景減算処理を施したあとに、画像の二値化⇒面積を算出するという流れでやっていきたいと思います。

 

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

 

※この作業をpythonというプログラミング言語を用いて実行していきます。インストールから始めたい方は以下からご覧ください。

 

スポンサーリンク

作業内容の確認

まずは今回紹介する内容が、あなたのやりたいことと一致していなければ意味がありませんので、まずはどんなことをやっていくのかを簡単にご紹介しておきます。

 

基本的には以下の画像中にあるマウスの投影面積を算出するということを行っていきます。

なお、この画像は1ピクセルが0.031684mm2/pixelであることがわかっています。

投影面積を算出する物体の画像

 

具体的な作業内容は以下の通りです。

※各画像上の名前(*.jpg)は以降のプログラム中にでてくるファイル名に対応しています。

〇背景減算画像を作成

投影面積の算出の流れ説明

〇背景減算画像を二値化⇒塗りつぶし⇒面積算出

投影面積の算出の流れ説明

スポンサーリンク

必要なライブラリの確認

pythonを使って実行していきます。

必要なライブラリは以下の通りです。

〇openCV(Ver.4.5.1)

〇numpy

 

numpyはAnacondaを使用すればあらかじめインストールされていますが、openCVは自分で追加インストールが必要です。

 

openCVのインストール方法については以下の記事で解説しています。

 

スポンサーリンク

物体投影面積を算出するサンプルコード

それでは前置きはこのくらいにして実際のコーディング作業に入りましょう。

 

なお、このプログラムの保存場所とおなじフォルダに使用する画像2枚が保存されていることを想定してコードを書いています。

〇pic1.jpg:背景画像

〇pic2.jpg:物体画像

 

以下がそのコードです。

#ライブラリインポート
import cv2
import numpy as np
pixel_area=0.031684 #mm2/pixel

#画像読み込み
pic1=cv2.imread('pic1.jpg',cv2.IMREAD_GRAYSCALE)
pic2=cv2.imread('pic2.jpg',cv2.IMREAD_GRAYSCALE)
pic1=pic1.astype(np.float32)
pic2=pic2.astype(np.float32)

#背景減算画像の作成
diff=pic1-pic2
diff=np.where(diff<0,0,diff)
diff=diff.astype(np.uint8)
cv2.imwrite('diff.jpg',diff)

#二値化⇒輪郭抽出
ret, thresh = cv2.threshold(diff, 60, 255, cv2.THRESH_BINARY)
cv2.imwrite('thresh.jpg',thresh)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
max_cnt =max(contours, key=lambda x: cv2.contourArea(x))
final_pic = cv2.drawContours(thresh, [max_cnt], -1, 255, -1)
cv2.imwrite('final_pic.jpg',final_pic)

#面積算出
num_piexl=cv2.countNonZero(final_pic)
total_area=num_piexl*pixel_area
print(str(total_area) + 'mm2')

 

コメントをつけていますので、それぞれの場所で何をやっているかはだいたいイメージができると思います。

ぜひコードを追いかけてみましょう。

背景減算処理については以下の記事に詳しく書いていますので、こちらも参考にしてみてください。

【python-openCV】2枚の画像から輝度の差分画像を作成する方法!

 

また、実行フォルダの中には途中で作成した配列画像が保存されているはずですので、こちらもどんな結果が出力されているのかをよく確認してみましょう。

 

このコードを実行すると以下の結果が得られました。

投影面積の出力結果

 

 

正解かどうかはわかりませんが、それらしい数値は出ていますね。

 

スポンサーリンク

おわりに

というわけで今回はpython-openCVを使って、画像上の物体の投影面積を計測する方法をご紹介しました。

データ分析の際などにぜひご活用ください。

 

なお、練習したいけど背景画像とか準備するのが面倒だ、という方は今回使用した画像を以下からダウンロードして練習してみましょう。

〇背景画像

練習用のサンプル画像(背景)

〇物体画像

練習用のサンプル画像(物体)

 

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

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

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

 

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

それではまた!

コメント

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