Введение в NUMPY

Ключевые слова: NumPY, Matplotlib, тюплы(tuples), кортеж, срез

Данный блок носит преимущественно практический характер. Перед тем, как рассматривать алгоритмы компьютерного зрения, используемые в дополненной реальности, рассмотрим основные библиотеки. Речь пойдет о библиотеках NumPY и Matplotlib. Предварительно скачайте презентацию к данной лекции, которая представлена в виде интерактивной тетради Google Colab (ссылка вверху).

Кратко о каждой из этих библиотек. Библиотека NumPY позволяет работать с большими массивами данных, а Matplotlib — это библиотека для визуализации. Соответственно библиотека NumPY пригодится в том случае, если необходимо произвести множество вычислений над большими данными, математическими вычислениями. Matplotlib нужна для того, чтобы отрисовывать изображения и какие-то изменения на изображении.Разобраться с возможностями обозначенных инструментов поможет решение одной достаточно простой задачи. Задача состоит в следующем: сгенерировать случайным образом на некоторой плоскости квадраты и круги. Начнем с генерации плоскости.

Генерируем изображение 600 на 600 пикселей, которое будет заполнено нулями. Для того, чтобы посмотреть сгенерированное изображение, вызовем метод shape.

Метод возвращает тюпл (tuple) из двух значений: ширина и высота изображения. Теперь, используя метод imshow, визуализируем сгенерированное изображение. Пишем метод, который будет генерировать квадрат на поверхности нашего изображения. Пересоздавать внутрь этого метода будем изображение, ширину и высоту квадрата, начальную координату, от которой собираемся этот квадратик рисовать. Для того, чтобы нарисовать квадратик поверх плоскости, используем срезы. Срезы в NumPY работают точно так же, как в Python: задаем начальную координату и начальную координату плюс ширину, чтобы сделать некоторый срез по ширине. Соответственно, для создания среза по высоте, задаем начальную координату по высоте и начальную координату по высоте плюс высоту. Таким образом, на изображении плоскости появился квадрат той ширины и высоты, которые были заданы ранее.Рассмотрим метод where. Он возвращает координаты по некоторому условию. Например, чтобы посмотреть координаты пикселей, в котором изображение равно единице, то есть координаты площади нашего квадрата. Вводим команду и видим, что это координаты от 10 до 59 по x. Можем сравнить, что ранее задавали начальную координату 10 по ширине и координаты от 20 по 69 по оси y, и видим что мы задавали начальную координату y. Далее необходимо написать метод, который будет рисовать круги на изображении. Передаем туда наше изображение, радиус и координаты круга, где его нужно отрисовать. Рассмотрим, что делает данный метод. Сначала берем ширину и высоту оригинального изображения, координаты x и y центра круга. Теперь переходим к следующему фрагменту кода:

Команда генерирует числа от 0 до 100. Можем в этом убедиться, введите данную строку в своей тетради Google Colab, обработайте и посмотрите, что произойдет. Метод меняет форму массива. В данном случае форма массива приводится к виду 100 на 1. Таким образом, есть некоторый массив и каждое число, которое мы сгенерировали также оказывается в отдельном массиве. Команда кода по Y работает аналогично. Только форму массива задаем в виде 1 на 100. Получается массив и со вложенным массивом внутри, где хранятся все числа. На примере линейной алгебры и матриц, можно сказать, что есть два вектора, один по высоте, другой по ширине. Далее складываем два вектора и получаем матрицу со значениями попарных сумм данных векторов.Одна из особенностей NumPy — это возможность реализовывать фильтры для массивов. Фильтры позволяют выбирать из массива некоторые элементы, соответствующие определенному условию, налагаемому на их значение. В строчке кода это условие задается уравнением круга, то есть после генирации координаты и отбираем только те, которые лежат внутри заданного круга. Таким образом, данная маска может быть использована для генерации круга.Итак, еще раз. Генерируем сначала координаты изображения x с соответствующей шириной, координаты y с соответствующей высотой, создаем маску с помощью уравнения окружности, задаем радиус и начальные координаты, то есть координаты центра. В картинку этот фильтр вводим вместо индексов и прописываем единицу. Таким образом рисуется круг внутри массива.Вспоминаем задачу. Она заключается в том, чтобы расположить некоторое количество квадратов и кругов на одном изображении, но с таким условием, чтобы квадраты и круги между собой не пересекались. Соответственно для решения данной задачи необходимо реализовать два метода: первый метод — это проверка, подходит ли место куда мы хотим нарисовать квадрат для расположения квадрата, и подходит ли место для того, чтобы отрисовать в нем круг. Сделаем это.

Далее уже достаточно знакомые строчки кода. Видно, что для проверки круга есть маска, а для проверки квадратом используется срез.

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

Рассмотрим основной pipeline алгоритма. Генерируем изображение 600 на 600, заполненное нулями, задаем размер квадратов, радиус кружков. Предположим, что на нашей картинке необходимо отрисовать всего 30 фигур. Уточним, что 30 точно не получится. Дело в том, если не получается вставить круг или квадрат в определенное место, то он там не рисуется. С помощью метода задаем координаты x и y. Отметим, что данная функция работает точно также, как random, с тем лишь исключением, что здесь можно задать размер выходного вектора. То есть если в обычном random возвращается всего одно число, то в данном случае заданием параметра , обозначаем, что необходимо вернуть два числа — для x и для y. Далее, проверяем подходит ли случайно выбранное место для того, чтобы нарисовать в нем круг; проверяем подходит ли это место для того, чтобы нарисовать квадрат; и так же случайным образом выбираем, хотим нарисовать квадрат или круг. Если выпал квадрат и место подходит для рисования квадрата, то используем уже до этого реализованный метод .В противном случае, используем метод . Таким образом, у нас сгенерировалось изображение, содержащее круги и квадраты.Так как работа идет с компьютерным зрением, а в компьютерном зрении очень многие алгоритмы завязаны в том числе и на цвета объектов, которые есть у нас на изображении, необходимо разобраться с кодировкой цвета rgb ( red, green, blue — красный, зелёный, синий, аддитивная цветовая модель) и с тем, как работать с цветными иллюстрациями. Сгенерируем изображение: Оно будет такого же размера, как наше исходное. Параметр 3 (тройка) — глубина изображения, то есть этот параметр отвечает за цвет, который задается в кодировке rgb. Закрасим квадраты и круги, которые ранее сгенерировали, в какой-нибудь определенный цвет. Для этого напишем фильтр по уже рассмотренному ранее алгоритму. Зададим функцию numpy:

Здесь все квадраты и круги синего цвета, для этого параметр b, то есть второе значение массива, приравняли 255.

Дополнительные источники информации:

Задание: Сгенерировать изображение таким образом, чтобы все фигуры были разного цвета, а количество кругов и квадратов фиксированное количество.

Last updated