Статья Автор: Деникина Наталья Владимировна

Методы нахождения белого пикселя на изображении

Методы нахождения белого пикселя на изображении

До этого мы определяли цвета по заранее известным координатам. Настало время усложнить задачу, и найти координаты "объекта". 
Объектом в нашем случаем пока будет белый пиксель на изображении размером 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 вещи:

  1. np.where(np.sum(image, axis=-1) > 30, 255, 0).astype(np.uint8) - Достаточно простой способ бинаризации изображения, там, где сумма значений трех составляющих BGR больше 30, делаем пиксель белый, иначе - черный.
  2. Формат вывода координат:
    • Функции библиотеки OpenCV работают с координатами на изображении, принимают в возвращают их в формате (X, Y)
    • Функции библиотеки NumPy работают с координатами массива, поэтому формат (Y, X)

В учебных задачах, таких как данная, часто используются "тепличные условия":

  • Изображение имеет небольшой размер.
  • На изображении присутствует только один белый пиксель.
  • Изображение статично или имеет предсказуемые изменения.

Эти условия позволяют сосредоточиться на обучении, не отвлекаясь на сложности, возникающие в реальных условиях, таких, как:

  • Большие изображения, требующие оптимизированных алгоритмов для обработки.
  • Множество объектов различных цветов и размеров.
  • Шум на изображениях, делающий процесс поиска более сложным.
  • Необходимость обработки изображений в реальном времени.
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать