Como faço para escrever um script Perl para filtrar as imagens digitais que tenham sido adulterada?

StackOverflow https://stackoverflow.com/questions/1623057

  •  06-07-2019
  •  | 
  •  

Pergunta

Última noite antes de ir para a cama, eu consultei através da seção Scalar Dados de Aprendizagem Perl novamente e me deparei com a seguinte frase:

a capacidade de ter qualquer caractere em um meio de cordas você pode criar, varredura e manipular dados binários brutos como strings.

Uma idéia imediatamente me bater que eu poderia realmente deixar Perl escanear as imagens que tenho armazenados no meu disco rígido para verificar se eles contêm a string Adobe. Parece, ao fazer isso, eu posso dizer que eles foram photoshopped. Então, eu tentei implementar a ideia e veio com o seguinte código:

#!perl
use autodie;
use strict;
use warnings;

{
    local $/="\n\n";
    my $dir = 'f:/TestPix/';
    my @pix = glob "$dir/*";

    foreach my $file (@pix) {
        open  my $pic,'<',  "$file";

        while(<$pic>) {
            if (/Adobe/) {
                print "$file\n";
            }
        }
    }
}

empolgante, o código parece estar realmente funcionando e ele faz o trabalho de filtrar as imagens que foram photoshopped. Mas o problema é muitas fotos são editados por outros utilitários. Eu acho que eu sou o tipo de preso lá. Temos algumas simples mas o método universal de dizer se uma imagem digital foi editado ou não, algo como

if (!= /the origianl format/) {...}

Ou nós simplesmente temos que adicionar mais condições? como

if (/Adobe/|/ACDSee/|/some other picture editors/)

Todas as ideias sobre isso? Ou eu estou simplificando demais devido ao meu conhecimento de programação miseravelmente limitada?

Obrigado, como sempre, para qualquer orientação.

Foi útil?

Solução

Sua melhor aposta em Perl é provavelmente ExifTool . Isto dá-lhe acesso a qualquer informação não-imagem é incorporada na imagem. No entanto, como outras pessoas disse, é possível retirar esta informação, é claro.

Outras dicas

Eu não vou dizer que não há absolutamente nenhuma maneira de detectar alterações em uma imagem, mas o problema é extremamente difícil.

A única pessoa que eu conheço que alega ter uma resposta é Dr. Neal Krawetz , que reivindicações que digital alteradas partes de uma imagem terá diferentes taxas de erro de compressão das porções originais. Ele afirma que re-salvar um JPEG em diferentes níveis de qualidade irá destacar essas diferenças.

Eu não achei que este seja o caso, nas minhas investigações, mas talvez você pode ter melhores resultados.

No. Não há nenhuma distinção funcional entre uma imagem perfeitamente editado, e que era do jeito que está desde o início - tudo é apenas um saco de pixels, no final, depois de tudo, e quaisquer outros metadados você pode remover ou forjar tudo o que quiser.

O nome dos gráficos programa usado para editar a imagem não é parte do próprio, mas de algo dados de imagem chamados metadados - que pode ser armazenados no arquivo de imagem, mas, como outros já registou , não é nem necessário (para que alguns programas podem não armazená-lo, alguns podem permitir-lhe uma opção de não armazená-lo) nem fiáveis ??-. se você forjou uma imagem, você pode ter forjado os dados de meta bem

Portanto, a resposta à sua pergunta é "não, não há nenhuma maneira de universalmente dizer se o pic foi editado ou não, embora alguns software de edição de imagem pode escrever sua assinatura no ficheiro de imagem e ele vai ser deixado ali por descuido de a pessoa editando.

Se você está inclinado a aprender mais sobre processamento de imagem em Perl, você pode dar uma olhada em alguns dos excelentes módulos CPAN tem para oferecer:

  • Imagem :: Magick - leitura, manipular e gravação de um grande número de formatos de arquivo de imagem
  • GD - criar desenhos de cor usando um grande número de primitivas gráficas, e emitem o desenhos em vários formatos.
  • GD :: Graph - criar gráficos
  • GD :: Graph3d - criar 3D Gráficos com GD e GD :: gráfico

