opencv inRange позиция пикселя

77
8

Мне нужно получить несколько пикселей, которые находятся в диапазоне значений цвета RGB

Я использую функцию inRange:

 mask = cv2.inRange(image, lower, upper)

Теперь я получаю эту маску, и мне нужно сделать некоторые операции с этими отфильтрованными пикселями - т.е. найти расстояние между двумя случайными пикселями

Как я могу это сделать?

Если я вызываю print(image) я получаю следующий массив:

[[[ 78  94 107]
[ 82 97 113]
[ 87 102 118]
...
[101 114 116]
[108 120 122]
[109 121 123]]

Как я понимаю, это массив, где ключи - это координаты x и y, а значение - код RGB. Но если я вызываю print(mask.nonzero()) я вижу

(array([126, 126, 126, ..., 168, 168, 168], dtype=int64),...)

И я действительно не понимаю, что находится в этом массиве, и в документах я не нашел тип возвращаемого значения

спросил(а) 2021-01-25T22:46:08+03:00 4 месяца, 4 недели назад
1
Решение
77

Поскольку mask представляет собой numpy.nonzero(..) массив, метод numpy.nonzero(..) вернет numpy.nonzero(..) кортеж, первый элемент представляет собой массив индексов первой координаты, отличной от нуля, а второй кортеж представляет собой массив индексы второй координаты, которая не равна нулю.

Вы можете использовать np.transpose(..) чтобы получить матрицу n × 2 с двумя координатами пикселя, которые не равны нулю, поэтому:

print(np.transpose(mask.nonzero()))

ответил(а) 2021-01-25T22:46:08+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема