В этом уроке мы создадим приложение для водяных знаков изображения. Прежде чем мы углубимся в детали, давайте посмотрим, как их можно применять в бизнесе. Что касается важности водяных знаков изображений, то они играют важную роль в защите документов от несанкционированного использования (нарушения авторских прав). Кроме того, если для одного и того же приложения имеется правильный конвейер, это экономит значительное количество времени, поскольку водяные знаки нужно будет нанести на большое количество документов.

Пример использования водяных знаков изображения

Хотя мы создаем приложение для водяных знаков на любом изображении, знаем ли мы о каком-либо бизнес-варианте его использования? Итак, давайте сначала посмотрим на это:

  1. Добавление водяного знака помогает сохранить законные права вашей компании, чтобы другие люди или организации не использовали его без каких-либо опасений, и не возникало никаких проблем с авторскими правами.
  2. Это приложение также поможет в автоматизации, поскольку мы все знаем, что добавление водяного знака вручную к каждому изображению займет много времени. В результате это приложение поможет автоматизировать весь процесс, сэкономив значительное количество времени.

Примечание. Перед тем как перейти к написанию кода, я использую блокнот Jupyter для написания кода по следующим причинам:

  1. Мы можем запускать каждый фрагмент кода отдельно, что позволит нам понять, что делает каждый фрагмент кода, без какой-либо отладки.
  2. Подход «код + комментарий», т. е. мы можем писать код и в то же время документировать этот код. При этом вы можете использовать любой редактор кода по своему выбору (предпочтительнее блокнот Jupyter).

Во-первых, мы будем импортировать все необходимые библиотеки.

# Important library import
import cv2
import numpy as np
import request
from PIL import Images

Давайте рассмотрим, как мы будем использовать каждую из импортированных библиотек.

  1. cv2: эта библиотека отвечает за импорт всех встроенных функций, поддерживаемых компьютерным зрением, и выполнение всех операций обработки изображений.
  2. NumPy: эта библиотека импортируется для выполнения некоторых необходимых математических вычислений и преобразования цветов.
  3. запросы : эта библиотека будет использоваться для получения изображений из Интернета, чтобы мы могли использовать их в соответствии с нашими требованиями.
  4. PIL : также известная как библиотека подушек, это поможет нам открыть изображение, которое мы загрузим из Интернета.

Для этого проекта нам нужен URL-адрес изображения, к которому мы применим водяной знак. Мы будем использовать URL-адрес изображения из Google Images для его загрузки. Вы можете использовать любое изображение, которое хотите, и заменить URL-адрес изображения текущим URL-адресом. Далее мы прочитаем и изменим размер изображения, прежде чем сохранить его в двух переменных для водяных знаков логотипа и текста.

# Reading image form url
image = Image.open(requests.get('https://wallpaperbat.com/img/515088-pureoled-black-wallpaper.jpg', stream=True).raw)
image_logow = image.resize((500,300))
image_textw = image.resize((500,300))
image_logow
# https://media.sproutsocial.com/uploads/2017/02/10x-featured-social-mediaimage-size.png

Мы должны получить следующий вывод:

# Reading logo form url
logow = Image.open(requests.get('https://www.kark.com/wpcontent/uploads/sites/85/2016/03/cvs_1457227446363_7369586_ver1.0.png',stream=True).raw)
# logow = logo.resize((209,52))
logow
# https://www.logogenie.net/download/preview/medium/9995302

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

Чтобы использовать эти изображения, мы сначала преобразуем их в формат RGB и сохраним в виде массива NumPy, но здесь возникает вопрос, зачем нам нужно преобразовывать изображение в формат RGB? Причина этого в том, что RGB имеет три цветовых канала, которые во всех комбинациях дают нам цветное изображение вместо черно-белого. Точно так же мы будем извлекать фигуру, т. е. ее высоту и ширину.

image_logow = np.array(image_logow.convert('RGB'))
h_image, w_image, _ = image_logow.shape
logow = np.array(logow.convert('RGB'))
h_logo, w_logo, _ = logow.shape

Мы поместим наш водяной знак в центр изображения, поэтому нам нужно вычислить центр изображения. Здесь мы найдем координаты центра изображения, используя высоту и ширину изображения.

