Marca d'água invisível

Continuando desse post aqui:

Testei esse programa (é um app Java) sem sucesso, pois o Java instalado aqui é meio antigo.

Alguém conseguiu usar esse app com sucesso? Sigo tentando corrigir o Java aqui, mas esse ambiente é mais complicado que eu imaginei.

Já consegui, mas ainda tá meio gambiarra.

Primeiro, pra quem não tem o último Java instalado, tem a versão Oracle, que pede cadastro, e tem a versão aberta, que pode ser baixada aqui:
https://jdk.java.net/java-se-ri/17

Por hora, eu simplesmente copiei o app java (openstego.jar) pra pasta onde fica o Java acima. O correto seria colocar no Java no Path do windows, mas fiquei com preguiça. Ao rodar o programa você:

  1. Clica em Generate Signature, digita usa palavra passe e grava um arquivo .sig, que é a assinatura a ser colocada no arquivo.
  2. Clica em Embed watermark, seleciona a imagem e assinatura. Note: se vc colocar a extensão .jpg no arquivo de saída, a compressão é bem ruim. Achei melhor não colocar extensão, que gera um arquivo .bmp. Depois converte o arquivo .bmp pra .jpg.

Imagem original:

Imagem assinada, transformada em bmp e reconvertida a jpg no Paint:

Resultado da verificação:

O problema que observei até agora é que basta uma simples inversão da imagem, e a assinatura não é mais detectada.

Não conheço.

A Adobe tem um esquema com a Digimarc, mas nunca testei.
http://payoff.digimarc.com/dgfi-photoshop/index.html

Pelo que pude ver o OpenStego trabalha com dois métodos:

  • sequencia aleatória de substituição do bit menos significativo (LSB). Não vi onde ele faz a substituição. Se é em algum canal RGB ou em canal de luminância. Mas tem de ver se o esquema é robusto a operações simples de edição em imagem como “girar”. As vezes girar em pelo menos 1 grau pode ser o suficiente para que a marca d’agua não seja reconhecida e por consequência não ser possível provar a “origem da imagem”.

  • algoritmo de Dugad’s: esse parece ser mais robusto. Numa pesquisa rápida parece que é baseado em Wavelet. Mais robusto a operações simples.

No meu Mestrado eu desenvolvi um algoritmo no Matlab para introduzir marca d’água digital invisível em imagem colorida , usando Transformada Rápida de Fourier (FFT), para testar a robustez a um ciclo de impressão e digitalização. Foi muito prazeiroso pois consegui estudar assuntos sobre processamento digital de imagem e ainda amarrar um pouco com gerenciamento de cor.

É legal ver iniciativas abertas e simples de marca d’água digital invisível mais acessíveis ao público.

É o problema com algoritmos baseados em substituição no LSB.

Criei uma assinatura simétrica, asdfghjjhgfdsa, e ainda assim não funcionou. A intenção do programinha é boa, mas é muito fácil de se enganar.

A questão não é a assinatura e sim o método de inserção da marca d’água que não é robusto a transformações geométricas e outras operações.

Como o processo de substituição de LSB é simplesmente uma operação direta nos pixel’s da imagem, tem esse detalhe. Por isso, que, outros métodos que utilizam algum tipo de transformada (DST, FFT, Wavelet, etc.), e, fazem alterações nos coeficientes de frequência dessas transformadas, são mais robustos.

Achei meio complicado, preciso de mais tempo para verificar…

Não estressa muito, não. Essa solução é muito frágil. Só funciona se o pirata usar exatamente a mesma foto tirada da sua galeria. Se girar, inverter, diminuir ou qualquer outra operação, a assinatura não é mais lida.

Nenhum desses algoritmos garante nada.

Basta fazer uma série de flips, rotações em valores estranhos , blurs e sharpens que literalmente ferra tudo.
Isso sem contar resize e alterações nas curvas.

O que eu indiquei é bastante fraco, e dá pra quebrar sem precisar de muito.

Mas essas coisas que vc citou normalmente estragam uma foto (ou melhoram, dependendo da foto… :assobi:).

Depende das operações e dos valores aplicados.

