使用python查找图像中黑色/灰色像素的所有坐标

Cd0*_*d01 2 python opencv numpy image image-processing

我正在尝试找到一种方法来读取任何 any .png.jpgor .tiff,并返回该图像中所有黑色或灰色像素的坐标。

我正在考虑有一个特定的灰色阈值,并写出比该阈值更暗的每个像素的坐标。然而,我不确定如何管理读取图像的方面。我的目标是让结果成为图像中所有黑色像素的列表,如下所示:

[x 坐标,y 坐标,黑色]

我研究过使用它cv.imread来读出像素的坐标,但据我所知,它的工作方式与我想要的方式完全相反 - 它以坐标作为参数,并返回 RGB 值。有人有让这项工作有效的技巧/方法吗?

对于任何有类似问题的人,我使用下面的答案解决了这个问题,然后我使用 将 numpy 数组转换为列表np.ndarray.tolist()。此外,由于我只得到了结果的截断版本,因此我使用了:

import sys

np.set_printoptions(threshold=sys.maxsize)

现在使用索引打印列表中的任何元素都很简单。

nat*_*ncy 10

您可以使用np.column_stack()+ np.where()。其想法是将图像转换为灰度,然后找到低于特定阈值的所有像素的坐标。请注意,在灰度中,图像有一个带有像素值的通道[0 ... 255]


使用此输入图像threshold_level = 20

我们将低于此阈值水平的所有像素着色为蓝色

所有像素坐标都可以从掩模中确定np.where(),并使用 堆叠成(x, y)格式np.column_stack()。这里是所有低于阈值的像素坐标

coords = np.column_stack(np.where(gray < threshold_level))
Run Code Online (Sandbox Code Playgroud)
[[ 88 378]
 [ 89 378]
 [ 90 378]
 ...
 [474 479]
 [474 480]
 [474 481]]
Run Code Online (Sandbox Code Playgroud)

threshold_level = 50

[[ 21 375]
 [ 22 375]
 [ 23 376]
 ...
 [474 681]
 [474 682]
 [474 683]]
Run Code Online (Sandbox Code Playgroud)

代码

import cv2
import numpy as np

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Set threshold level
threshold_level = 50

# Find coordinates of all pixels below threshold
coords = np.column_stack(np.where(gray < threshold_level))

print(coords)

# Create mask of all pixels lower than threshold level
mask = gray < threshold_level

# Color the pixels in the mask
image[mask] = (204, 119, 0)

cv2.imshow('image', image)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)

使用您的输入图像和threshold_level = 10

[[  59  857]
 [  59  858]
 [  59  859]
 ...
 [1557  859]
 [1557  860]
 [1557  861]]
Run Code Online (Sandbox Code Playgroud)