Операции маскировки над изображениями с Python и OpenCV
Изображение есть набор данных, закодированных в числовой последовательности. Извлекая числа, затем можно проводить с ними различные операции. И ,также, полученный результат можно вернуть в виде изображения.
Маскировка-это процесс изменения изображения путем применения маски. Здесь маска-это изображение, интенсивность пикселей которого равна либо нулю, либо единице, т. е. двоичная. Когда маска применяется к изображению, пиксели (изображения), совпадающие с нулем в маске, отключаются. Аналогично, пиксели, совпадающие с единицей, остаются прежними. Это в точности похоже на побитовую операцию И.
Указанные операции возможно провести с помощью Opencv и Python.
И так, для чего используется маскировка?
Маскировка имеет различные варианты использования в цифровой обработке изображений.
Пользователь может свободно определять совершенно произвольную форму для извлечения из изображения, и это возможно с помощью масок.
Его можно использовать для сегментации, редактирования и изменения изображений.
Добавьте слои на изображение с целью снижения уровня шума.
Автоматически экранируйте чувствительные части изображений.
Маски не изменяют исходное изображение, поэтому все данные сохраняются и безопасны.
OpenCV предоставляет функции для выполнения арифметических операций, таких как AND, OR, NOT, XOR для изображений. Эти операции полезны для маскировки.
И для начала, определяем массивы нулей numpy и рисуем на них некоторые фигуры(прямоугольник и круг) белым цветом, т. е. цветом (255,255,255). Мы будем выполнять операции **AND, OR, NOT, XOR ** над этими двумя массивами и видеть их выходные данные.
import numpy as np
import cv2
rectangle = np.zeros((300, 300), dtype = "uint8")
cv2.rectangle(rectangle, (25, 25), (275, 275), 255, -1)
circle = np.zeros((300, 300), dtype = "uint8")
cv2.circle(circle, (150, 150), 150, 255, -1)
cv2.imshow("rect",rectangle)
cv2.waitKey(0)
rectangle
cv2.imshow("rect", circle)
cv2.waitKey(0)
circle
Операция AND
Операция с двумя входами, которая возвращает значение true тогда и только тогда, когда оба входа являются истинными (или 1)
bitAnd = cv2.bitwise_and(rectangle, circle)
OR
Операция с двумя входами, которая возвращает значение true только в том случае, если один из входов является истинным (или 1).
bitOr = cv2.bitwise_or(rectangle, circle)
NOT
NOT является единственной операцией, которая изменяет значение ввода. В этом случае он преобразует все пиксели со значением 1 в 0 и наоборот.
bitNot = cv2.bitwise_not(circle)
Операция XOR
Операция XOR, или исключающее или(OR) может быть обобщена как функция, которая возвращает значение true только в том случае, если два операнда различны. Пример Ввода(1,1) или ввода(0,0) приводит к ложному(или 0), но ввод(1,0) или ввод(0,1) является истинным(или 1).
bitXor = cv2.bitwise_xor(rectangle, circle)
Маскировка изображений
Маскировка обычно выполняется с помощью побитовой функции И – AND. Эта функция принимает дополнительный ввод, называемый маской. Мы передаем значение нашей маски, которое затем позволит нам показывать только те части изображения, которые активны в маске.
Определите массив numpy (c нулями), равный форме изображения (на котором должна выполняться маскировка).
Определите свой ROI и нанесите его на маску (сделав круг или прямоугольник белого цвета).
Примените побитовую операцию И.
Первые два аргумента функции bitwise_and() должны быть изображением. Поскольку размеры маски и запроса не совпадают. Наконец, определите переменную маски в качестве третьего аргумента.
import numpy as np
import cv2
import sys
# Шаг 1
mask = np.zeros((300, 300), dtype = "uint8")
# Шаг 2
cv2.rectangle(mask, (50, 250), (150, 150), 255, -1)
cv2.rectangle(mask, (150, 150), (250, 50), 255, -1)
cv2.circle(mask, (75, 75), 50, 255, -1)
cv2.circle(mask, (225, 225), 50, 255, -1)
img = cv2.imread('image.png')
img = cv2.resize(img,(300,300),cv2.INTER_AREA)
bitwiseAnd = cv2.bitwise_and(img,img,mask=mask)
# Шаг 3
cv2.imshow("Masked image",bitwiseAnd)
cv2.waitKey(0)
Таким образом, мы применили побитовые операции применительно к изображению. И как видно, мы оставили только те области которые соответствуют очерченным фигурам.