Come faccio a scrivere uno script Perl per filtrare le immagini digitali che sono state modificate?

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

  •  06-07-2019
  •  | 
  •  

Domanda

Ieri sera prima di andare a letto, ho sfogliato di nuovo la sezione Dati scalari di Learning Perl e ho trovato la seguente frase:

  

la possibilità di avere qualsiasi carattere in una stringa significa che puoi creare, scansionare e manipolare dati binari grezzi come stringhe.

Mi è subito venuta l'idea che avrei potuto davvero consentire a Perl di scansionare le immagini che avevo archiviato sul mio disco rigido per verificare se contenessero la stringa Adobe. Sembra che così facendo, posso dire quali di loro sono stati fotografati. Quindi ho cercato di implementare l'idea e ho trovato il seguente codice:

#!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";
            }
        }
    }
}

Sorprendentemente, il codice sembra funzionare davvero e fa il lavoro di filtraggio delle immagini che sono state fotografate. Ma il problema è che molte immagini sono modificate da altre utilità. Penso di essere un po 'bloccato lì. Abbiamo un metodo semplice ma universale per dire se un'immagine digitale è stata modificata o meno, qualcosa come

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

O dobbiamo semplicemente aggiungere più condizioni? come

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

Qualche idea su questo? O sto semplificando eccessivamente a causa della mia conoscenza della programmazione miseramente limitata?

Grazie, come sempre, per qualsiasi consiglio.

È stato utile?

Soluzione

La tua scommessa migliore in Perl è probabilmente ExifTool . Ciò ti dà accesso a qualsiasi informazione non immagine incorporata nell'immagine. Tuttavia, come hanno detto altre persone, è possibile eliminare queste informazioni, ovviamente.

Altri suggerimenti

Non ho intenzione di dire che non c'è assolutamente alcun modo per rilevare alterazioni in un'immagine, ma il problema è estremamente difficile.

L'unica persona che conosco che afferma di avere una risposta è Dr. Neal Krawetz , che afferma che parti modificate digitalmente di un'immagine avranno tassi di errore di compressione diversi dalle porzioni originali. Afferma che il salvataggio di un JPEG a diversi livelli di qualità metterà in evidenza queste differenze.

Non ho trovato questo il caso, nelle mie indagini, ma forse potresti avere risultati migliori.

No. Non esiste una distinzione funzionale tra un'immagine perfettamente modificata e quella che è stata così com'è fin dall'inizio: è tutto solo un sacco di pixel alla fine, dopotutto, e tutti gli altri metadati che è possibile rimuovere o forgiare tutto ciò che si desidera.

Il nome del programma di grafica utilizzato per modificare l'immagine non fa parte dei dati dell'immagine stessa ma di qualcosa chiamato metadati - che può essere memorizzato nel file di immagine ma, come altri hanno notato , non è richiesto (quindi alcuni programmi potrebbero non memorizzarlo, alcuni potrebbero consentirti un'opzione per non memorizzarlo) né affidabile: se hai forgiato un'immagine, potresti aver falsificato anche i metadati.

Quindi la risposta alla tua domanda è "no, non c'è modo di dire universalmente se l'immagine è stata modificata o meno, anche se alcuni software di modifica delle immagini possono scrivere la sua firma nel file immagine e saranno lasciati lì dalla disattenzione della persona che redige.

Se sei propenso a saperne di più sull'elaborazione delle immagini in Perl, potresti dare un'occhiata ad alcuni degli eccellenti moduli che CPAN ha da offrire:

  • Image :: Magick - leggi, manipola e scrivi di un numero elevato dei formati di file immagine
  • GD - crea disegni a colori utilizzando un gran numero di primitive grafiche ed emette il disegni in vari formati.
  • GD :: Graph - crea grafici
  • GD :: Graph3d - crea grafici 3D con GD e GD :: Grafico

Tuttavia, ci sono altre utilità disponibili per identificare vari formati di immagine. È più una domanda per Super User , ma per varie distribuzioni unix puoi usare file per identificare molti diversi tipi di file e per MacOSX, Graphic Converter non mi ha mai deluso. (È stato anche in grado di aprire la bizzarra radiografia multi-file del bacino frantumato del mio gatto che ho ottenuto su un disco dal veterinario.)

Come sapresti qual era il formato originale? Sono abbastanza sicuro che non esiste un modo garantito per dire se un'immagine è stata modificata.

Posso semplicemente aprire il file (con il mio linguaggio di programmazione preferito e l'API del filesystem) e scrivere tutto ciò che voglio in quel file, volenti o nolenti. Fintanto che non rovino qualcosa con il formato del file, non sapresti mai che è successo.

Diamine, potrei stampare l'immagine e poi scansionarla di nuovo dentro; come lo diresti da un originale?

Come altri hanno affermato, non c'è modo di sapere se l'immagine è stata modificata. Immagino che ciò che vuoi sostanzialmente sapere sia la differenza tra una fotografia realistica e una che è stata migliorata o modificata.

C'è sempre la possibilità di eseguire un algoritmo di riconoscimento dell'immagine estremamente complesso che analizzerebbe ogni pixel dell'immagine e farebbe cose molto complicate per determinare se l'immagine è stata modificata o meno. Questa soluzione implicherebbe probabilmente un'intelligenza artificiale che esaminerebbe milioni di foto che sono entrambe sotto controllo e quelle che non lo sono e imparerebbero da esse. Tuttavia, questa è più una soluzione teorica e non è molto pratica ... probabilmente la vedresti solo nei film. Sarebbe estremamente complesso da sviluppare e probabilmente richiederebbe anni. E anche se riuscissi a far funzionare qualcosa del genere, probabilmente non sarebbe sempre corretto al 100%. Immagino che la tecnologia AI non sia ancora a quel livello e potrebbe volerci un po 'prima che lo sia.

Una funzione non nota di exiftool consente di riconoscere il software di origine attraverso un'analisi delle tabelle di quantizzazione JPEG (non basandosi sui metadati delle immagini). Riconosce le tabelle scritte da molte applicazioni. Nota che alcune fotocamere potrebbero utilizzare le stesse tabelle di quantizzazione di alcune applicazioni, quindi questa non è una soluzione al 100%, ma vale la pena esaminarla. Ecco un esempio di exiftool eseguito su due immagini, la prima è stata modificata da 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

Funzionerà anche se i metadati sono stati rimossi.

Esiste un software esistente che utilizza varie tecniche (artefatto da compressione, confronto con i profili delle firme in un database di telecamere, ecc.) per analizzare i dati reali delle immagini per l'evidenza di alterazioni. Se hai accesso a tale software e il software disponibile ti fornisce un'API per l'accesso esterno a queste funzioni di analisi, allora c'è una buona possibilità che esista un modulo Perl che si interfaccia con tale API e, se non esiste tale modulo, potrebbe probabilmente verrà creato piuttosto rapidamente.

In teoria, sarebbe anche possibile implementare il codice di analisi delle immagini direttamente nel Perl nativo, ma non sono a conoscenza di nessuno che lo abbia fatto e mi aspetto che sarebbe meglio scrivere qualcosa di così basso livello e ad alta intensità di processore in un linguaggio completamente compilato (ad esempio, C / C ++) anziché in Perl.

http://www.impulseadventure.com/photo/jpeg-snoop.html è uno strumento che fa quasi bene il lavoro

Se c'è stata qualche clonazione, c'è una variazione nella densità dei pixel ... o concentrazione che a volte si manifesta .. su ispezione manuale un'area clonata di Photoshop avrà persino una densità di pixel (il mio significato è variazione di pixel rispetto a un'immagine acquisita)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top