Найти все координаты черных / серых пикселей на изображении, используя python - PullRequest
2 голосов
/ 15 октября 2019

Я пытаюсь найти способ прочитать любой любой .png, .jpg или .tiff и вернуть координаты всех черных или серых пикселей на этом изображении.

Ядумать о наличии определенного порога серого цвета и выписывать координаты каждого пикселя, который темнее этого. Я не уверен, как управлять аспектом чтения изображения, как бы то ни было. Я хочу, чтобы мой результат представлял собой списки всех черных пикселей изображения:

[x-координата, y-координата, черный]

Я рассмотрел использованиеcv.imread для считывания координат пикселей, но, насколько я могу судить, он работает точно так, как я хочу - он принимает координаты в качестве параметра и возвращает значения RGB. У кого-нибудь есть советы / способы сделать эту работу?

Для тех, у кого есть подобные вопросы, я решил это, используя ответ ниже, а затем превратил массив numpy в список, используя np.ndarray.tolist(). Кроме того, поскольку я получил только усеченную версию результатов, я использовал:

import sys

np.set_printoptions(threshold=sys.maxsize)

Теперь было просто напечатать любой элемент изсписок с использованием индексов.

1 Ответ

2 голосов
/ 16 октября 2019

Вы можете использовать np.column_stack() + np.where(). Идея состоит в том, чтобы преобразовать изображение в оттенки серого, а затем найти координаты всех пикселей ниже определенного порога. Обратите внимание, что в оттенках серого изображение имеет один канал со значениями пикселей [0 ... 255]


Использование этого входного изображения с threshold_level = 20

image

Мы окрашиваемво всех пикселях ниже этого порогового уровня синим цветом

image

Все координаты пикселей можно определить по маске с использованием np.where() и поместить в формат (x, y) с помощью np.column_stack(). Здесь все координаты пикселей ниже порога

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

С threshold_level = 50:

image

[[ 21 375]
 [ 22 375]
 [ 23 376]
 ...
 [474 681]
 [474 682]
 [474 683]]

Код

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()

с вашим входным изображением и threshold_level = 10

image image

[[  59  857]
 [  59  858]
 [  59  859]
 ...
 [1557  859]
 [1557  860]
 [1557  861]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...