You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用OpenCV分水岭算法在图像区域中心标记标签

解决分水岭分割区域标签居中问题

问题出在你使用cv2.boundingRect返回的左上角坐标作为文本位置,导致标签偏离区域中心。要实现标签精准居中,需要计算分割区域的质心(区域的重心位置),再结合文本尺寸调整绘制位置。

修改步骤:

  1. 计算区域的矩(moments):通过cv2.moments获取区域的质量分布信息,从中推导质心坐标。
  2. 计算文本尺寸:使用cv2.getTextSize得到标签文本的宽高,确保文本能准确居中。
  3. 调整文本位置:根据质心和文本尺寸,计算出文本绘制的起始坐标,让文本中心与区域质心重合。

完整修改代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:10:32