No entanto, existem outros utilitários disponíveis para a identificação de vários formatos de imagem. É mais uma pergunta para Super User , mas por várias distros UNIX você pode usar file para identificar muitos tipos diferentes de arquivos, e para MacOSX, Graphic Converter nunca me decepcionou. (Foi ainda capaz de abrir o arquivo multi-ray X-bizarra de pelve quebradas do meu gato que eu tenho em um disco do veterinário.)

Como é que você sabe o que o formato original? Tenho certeza de que não há nenhuma maneira garantida de saber se uma imagem foi modificada.

Eu posso apenas abrir o arquivo (com a minha linguagem favorita de programação e sistema de arquivos API) e apenas escrever o que eu quiser para esse arquivo à toa. Enquanto eu fazer algo não parafuso com o formato de arquivo, você nunca sabe o que aconteceu.

Heck, eu poderia imprimir o fora imagem e, em seguida, digitalizá-lo de volta; como é que você diga a ele a partir de um original?

Como outros já disse, não há nenhuma maneira de saber se a imagem foi adulterada. Eu estou supondo que você quer basicamente saber é a diferença entre uma fotografia realista e que tem sido melhorado ou modificado.

Há sempre a opção de executar algum algoritmo de reconhecimento de imagem extremamente complexo que iria analisar cada pixel na sua imagem e fazer algumas coisas muito complicado para determinar se a imagem foi adulterada ou não. Esta solução seria provavelmente envolvem AI que iria examinar milhões de fotos que são tanto medicados e aqueles que não são e aprender com eles. No entanto, esta é mais uma solução teórica e não é muito prático ... você provavelmente só vê-lo em filmes. Seria extremamente complexo para desenvolver e provavelmente levar anos. E mesmo se você fez algo parecido com isto para o trabalho, ele provavelmente ainda não seria 100% correto o tempo todo. Eu estou supondo que a tecnologia AI ainda não é a esse nível e pode demorar um pouco até que ele é.

Um recurso não-comumente conhecido de exiftool permite reconhecer o software de origem através de uma análise das tabelas de quantização JPEG (não contando com metadados de imagem). Ele reconhece tabelas escritas por muitas aplicações. Note-se que algumas câmeras podem utilizar as mesmas tabelas de quantização como algumas aplicações, assim que esta não é uma solução 100%, mas vale a pena olhar em. Aqui está um exemplo de exiftool run on duas imagens, o primeiro foi editado por photoshop.

> exiftool -jpegdigest a.jpg b.jpg
======== a.jpg
JPEG Digest                     : Adobe Photoshop, Quality 10
======== b.jpg
JPEG Digest                     : Canon EOS 30D/40D/50D/300D, Normal
    2 image files read

Isto irá funcionar mesmo se os metadados foi removida.

Não é um software existente lá fora, que utiliza várias técnicas (artifacting compressão, comparação de perfis de assinatura em um banco de dados de câmeras, etc.) para analisar os dados de imagem reais para a evidência de alteração. Se você tem acesso a esse tipo de software eo software disponível para você oferece uma API para acesso externo a estas funções de análise, então há uma boa chance de que um módulo Perl existe, que irá interagir com essa API e, caso não exista tal módulo, que podia provavelmente ser criado rapidamente.

Em teoria, seria também possível implementar o código de análise de imagem diretamente no Perl nativa, mas eu não estou ciente de qualquer pessoa ter feito isso e eu espero que você seria melhor fora de escrever algo que de baixo nível e -processador em uma linguagem compilada totalmente (por exemplo, C / C ++) do que em Perl.

http://www.impulseadventure.com/photo/jpeg-snoop.html é uma ferramenta que faz o trabalho quase bom

Caso tenha havido qualquer clonagem, existe uma variação na concentração density..or pixel, que por vezes mostra-se .. mediante inspecção manual de um Photoshop clonado área terá ainda densidade de pixels (o meu significado é variação de Pixels wrt uma imagem digitalizada)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top