我有binary images
如下。我想获得白色区域的cetroid。(不是每个轮廓的质心)这个图像有两个独立的轮廓
_, contour, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
total_contour = contour[0]
for ctr in contour[1:]:
total_contour = np.concatenate((total_contour, ctr), axis =0)
mmt = cv2.moments(total_contour)
self.cy = int(mmt['m10']/mmt['m00'])
self.cx = int(mmt['m01']/mmt['m00'])
所以我只是简单地添加了np.array
contours
,并在moments
中使用了openCV
。
它看起来效果很好......但我不确定self.cx
和self.cy
是否真的是白色区域的破坏者。
我做对了吗?如果没有,那会有什么更好的方法?
答案 0 :(得分:1)
如果您不确定自openCV
获得的结果,您可以随时自行计算质心。这很简单,方法如下:
centroid = [nz.mean() for nz in binary_image.nonzero()]
如果您希望质心与您从openCV获取的x,y索引格式相同,请执行以下操作:
import numpy as np
centroid = np.array([nz.mean() for nz in binary_image.nonzero()][2::-1], dtype=int)
我在你问题中发布的图片上运行了以上代码,这就是我得到的:
[133 44]
如果它让您感觉更好,那么当我运行您发布的openCV代码段时,它确实与我为cx
和cy
获得的值相匹配。所以我猜你一直在做这件事!