Imagens de marca d'água usando OpenCV | Como marcar uma imagem com OpenCV

Conteúdo

Este artigo foi publicado como parte do Data Science Blogathon

Neste artigo, aprenderemos como marcar várias imagens usando OpenCV.

Tópicos para cobrir:

  1. O que é uma marca d'água?
  2. Redimensionar imagens em OpenCV
  3. Criar marca d'água usando uma imagem

1. O que é uma marca d'água?

Uma marca d'água é um logotipo, Empresa, texto ou padrão que é intencionalmente sobreposto em imagens diferentes e é usado para proteger os direitos autorais da imagem.

Seu principal objetivo é promover uma marca e dificultar a cópia ou o uso da imagem original sem a permissão do proprietário..

As organizações profissionais costumam usar marcas d'água para impedir que outras pessoas usem seu conteúdo após hospedá-lo online..

Então, Você já pensou em adicionar uma marca d'água às suas imagens? Nós vamos, eu fiz.

Por exemplo, escrevemos blogs e mencionamos a fonte de imagens externas. Mas, E as imagens que você cria sozinho? Não seria bom deixar sua marca neles?

Viva! Vamos começar esta tarefa emocionante.

2. Redimensionar imagens em OpenCV

Redimensionar nada mais é do que dimensionar a imagem, o que significa redimensionar a imagem original. Podemos aumentar ou diminuir o tamanho da imagem com base nos requisitos de negócios.

O redimensionamento pode ser feito de várias maneiras.

1. Preservar proporção. A proporção de uma imagem é a proporção de sua largura para sua altura.

  • Reduza ou aumente o tamanho da imagem

2. Não preserva a proporção

  • Reduzir apenas a largura / aumentar, encolher altura apenas / aumentar

3. Altere a largura e a altura para valores específicos

Parece ótimo até agora, mas como fazemos isso na prática? A resposta é OpenCV e sua função de redimensionamento (). Leia mais sobre o recurso de redimensionamento do OpenCV neste documentação.

Sintaxe da função Cv2.resize ():
cv2.resize (src, dsize, interpolação)

  • src – imagem de origem
  • dsize: o tamanho desejado da imagem de saída
  • interpolação – Definição da Wikipedia: É um método para construir (achar) novos pontos de dados com base no intervalo de um conjunto discreto de pontos de dados conhecidos.

Confira esta documentação para ler mais sobre sinalizadores de interpolação.

Agora, vamos tirar uma foto de amostra e mudar seu tamanho. Abaixo está a nossa imagem de exemplo.

44364cervo-9418003
Imagem do Autor

Agora, tente exibi-lo usando OpenCV.

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

Abaixo está a aparência de nossa imagem quando exibida usando OpenCV. Como nossa imagem é de alta resolução, apenas parte disso é visível.

79507cervo20; antes de 20 redimensionamento-8155746

Então, definitivamente é necessário redimensioná-lo. Precisamos diminuir seu tamanho.

Etapas para redimensionar uma imagem no OpenCV:

  • Leia a imagem usando cv2.imread ()
  • Defina a nova largura e altura.
  • Crie uma tupla para as novas dimensões
  • Redimensione a imagem usando cv2.resize ()
  • Sim é necessário, salvar imagem redimensionada no computador usando cv2.imwrite ()
  • Mostra as imagens originais, redimensionadas usando cv2.imshow ()

1. Preservar proporção: reduz a escala da imagem para 20% de seu tamanho original.

