Python : 重心(図心)の検出 moments
PythonでのOpencvを使った重心(図心)求め方についてです 。
以前書いた、最小外接円でも似たような値は出せますが、
最小外接円だと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"])
元の画像はこれを使いました。
重心を検出すると下記のようになります。
参考にしたリンク先は下記となります。
プログラムの詳細は下記になります。
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について書いた記事はここにリンクを貼ってあります。
興味があればぜひご覧ください。