@akua123 (asd fgh)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

閾値処理 座標計算

解決したいこと

Pythonで画像にマスク処理を行い、発光点を検出&重心計算を行うプログラムを作成しています。
発光のドット数が1ドット小さいものの重心を求めるときにエラーが発生します。
発光点のドット数が多いものは重心を求めることが出来ています。
解決方法を教えて下さい。

発生している問題・エラー

x = int(result["m10"]/result["m00"])
ZeroDivisionError: float division by zero

または、問題・エラーが起きている画像をここにドラッグアンドドロップ。

該当するソースコード

import cv2
import numpy as np
import csv

threshold=0
lower_S=np.array([0,0,20]) 
upper_S=np.array([180,83,255])
lower_V=np.array([0,0,94])
upper_V=np.array([180,255,255])

picture="025145_Lv1.jpg"
img= cv2.imread( picture)
# hsv色空間に変換
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#mask処理
img_mask1=cv2.inRange(hsv,lower_S,upper_S)
img_mask2=cv2.inRange(hsv,lower_V,upper_V)
img_mask=cv2.bitwise_or(img_mask1,img_mask2)
img_masked=cv2.bitwise_and(img,img,mask=img_mask)
#grayscale変換
dst = cv2.cvtColor(img_masked,cv2.COLOR_BGR2GRAY)
#輪郭検出
contours,hierarchy =cv2.findContours(dst,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#面積計算
areas = np.array(list(map(cv2.contourArea,contours)))
# 重心の計算
max_idx = np.argmax(areas)
max_area = areas[max_idx]
result = cv2.moments(contours[max_idx])
x = int(result["m10"]/result["m00"])
y = int(result["m01"]/result["m00"])
coordination=([x],[y])
#CSVファイル作成
with open('Cordinations.csv','a',newline="") as f:
    writer=csv.writer(f)
    writer.writerow([x,y])
    f.close() 
```![q4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695202/282f348e-fc7e-16c5-832d-0441c10664e0.png)

![gray_lv1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695202/7c376784-5667-89ed-e246-f13c6620e211.jpeg)
0 likes

2Answer

result["m00"] が0で除算エラーが発生しています。重心を求められない画像として除外するか、うまく画像を補正する必要がありそうです。

0Like

Comments

  1. @akua123

    Questioner

    1ドットの小さな点の座標を求めるのに輪郭検出以外に方法はあるのでしょうか?
    もし、ご存じでしたら教えてほしいです。

@akua123さんの「輪郭検出の後に画像モーメントから重心を求める」という方法を使う時、1ドットの小さな発光点に対して発光点の座標が求まらないから問題だと言っているのではなく、モーメント"m00"が0(発光領域の面積が0)なのにモーメントから重心を求めようとしているのが問題だという趣旨だと思います。

発行領域が1ドットの場合の重心がどこになるかは、モーメントを使わずに簡単に分かるかと思います

0Like

Your answer might help someone💌