(Estamos reduzindo o tamanho da imagem original para 20% de seu tamanho original. Portanto, Vamos criar uma tupla para as novas dimensões calculando o 20% da largura original, a 20% da 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, interpolação = cv2.INTER_AREA)
    nome do arquivo ="resized_img_aspect ratio.jpg"
    cv2.imwrite(nome do arquivo, resized_img)
    cv2.imshow("Imagem original", img)
    cv2.imshow("Imagem redimensionada", resized_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

O código acima salva a imagem redimensionada e exibe as imagens redimensionadas originais.

19874resized20deer-1114087

Bem feito. Redimensionamos nossa imagem com sucesso levando em consideração a proporção da imagem.

2. Sem preservar a proporção do aspecto: apenas encolher / aumentar a largura, apenas encolher / aumentar a altura

As etapas para redimensionar serão as mesmas acima. A única diferença é que mantemos qualquer uma das duas dimensões inalteradas.

  1. import cv2
    img = cv2.imread('images / deer.JPG')
    new_dim = (img.shape[1], 500) # muda a altura
    resized_img = cv2.resize(img, new_dim, interpolação = cv2.INTER_AREA)
    cv2.imshow("Imagem original", img)
    cv2.imshow("Imagem redimensionada", resized_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Abaixo estão as fotos mostradas do código acima.

75562distorcida 20deer-6442633

A imagem redimensionada está distorcida e não é a saída desejada.

3. Altere a largura e a altura para valores específicos

  1. import cv2
  2. img = cv2.imread ('imagens / veado.JPG ')
  3. new_dim = (450, 450)
  4. resized_img = cv2.resize (img, new_dim, interpolação = cv2.INTER_AREA)
  5. cv2.imshow (“Imagem original”, img)
  6. cv2.imshow (“Imagen redimensionada”, resized_img)
  7. cv2.waitKey (0)
  8. cv2.destroyAllWindows ()

Abaixo estão as fotos mostradas do código acima.

81666specific20resize-5118588

Isso parece meio legal, mas não tão bom quanto a imagem de saída com uma proporção preservada. É por isso que prefiro redimensionar, preservando a proporção do aspecto.

A próxima etapa é ver como criar uma marca d'água.

Criar marca d'água usando uma imagem

Eu escolhi colocar uma marca d'água com a imagem do meu nome. Faça uma foto do seu nome e experimente comigo.

65473marca d
Imagem de marca d'água

Etapas para adicionar a marca d'água no centro de uma imagem:

Leia e redimensione imagens (imagem de marca d'água, imagem de entrada) Sim é necessário.

import cv2
img = cv2.imread('images / deer.JPG')
marca d'água = 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, interpolação = 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(marca d'água, wm_dim, interpolação = cv2.INTER_AREA)

Defina a posição do logotipo de acordo com as novas dimensões da imagem 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

Pegue o Região retangular de interesse (REI) e armazená-lo em uma variável chamada 'roi'.

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

Sobrepor a marca d'água redimensionada à ROI usando cv2.addWeighted ()e armazená-lo em uma variável chamada 'resultado'.

resultado = cv2.addWeighted(Rei, 1, resized_wm, 0.3, 0)

Agora, adicione este resultado à imagem de entrada redimensionada

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

Salve a imagem de marca d'água resultante em seu computador

nome do arquivo ="watermarked_deer.jpg"
cv2.imwrite(nome do arquivo, resized_img)

Exibir a imagem de marca d'água resultante

cv2.imshow("Imagem de entrada redimensionada", resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Então! Abaixo está a imagem com marca d'água resultante.

13873watermarked_deer-3759783

Até agora, aprendemos como colocar uma marca d'água em uma única imagem. Como nosso objetivo é marcar várias imagens, precisamos criar uma lista de todas as imagens de entrada e percorrê-las. Abaixo estão as fotos que irei usar.

63013all_images-1359651

Crie uma lista de imagens de entrada

  1. importar os
    folderPath = "imagens"
    imgList = os.listdir(folderPath)
    imgList
61186list20output-3775418

Código para marcar várias imagens

  1. import cv2
    marca d'água = 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(marca d'água, wm_dim, interpolação = cv2.INTER_AREA)
    h_wm, w_wm, _ = resized_wm.shape
    
    para imagem em imgList:
        img = cv2.imread(f '{folderPath}/{imagem}')
        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, interpolação = 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]
        resultado = cv2.addWeighted(Rei, 1, resized_wm, 0.3, 0)
        resized_img[top_y:bottom_y, left_x:right_x] = resultado
        filename = os.path.basename(imagem)
        cv2.imwrite("imagens com marca d'água / marca d'água_"+nome do arquivo, resized_img)
        cv2.imshow("Imagem com marca d'água", resized_img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
16658watermarked_all-6649323

Finalmente, terminamos com a marca d'água em todas as imagens de entrada.

Notas finais:

Obrigado por ler até a conclusão. No final deste artigo, estamos familiarizados com o trabalho em algumas das operações OpenCV: ler várias imagens, redimensione e marque-os.

Eu espero que você tenha gostado de ler este artigo. Experimente por conta própria e sinta-se à vontade para compartilhá-lo com seus colegas estudantes..

Referências:

Documentação OpenCV

Baixe o arquivo de código para este Link do repositório GitHub.

Outros posts meus

Sinta-se à vontade para verificar minhas outras postagens do meu perfil do DataPeaker.

Você pode me encontrar em LinkedIn, Twitter no caso de você querer se conectar. Eu adoraria me conectar com você.

Para uma troca imediata de pensamentos, escreva para mim [e-mail protegido].

A mídia mostrada neste artigo não é propriedade da DataPeaker e é usada a critério do autor.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.