Imágenes de marca de agua usando OpenCV | Cómo marcar una imagen con OpenCV

Contenidos

Este artículo fue publicado como parte del Blogatón de ciencia de datos

En este artículo, aprenderemos cómo marcar con agua varias imágenes usando OpenCV.

Temas a cubrir:

  1. ¿Qué es una marca de agua?
  2. Cambiar el tamaño de las imágenes en OpenCV
  3. Crear marca de agua usando una imagen

1. ¿Qué es una marca de agua?

Una marca de agua es un logotipo, firma, texto o patrón que se superpone intencionalmente a diferentes imágenes y se utiliza para proteger los derechos de autor de las imágenes.

Su objetivo principal es promover una marca y dificultar la copia o el uso de la imagen original sin el permiso del propietario.

Las organizaciones profesionales suelen utilizar las marcas de agua para evitar que otros utilicen su contenido después de alojarlo en línea.

Entonces, ¿alguna vez has pensado en agregar una marca de agua a tus imágenes? Bueno, lo hice.

Por ejemplo, escribimos blogs y mencionamos la fuente de imágenes externas. Pero, ¿qué pasa con las imágenes que crea por su cuenta? ¿No sería bueno dejar tu huella en ellos?

¡Hurra! Comencemos con esta emocionante tarea.

2. Cambiar el tamaño de las imágenes en OpenCV

Cambiar el tamaño no es más que escalar la imagen, lo que significa cambiar el tamaño de la imagen original. Podemos aumentar o disminuir el tamaño de la imagen según los requisitos comerciales.

El cambio de tamaño se puede realizar de varias formas.

1. Conservar la relación de aspecto. La relación de aspecto de una imagen es la relación entre su ancho y su altura.

  • Reducir o aumentar el tamaño de la imagen

2. No conserva la relación de aspecto

  • Solo ancho de encogimiento / aumento, solo altura de encogimiento / aumento

3. Cambie tanto el ancho como el alto a valores específicos

Suena genial hasta ahora, pero ¿cómo lo hacemos en la práctica? La respuesta es OpenCV y su función resize (). Lea más sobre la función de cambio de tamaño de OpenCV en este documentación.

Sintaxis de la función cv2.resize ():
cv2.resize (src, dsize, interpolación)

  • src – imagen de origen
  • dsize: el tamaño deseado de la imagen de salida
  • interpolación – Definición de Wikipedia: Es un método para construir (encontrar) nuevos puntos de datos basados ​​en el rango de un conjunto discreto de puntos de datos conocidos.

Consulte esta documentación para leer más sobre banderas de interpolación.

Ahora, tomemos una imagen de muestra y cambiemos su tamaño. A continuación se muestra nuestra imagen de muestra.

44364deer-9418003
Imagen del autor

