如何用OpenCV分水岭算法在图像区域中心标记标签
解决分水岭分割区域标签居中问题
问题出在你使用cv2.boundingRect返回的左上角坐标作为文本位置,导致标签偏离区域中心。要实现标签精准居中,需要计算分割区域的质心(区域的重心位置),再结合文本尺寸调整绘制位置。
修改步骤:
- 计算区域的矩(moments):通过
cv2.moments获取区域的质量分布信息,从中推导质心坐标。 - 计算文本尺寸:使用
cv2.getTextSize得到标签文本的宽高,确保文本能准确居中。 - 调整文本位置:根据质心和文本尺寸,计算出文本绘制的起始坐标,让文本中心与区域质心重合。
完整修改代码:
for i in range(2, ret3+1): mask = np.where(markers == i, np.uint8(255), np.uint8(0)) x, y, w, h = cv2.boundingRect(mask) area = cv2.countNonZero(mask[y:y+h, x:x+w]) print("Label %d at (%d, %d) size (%d x %d) area %d pixels" % (i, x, y, w, h, area)) # 生成随机颜色(替换原黑色,提升可读性) color = np.uint8(np.random.randint(0, 255, 3)).tolist() output[mask != 0] = color # 计算区域质心 M = cv2.moments(mask) if M['m00'] == 0: continue # 跳过无有效面积的区域 cx = int(M['m10'] / M['m00']) cy = int(M['m01'] / M['m00']) # 获取文本尺寸,用于居中调整 text = str(i) font = cv2.FONT_HERSHEY_SIMPLEX font_scale = 3.9 thickness = 15 (text_width, text_height), _ = cv2.getTextSize(text, font, font_scale, thickness) # 计算文本绘制的起始坐标,让文本中心对齐质心 org_x = cx - text_width // 2 org_y = cy + text_height // 2 # 绘制居中标签 cv2.putText(img2, text, (org_x, org_y), font, font_scale, color, thickness, cv2.LINE_AA) plt.imshow(img2, cmap='jet') plt.show()
关键说明:
- 质心计算:
cv2.moments的m00代表区域面积,m10、m01是一阶矩,通过除法得到的质心坐标是不规则区域中心的最准确计算方式。 - 文本锚点调整:
cv2.putText默认以文本左下角为锚点,因此需要用质心坐标减去文本宽度的一半、加上文本高度的一半,才能实现文本居中。 - 颜色优化:原代码生成的黑色标签在部分背景下辨识度低,修改为随机彩色后更易观察。
内容的提问来源于stack exchange,提问作者parker
相关产品推荐
相关产品推荐

