如何在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
相关产品推荐
相关产品推荐

