寻找两个(或更多)轮廓的质心
Finding centroid of two(or more) contours
我有 binary images
如下所示。我想获得白色区域的质心。(不是每个轮廓的质心)这张图片有两个独立的轮廓
_, 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'])
所以我只是简单地添加了 contours
的 np.array
,并在 openCV
中使用了 moments
。
它看起来运行良好...但我不确定 self.cx
和 self.cy
是否真的是白色 regoins 的 cetroid。
我做的对吗?如果没有,有什么更好的方法吗?
如果您不确定从 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
的值相匹配。所以我猜你一直都在做对!
我有 binary images
如下所示。我想获得白色区域的质心。(不是每个轮廓的质心)这张图片有两个独立的轮廓
_, 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'])
所以我只是简单地添加了 contours
的 np.array
,并在 openCV
中使用了 moments
。
它看起来运行良好...但我不确定 self.cx
和 self.cy
是否真的是白色 regoins 的 cetroid。
我做的对吗?如果没有,有什么更好的方法吗?
如果您不确定从 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
的值相匹配。所以我猜你一直都在做对!