Python : 重心(図心)の検出 moments

PythonでのOpencvを使った重心(図心)求め方についてです 。

以前書いた、最小外接円でも似たような値は出せますが、

kangkang1981.hatenablog.com

最小外接円だとcontoursの関数と組み合わせる必要がありますが、

 

画面全体での白の重心という方法ではこのmomentsという関数を使います。

使い方としては、二極化あれた白画像、もしくはcontours関数の領域でも取れますが、

contoursの場合は最小外接円でも同じようにでますので、好みで構わないと思います。

 

書き方としては、二極化した画像をmomentsで囲います。

mu = cv2.moments(th_otsu)

 

こうすると、muに各モーメントの値が出るのですが、

重心は下記のようになります。

x : m10/m00

y : m01/m00

x,y= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"])

 

元の画像はこれを使いました。

f:id:Kangkang1981:20201025204450j:plain

重心を検出すると下記のようになります。

f:id:Kangkang1981:20201025204552j:plain



参考にしたリンク先は下記となります。

labs.eecs.tottori-u.ac.jp

 

プログラムの詳細は下記になります。 

 

import cv2

#画像を読み込む
frame = cv2.imread('moon_plus.jpg')
#画像をグレイ化
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#画像を二極化
ret,th_otsu = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#モーメント関数で3次までのモーメントを取得
mu = cv2.moments(th_otsu)
#図心を出す。
x,y= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"])
#図心を画像に記載する。
cv2.circle(frame,(x,y),5,(0,0,255),3)
#画像を表示する。
cv2.imshow('frame',frame)
cv2.imwrite('frame_moment.jpg',frame)

#キー入力を待つ
cv2.waitKey(0)
#全ての開いたウインドウ閉じる
cv2.destroyAllWindows()

 

今までにpythonについて書いた記事はここにリンクを貼ってあります。

興味があればぜひご覧ください。