Методы нахождения белого пикселя на изображении
До этого мы определяли цвета по заранее известным координатам. Настало время усложнить задачу, и найти координаты "объекта".
Объектом в нашем случаем пока будет белый пиксель на изображении размером 10px*10px, в котором все остальные пиксели - черные.
Файл для самостоятельного исследования: Ссылка
Находить белый пиксель на изображении можно разными методами, начиная от самых простых, перебирающих каждый пиксель, до более продвинутых, использующих мощные функции библиотеки NumPy. В этом разделе мы подробно рассмотрим несколько подходов.
1. Перебор пикселей с помощью циклов
Этот метод предполагает использование вложенных циклов для перебора каждого пикселя изображения. Хотя этот метод прост и интуитивно понятен, он является наиболее медленным, особенно для больших изображений.
for y in range(image.shape[0]): # Перебор строк изображения
for x in range(image.shape[1]): # Перебор столбцов изображения
if (image[y, x] == [255, 255, 255]).all(): # Проверка, является ли пиксель белым
print (y, x) # Выводим координаты белого пикселя
Преимущества:
- Простота реализации.
- Интуитивное понимание процесса.
Недостатки:
- Низкая производительность для больших изображений.
- Неэффективность при необходимости обработки множества изображений.
2. Использование функции np.where
Функция np.where
из библиотеки NumPy позволяет выполнять условные выборки элементов массива. Она быстрее, чем вложенные циклы, благодаря оптимизациям, встроенным в NumPy.
boolean_matrix = np.all(image == [255, 255, 255], axis=-1)
white_pixel = np.where(boolean_matrix)
if white_pixel[0].size > 0:
print (white_pixel[0][0], white_pixel[1][0])
# Вывод: 3 7
Атрибут массива NumPy.size
используется для проверки наличия белых пикселей в этом массиве. Если white_pixel[0].size
больше нуля, это означает, что в кадре были найдены белые пиксели, и их координаты могут быть выведены или использованы для дальнейшей обработки.
Преимущества:
- Высокая производительность.
- Компактный и лаконичный код.
Недостатки:
- Меньшая наглядность в сравнении с вложенными циклами.
3. Использование функции np.argwhere
Функция np.argwhere
сразу возвращает индексы элементов массива, которые удовлетворяют условию. Она также быстрее, чем использование циклов.
boolean_matrix = np.all(image == [255, 255, 255], axis=-1)
white_pixel = np.argwhere(boolean_matrix)
if white_pixel.size > 0:
print(tuple(white_pixel[0]))
# Вывод: (3, 7)
4. Использование функции cv2.findNonZero
Функция cv2.findNonZero
из библиотеки OpenCV находит все ненулевые пиксели в бинаризованном изображении. Этот метод требует предварительного преобразования изображения в бинарное, т.е. одноканальное изображение, где каждый пиксель представлен одним числом - значением 0 или 255.
image_bin = np.where(np.sum(image, axis=-1) > 30, 255, 0).astype(np.uint8)
print(image_bin)
non_zero_pixels = cv2.findNonZero(image_bin)
if non_zero_pixels is not None:
print(tuple(non_zero_pixels[0][0]))
# Вывод: (7, 3)
В дальнейшем мы разберем различные методы бинаризации изображений, а в данном примере нужно обратить внимание на 2 вещи:
np.where(np.sum(image, axis=-1) > 30, 255, 0).astype(np.uint8)
- Достаточно простой способ бинаризации изображения, там, где сумма значений трех составляющих BGR больше 30, делаем пиксель белый, иначе - черный.
- Формат вывода координат:
- Функции библиотеки OpenCV работают с координатами на изображении, принимают в возвращают их в формате
(X, Y)
- Функции библиотеки NumPy работают с координатами массива, поэтому формат
(Y, X)
В учебных задачах, таких как данная, часто используются "тепличные условия":
- Изображение имеет небольшой размер.
- На изображении присутствует только один белый пиксель.
- Изображение статично или имеет предсказуемые изменения.
Эти условия позволяют сосредоточиться на обучении, не отвлекаясь на сложности, возникающие в реальных условиях, таких, как:
- Большие изображения, требующие оптимизированных алгоритмов для обработки.
- Множество объектов различных цветов и размеров.
- Шум на изображениях, делающий процесс поиска более сложным.
- Необходимость обработки изображений в реальном времени.