Ahora, intente mostrarlo usando OpenCV.

  1. import cv2
    img = cv2.imread('images/deer.JPG')
    cv2.imshow("Original Image", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

A continuación se muestra cómo se ve nuestra imagen cuando se muestra usando OpenCV. Como nuestra imagen es de alta resolución, solo una parte de ella es visible.

79507deer20before20resizing-8155746

Entonces, definitivamente existe la necesidad de cambiar su tamaño. Necesitamos disminuir su tamaño.

Pasos para cambiar el tamaño de una imagen en OpenCV:

  • Lea la imagen usando cv2.imread ()
  • Establezca el nuevo ancho y alto.
  • Crea una tupla para las nuevas dimensiones
  • Cambiar el tamaño de la imagen usando cv2.resize ()
  • Si es necesario, guarde la imagen redimensionada en la computadora usando cv2.imwrite ()
  • Muestre las imágenes originales, redimensionadas usando cv2.imshow ()

1. Conservar la relación de aspecto: reduce la escala de la imagen al 20% de su tamaño original.

(Estamos reduciendo el tamaño de la imagen original al 20% de su tamaño original. Por lo tanto, crearemos una tupla para las nuevas dimensiones calculando el 20% del ancho original, el 20% de la altura original).

  1. import cv2
    img = cv2.imread('images/deer.JPG')
    percent_of_scaling = 20
    new_width = int(img.shape[1] * percent_of_scaling/100)
    new_height = int(img.shape[0] * percent_of_scaling/100)
    new_dim = (new_width, new_height)
    resized_img = cv2.resize(img, new_dim, interpolation=cv2.INTER_AREA)
    filename="resized_img_aspect ratio.jpg"
    cv2.imwrite(filename, resized_img)
    cv2.imshow("Original Image", img)
    cv2.imshow("Resized Image", resized_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

El código anterior guarda la imagen redimensionada y muestra las imágenes redimensionadas originales.

19874resized20deer-1114087

Bien hecho. Hemos redimensionado nuestra imagen con éxito teniendo en cuenta la relación de aspecto.

2. Sin preservar la relación de aspecto: solo encoger / aumentar el ancho, solo encoger / aumentar la altura

Los pasos para cambiar el tamaño serán los mismos que los anteriores. La única diferencia es que mantenemos cualquiera de las dos dimensiones sin cambios.

  1. import cv2
    img = cv2.imread('images/deer.JPG')
    new_dim = (img.shape[1], 500) # changes height
    resized_img = cv2.resize(img, new_dim, interpolation=cv2.INTER_AREA)
    cv2.imshow("Original Image", img)
    cv2.imshow("Resized Image", resized_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

A continuación se muestran las imágenes que se muestran del código anterior.

75562distorted20deer-6442633

La imagen redimensionada está distorsionada y no es la salida deseada.

3. Cambie tanto el ancho como el alto a valores específicos

  1. importar cv2
  2. img = cv2.imread (‘imágenes / ciervo.JPG’)
  3. new_dim = (450, 450)
  4. resized_img = cv2.resize (img, new_dim, interpolation = cv2.INTER_AREA)
  5. cv2.imshow («Imagen original», img)
  6. cv2.imshow («Imagen redimensionada», resized_img)
  7. cv2.waitKey (0)
  8. cv2.destroyAllWindows ()

A continuación se muestran las imágenes que se muestran del código anterior.

81666specific20resize-5118588

Esto se ve un poco bien, pero no tan bien como la imagen de salida con una relación de aspecto conservada. Por eso prefiero cambiar el tamaño conservando la relación de aspecto.

El siguiente paso es ver cómo crear una marca de agua.

Crear marca de agua usando una imagen

Elegí poner una marca de agua con la imagen de mi nombre. Haz una imagen de tu nombre y pruébalo conmigo.

65473watermark-3243336
Imagen de marca de agua

Pasos para agregar la marca de agua en el centro de una imagen:

Lea y cambie el tamaño de las imágenes (imagen de marca de agua, imagen de entrada) si es necesario.

import cv2
img = cv2.imread('images/deer.JPG')
watermark = cv2.imread("watermark.PNG")

percent_of_scaling = 20
new_width = int(img.shape[1] * percent_of_scaling/100)
new_height = int(img.shape[0] * percent_of_scaling/100)
new_dim = (new_width, new_height)
resized_img = cv2.resize(img, new_dim, interpolation=cv2.INTER_AREA)

wm_scale = 40
wm_width = int(watermark.shape[1] * wm_scale/100)
wm_height = int(watermark.shape[0] * wm_scale/100)
wm_dim = (wm_width, wm_height)
resized_wm = cv2.resize(watermark, wm_dim, interpolation=cv2.INTER_AREA)

Definir el posición del logo de acuerdo con las nuevas dimensiones de la imagen de entrada redimensionada.

h_img, w_img, _ = resized_img.shape
center_y = int(h_img/2)
center_x = int(w_img/2)
h_wm, w_wm, _ = resized_wm.shape
top_y = center_y - int(h_wm/2)
left_x = center_x - int(w_wm/2)
bottom_y = top_y + h_wm
right_x = left_x + w_wm

Consigue el Región rectangular de interés (ROI) y almacenarlo en una variable llamada ‘roi’.

roi = resized_img[top_y:bottom_y, left_x:right_x]

Superponga la marca de agua redimensionada al ROI usando cv2.addWeighted ()y almacenarlo en una variable llamada ‘resultado’.

result = cv2.addWeighted(roi, 1, resized_wm, 0.3, 0)

Ahora, agregue este resultado a la imagen de entrada redimensionada

resized_img[top_y:bottom_y, left_x:right_x] = result

Guarde la imagen resultante con marca de agua en la computadora

filename="watermarked_deer.jpg"
cv2.imwrite(filename, resized_img)

Mostrar la imagen con marca de agua resultante

cv2.imshow("Resized Input Image", resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

¡Tada! A continuación se muestra la imagen con marca de agua resultante.

13873watermarked_deer-3759783

Hasta ahora, aprendimos a poner una marca de agua en una sola imagen. Como nuestro objetivo es marcar con agua varias imágenes, necesitamos crear una lista de todas esas imágenes de entrada y recorrerlas. A continuación se muestran las imágenes que utilizaré.

63013all_images-1359651

Crea una lista de imágenes de entrada

  1. import os
    folderPath = "images"
    imgList = os.listdir(folderPath)
    imgList
61186list20output-3775418

Código para marcar con agua varias imágenes

  1. import cv2
    watermark = cv2.imread("watermark.PNG")
    wm_scale = 40
    wm_width = int(watermark.shape[1] * wm_scale/100)
    wm_height = int(watermark.shape[0] * wm_scale/100)
    wm_dim = (wm_width, wm_height)
    resized_wm = cv2.resize(watermark, wm_dim, interpolation=cv2.INTER_AREA)
    h_wm, w_wm, _ = resized_wm.shape
    
    for image in  imgList:
        img = cv2.imread(f'{folderPath}/{image}')
        percent_of_scaling = 20
        new_width = int(img.shape[1] * percent_of_scaling/100)
        new_height = int(img.shape[0] * percent_of_scaling/100)
        new_dim = (new_width, new_height)
        resized_img = cv2.resize(img, new_dim, interpolation=cv2.INTER_AREA)
        h_img, w_img, _ = resized_img.shape
        center_y = int(h_img/2)
        center_x = int(w_img/2)
        top_y = center_y - int(h_wm/2)
        left_x = center_x - int(w_wm/2)
        bottom_y = top_y + h_wm
        right_x = left_x + w_wm
        roi = resized_img[top_y:bottom_y, left_x:right_x]
        result = cv2.addWeighted(roi, 1, resized_wm, 0.3, 0)
        resized_img[top_y:bottom_y, left_x:right_x] = result
        filename = os.path.basename(image)
        cv2.imwrite("watermarked images/watermarked_"+filename, resized_img)
        cv2.imshow("Watermarked Image", resized_img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
16658watermarked_all-6649323

Finalmente, hemos terminado con la marca de agua en todas las imágenes de entrada.

Notas finales:

Gracias por leer hasta la conclusión. Al final de este artículo, estamos familiarizados con el trabajo en algunas de las operaciones de OpenCV: leer varias imágenes, cambiar el tamaño y agregarles una marca de agua.

Espero que hayas disfrutado leyendo este artículo. Pruébelo por su cuenta y siéntase libre de compartirlo con sus compañeros de estudio.

Referencias:

Documentación de OpenCV

Descargue el archivo de código de este Enlace de repositorio de GitHub.

Otras publicaciones de blog mías

No dude en consultar mis otras publicaciones de blog de mi perfil de DataPeaker.

Puedes encontrarme en LinkedIn, Gorjeo en caso de que desee conectarse. Me encantaría conectarme contigo.

Para un intercambio inmediato de pensamientos, escríbame a [email protected].

Los medios que se muestran en este artículo no son propiedad de DataPeaker y se utilizan a discreción del autor.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.