Pois é… Logo que li imaginei… “Deve alterar a qualidade da imagem…”
Na realidade a única coisa que prova que a foto é nossa é o arquivo RAW ou JPG original da câmera.
Em casos de pessoas meio toscas, os metadados ajudam.
Mas juridicamente falando, em caso de processo por direitos autorais, a prova cabal é o arquivo original.

Dependendo do método de inserção da marca d’água ,visualmente, a diferença é imperceptível. A questão mesmo é a robustez da marca d’água.

Métodos mais robustos levam em consideração características do SVH (Sistema Visual Humano) para a implementação.

Ou então se você tiver a imagem armazenada em algo tipo o Flicker, que retém a data de upload.

Eu tava pensando aqui.

Um plate solver compara uma série de pontos em uma imagem com uma série de estrelas a fim de identificar a exata posição e rotação da imagem no céu noturno. Fico imaginando se não há como colocar círculos de gradientes espalhados pela imagem, desviando de um valor médio da imagem, que seriam detectados pelo programa de detecção da marca d’água.

Por que gradientes? Porque, como vc disse, basta um blur pra despistar o software. Só que se algo já estiver desfocado, precisa de muito desfoque pra desfigurar completamente. Se aumentar o sharp, os gradientes podem até diminuir, mas a imagem estraga mais rápido que os gradientes somem. Teria que reduzir muito a imagem pra que os círculos desapareçam.

Se o software for capaz de selecionar onde colocar os círculos, a fim de deixá-los discretos, pode ser que dê pra criar um software capaz de identificar a imagem mesmo depois de editada.

Então Felipe, se você pensar em operações que modificam diretamente valor de pixel vai continuar com o mesmo problema. A marca d’água não é robusta. Simples assim.

Por exemplo: você pode aplicar uma FFT (Transformada Rápida de Fourier) um uma imagem colorida em cada canal de cor RGB. Com isso você passa a ter coeficiente de frequência que descrevem a imagem em termos de “textura vamos assim dizer”. De forma bem simplista: coeficientes de alta frequência tem relação com áreas de bastante contraste/textura, coeficientes de baixa frequência tem relação com áreas lisa. Dai é possível escolher uma região específica onde será inserido a marca d’água. Ainda pode-se optar por incluir a marca d’agua apenas no canal azul ou vermelho (já que nosso SVH é mais sensível ao verde).

A marca d’água pode ser um texto, uma imagem, uma sequencia aleatória, não interessa.

Dependendo do método de inserção da marca d’agua, da região escolhida, pode-se selecionar, por exemplo, para alterar apenas coeficientes de magnitude que tenham um determinado valor de patamar acima de outros na região. Isso tudo baseado no SVH. Dai aplica-se a IFFT (Transformada Inversa de Fourier) para refazer a imagem. Dessa forma, mesma com algumas operações geométricas na imagem e até “crop” de uma parte ainda pode ser possível recuperar a marca d’água. A FFT ainda tem um certa robustez contra rotação da imagem.

Citei apenas em FFT, mas existem diversos outros tipos de transformadas (DCT, Wavelet, Haar, etc) que podem ser utilizados e cada uma permite selecionar uma determinada característica da imagem para esconder a informação de marca d’agua.

Algoritmos robustos de inserção de marca d’água digital invisível a olho nu serão “baseados” em algum tipo de transformada. Mas isso é apenas o começo. Ainda tem mais algumas camadas.

:ok:

Não resolveria, e alem disso tambem degradaria a imagem
Qualquer coisa que for inserida na imagem tem como ser distorcida a ponto de não ser mais reconhecida.

Eu sei. O objetivo é que tal coisa, pra ser removida, faça com que a imagem também não seja mais reconhecida. Neste ponto, eu, como autor, deixaria de me preocupar com o uso de minha imagem.

A assinatura visível também degrada a imagem. O objetivo é achar algo que minimize a degradação e maximize a proteção.

Claro. Essa é uma necessidade de mercado que requer uma solução robusta, e não serei eu, em um fórum aberto, sem grande conhecimento sobre o assunto que vou resolver. Mas tem IA, por exemplo. Sei de casos onde IA conseguiu ver correlações onde algoritmos criados por humanos não conseguiram. Voltando lá em cima, deve haver uma equilíbrio entre degradação de imagem e detecção de cópia. Não chegamos lá ainda, mas acho que é questão de refinamento até chegar.