首页 > 解决方案 > 如何获取所有白色斑点的像素位置

问题描述

我正在从二进制图像创建注释。我想要二进制图像中每个白色 blob 列表的单独列表。因此,按照我在下面给出的图像,我应该得到六个数组/列表。

我在 Numpy + OpenCV-Python 之后使用了 np.argwhere(img == 255) :获取白色像素的坐标,但它返回了所有白色斑点的组合像素位置。

我已经使用了这个 cv2.findContours(threshed, cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)[-2] 但这会返回外边缘的像素值而不是整个 blob。如何从图像中获取单独的列表? 在此处输入图像描述

标签: python

解决方案


您可以使用connectedComponents

r,l = cv2.connectedComponents(img)
blobs = [np.argwhere(l==i) for i in range(1,r)]

(标签0是背景,这就是我们从 in 开始的1原因range(1,r)

例子:

import cv2
from urllib.request import urlopen
import numpy as np

req = urlopen('https://i.stack.imgur.com/RcQut.jpg')
arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
img = cv2.imdecode(arr, cv2.IMREAD_GRAYSCALE) 
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]

r,l = cv2.connectedComponents(img)

print([len(np.argwhere(l==i)) for i in range(1,r)]) #just the lenghts for shortness
#[317, 317, 377, 797, 709, 613]

推荐阅读