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

如何使用OpenCV求取二值图像中两个目标的中心点坐标?

二值图像示例

实现方法

直接用OpenCV自带的连通域分析功能实现,抗噪性比轮廓检测更好,可直接输出每个白色前景对象的质心(即你需要的中心点)坐标,代码简洁且结果稳定。

核心流程

  • 读取图像后转灰度,做二值化处理,确保白色目标像素值为255、黑色背景像素值为0
  • 调用cv2.connectedComponentsWithStats()接口,批量获取所有连通域的位置、面积、质心信息
  • 跳过标签为0的背景区域,过滤面积极小的噪点连通域,剩余的两个连通域就是目标白色对象,直接提取对应质心坐标即可

可直接运行的代码

import cv2
import numpy as np

# 替换成你的二值图像路径
img = cv2.imread("binary_test.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 若输入本身就是标准二值图,可跳过下面的阈值处理步骤
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 8邻域连通域分析,输出统计信息与质心
label_count, labels, stats, centroids = cv2.connectedComponentsWithStats(
    binary, connectivity=8, ltype=cv2.CV_32S
)

center_points = []
# 标签0对应背景,从1开始遍历所有前景连通域
for label_id in range(1, label_count):
    # 读取当前连通域面积
    area = stats[label_id, cv2.CC_STAT_AREA]
    # 过滤小于10像素的噪点,阈值可根据实际图像调整
    if area < 10:
        continue
    # 提取质心坐标:格式为(水平坐标x, 垂直坐标y)
    cx, cy = centroids[label_id]
    center_points.append( (round(cx, 2), round(cy, 2)) )

    # 可选:在原图上标记中心点做结果校验
    cv2.circle(img, (int(cx), int(cy)), 5, (0, 0, 255), -1)

print("提取到的白色对象中心点坐标:", center_points)

# 可选:弹窗显示标注结果
cv2.imshow("center_marked", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意点

  • 若你的二值图是白底黑对象的反向格式,只需在二值化后加binary = cv2.bitwise_not(binary)翻转像素值即可
  • 噪点过滤的面积阈值可根据实际图像的杂点大小调整,避免把噪点误识别为目标
  • 输出的坐标遵循OpenCV默认坐标系:原点在图像左上角,x轴向右延伸、y轴向下延伸,可直接用于后续定位、测量等处理

内容的提问来源于stack exchange,提问作者michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:18:24