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

如何在OpenCV(Python)中提取图像中各单色物体的所有像素?

嘿,我来帮你搞定这个需求!你要提取单色图像里每个独立物体的所有像素坐标,用OpenCV的cv2.connectedComponents()完全可以实现,这正是连通组件标记的典型应用场景。下面给你详细的实现步骤和代码:

实现步骤与代码示例

首先得明确:你的图像是单色(二值化)的——也就是背景和物体是不同的灰度值,通常背景为0、物体为255(如果反过来也没关系,后面会说调整方法)。

1. 读取并预处理图像

先把图像读进来,如果是彩色图,得先转成灰度图;如果还没二值化,就先做二值化处理:

import cv2
import numpy as np

# 读取图像,直接读成灰度图;如果是彩色图,这一步会自动转灰度
img = cv2.imread('your_image.png', cv2.IMREAD_GRAYSCALE)
# 二值化:把灰度图转换成黑白二值图,阈值127是中间值,可根据你的图像调整
_, binary_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

2. 用连通组件标记提取像素坐标

cv2.connectedComponents()会帮你识别图像里所有独立的连通区域,返回两个结果:组件总数(包含背景),以及一张标记图——每个连通区域会被赋予唯一的数字标记。

# 执行连通组件标记,默认把背景标记为0
num_labels, labels = cv2.connectedComponents(binary_img)

# 用字典存储每个物体的像素坐标,格式完全符合你的要求
object_pixels = {}

# 遍历每个物体(跳过背景的label=0)
for label in range(1, num_labels):
    # 找到当前标记对应的所有像素位置
    coords = np.argwhere(labels == label)
    # 注意:np.argwhere返回的是(y, x)顺序,要转换成常规的(x, y)
    coords = [(x, y) for y, x in coords]
    # 存入字典,key设为object1、object2...
    object_pixels[f'object{label}'] = coords

3. 查看结果

现在object_pixels里就存好了每个物体的所有像素坐标,你可以直接调用查看:

# 打印第一个物体的坐标示例
print(object_pixels['object1'])
# 输出会是:[(x1,y1), (x2,y2), ..., (xn1,yn1)]

小补充

  • 如果你的图像背景是白色(255)、物体是黑色(0),那二值化时改用cv2.THRESH_BINARY_INV反转即可;
  • 连通方式默认是8连通(上下左右+四个对角线都算连通),如果只想要4连通(仅上下左右),可以在connectedComponents里加参数connectivity=4;
  • 如果需要统计每个物体的像素总数,直接取len(object_pixels['objectN'])就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:35:37