# Get the center of the original. It's the location where we will place the watermark
center_y = int(h_image / 2)
center_x = int(w_image / 2)
top_y = center_y - int(h_logo / 2)
left_x = center_x - int(w_logo / 2)
bottom_y = top_y + h_logo
right_x = left_x + w_logo

Область интереса определяется как область, на которой нам нужно разместить наш водяной знак. Здесь мы найдем ROI, используя координаты, которые мы нашли выше. Далее мы будем использовать OpenCV для объединения нашего логотипа с ROI. Точно так же мы также добавим линию или узор к нашему изображению.

# Get ROI
roi = image_logow[top_y: bottom_y, left_x: right_x]
# Add the Logo to the Roi
result = cv2.addWeighted(roi, 1, logow, 1, 0)
# Drawing
cv2.line(image_logow, (0, center_y), (left_x, center_y), (0, 0, 255),1)cv2.line(image_logow, (right_x, center_y), (w_image, center_y), (0, 0,255), 1)
# Replace the ROI on the image
image_logow[top_y: bottom_y, left_x: right_x] = result

В приведенном выше коде, когда мы увидим раздел рисования, в функции cv2.line мы видим, что есть параметры (x1, y1), (x2, y2), а затем цветовая комбинация, которая также находится в формате RGB. т. е. (0,0,255), который стимулирует 0-красный, 0-зеленый и 255-синий, что означает, что выбранный цвет является синим, аналогичным образом многие комбинации цветов могут быть получены просто с помощью различных комбинаций значений.

Теперь мы преобразуем изображение из массива в RGB и визуализируем его.

# Ploting logo watermark image
img = Image.fromarray(image_logow, 'RGB')
img

Далее мы увидим, как мы можем использовать текст в качестве водяного знака. Мы преобразуем наше изображение в RGB и сохраним его как массив NumPy. Чтобы поместить текст в качестве водяного знака, мы будем использовать функцию put text() OpenCV. Здесь мы можем использовать различные функции, такие как размер текста, толщина текста, семейство шрифтов и т. д.

# Text Watermark
image_text = np.array(image_textw.convert('RGB'))
cv2.putText(image_text, text='CVS pharmacy', org=(w_image - 140, h_image-10) , fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=0.5, color=(100,255,120), thickness=2, lineType=cv2.LINE_4);

В приведенном выше коде мы видим функцию ввода текста, в которой один является текстовым параметром, который будет содержать текст, который будет нанесен на изображение в качестве водяного знака, а затем местоположение водяного знака (где он будет присутствовать в изображение) и, наконец, параметр шрифта, который отвечает за предоставление различных типов и форматов текста.

Чтобы визуализировать изображение, нам нужно преобразовать его обратно в формат RGB.

# Plotting text watermark image
timg = Image.fromarray(image_text, 'RGB')
timg

Меры предосторожности

  1. Качество изображения: будьте осторожны с качеством изображения, так как чем ниже качество изображения, тем меньше оно повлияет на водяной знак.
  2. Расположение изображения и текстового водяного знака. Хотя мы использовали стандартное расположение как для изображения, так и для текстового водяного знака, если вы хотите изменить местоположение, будьте осторожны с этим, так как если указанное вами местоположение находится вне кадра, то ничего не будет отображаться.

Краткое содержание

Итак, если мы хотим обобщить все, что мы сделали до сих пор, вот оно:

  1. Мы импортировали все библиотеки, необходимые для создания этого приложения.
  2. Прочитайте изображение, на которое мы хотели нанести водяной знак с логотипом и названием компании.
  3. После этого мы применили все необходимые приемы обработки изображения, например, изменение цвета. Короче говоря, формат изображения можно изменить, чтобы написать текст и разместить логотип на изображении по нашему выбору. Все, что мы сделали с изображением, было сделано с использованием методов обработки изображений.
  4. Затем, в конце концов, мы увидели результат, который помог нам решить вопрос с созданием безопасного в том смысле, что его нельзя использовать без лицензии или платной версии. В результате компонент автоматизации экономит время.

Автор: Аман Прит Сингх Гулати