Comment puis-je écrire un script Perl pour filtrer les images numériques qui ont été falsifiées?

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

  •  06-07-2019
  •  | 
  •  

Question

Hier soir avant d'aller au lit, j'ai parcouru à nouveau la section Données scalaires de Learning Perl et suis tombé sur la phrase suivante:

  

La possibilité d'avoir n'importe quel caractère dans une chaîne signifie que vous pouvez créer, analyser et manipuler des données binaires brutes en tant que chaînes.

Une idée me vint immédiatement que je pourrais laisser Perl balayer les images stockées sur mon disque dur pour vérifier si elles contiennent la chaîne Adobe. Ce faisant, je peux dire lequel d’entre eux a été photographié. J'ai donc essayé d'implémenter cette idée et j'ai créé le code suivant:

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

Chose intéressante, le code semble vraiment fonctionner et permet de filtrer les images ayant fait l'objet d'un photoshopping. Mais le problème est que de nombreuses images sont éditées par d'autres utilitaires. Je pense que je suis un peu coincé là. Avons-nous une méthode simple mais universelle pour savoir si une image numérique a été modifiée ou non, quelque chose comme

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

Ou devons-nous simplement ajouter plus de conditions? comme

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

Des idées à ce sujet? Ou suis-je trop simpliste à cause de mes connaissances lamentablement limitées en programmation?

Merci, comme toujours, pour toute orientation.

Était-ce utile?

La solution

Votre meilleur pari en Perl est probablement ExifTool . Cela vous donne accès à toutes les informations non-image intégrées à l'image. Cependant, comme d'autres l'ont dit, il est possible de supprimer ces informations, bien sûr.

Autres conseils

Je ne vais pas dire qu'il n'y a absolument aucun moyen de détecter les altérations d'une image, mais le problème est extrêmement difficile.

La seule personne que je connaisse qui affirme avoir une réponse est Dr. Neal Krawetz , qui affirme que les parties d'une image modifiées numériquement auront des taux d'erreur de compression différents de ceux des parties d'origine. Il affirme que la ré-enregistrement d'un fichier JPEG à différents niveaux de qualité mettra en évidence ces différences.

Je n’ai pas trouvé cela vrai dans mes enquêtes, mais vous obtiendrez peut-être de meilleurs résultats.

Non. Il n’existe aucune distinction fonctionnelle entre une image parfaitement modifiée et celle qui était telle au début - c’est un sac de pixels à la fin, après tout, et toute autre métadonnée que vous pouvez supprimer ou falsifier à votre guise.

Le nom du programme graphique utilisé pour modifier l'image ne fait pas partie des données de l'image mais de quelque chose appelée métadonnées - pouvant être stockée dans le fichier image mais, comme d'autres l'ont déjà noté , n'est ni nécessaire (certains programmes peuvent ne pas la stocker, d'autres peuvent vous autoriser à ne pas la stocker), ni fiable: si vous avez falsifié une image, vous pourriez également avoir falsifié les métadonnées.

Donc, la réponse à votre question est "non, il n'y a aucun moyen de dire universellement si la photo a été modifiée ou non, bien qu'un logiciel de traitement d'image puisse écrire sa signature dans le fichier image et y rester par négligence. de la personne qui édite.

Si vous souhaitez en savoir plus sur le traitement des images en Perl, vous pouvez consulter quelques-uns des excellents modules proposés par CPAN:

  • Image :: Magick - lire, manipuler et écrire un grand nombre des formats de fichier image
  • GD - créez des dessins en couleur à l'aide d'un grand nombre de primitives graphiques et émettez le dessins dans différents formats.
  • GD :: Graph - créer des graphiques
  • GD :: Graph3d - créez des graphiques 3D avec GD et GD :: Graphique

Cependant, il existe d'autres utilitaires disponibles pour identifier différents formats d'image. Il s’agit plutôt de super utilisateur , mais pour diverses distributions Unix, vous pouvez utiliser fichier pour identifier de nombreux types de fichiers. et pour MacOSX, Graphic Converter ne m'a jamais laissé tomber. (Il a même été capable d’ouvrir la bizarre radiographie multi-fichiers du bassin brisé de mon chat que j’ai eu sur un disque chez le vétérinaire.)

Comment sauriez-vous quel était le format original? Je suis à peu près sûr qu'il n'y a pas de moyen garanti de savoir si une image a été modifiée.

Je peux simplement ouvrir le fichier (avec mon langage de programmation préféré et mon API de système de fichiers) et écrire ce que je veux dans ce fichier, bon gré mal gré. Tant que je ne vis pas avec le format de fichier, vous ne saurez jamais que c'est arrivé.

Heck, je pourrais imprimer l'image puis la numériser à nouveau; comment le diriez-vous d'un original?

Comme d'autres l'ont dit, il n'y a aucun moyen de savoir si l'image a été falsifiée. Je suppose que ce que vous voulez savoir en gros, c’est la différence entre une photo réaliste et une photo améliorée ou modifiée.

Il est toujours possible d'exécuter un algorithme de reconnaissance d'image extrêmement complexe qui analyserait chaque pixel de votre image et effectuerait des opérations très complexes pour déterminer si l'image était falsifiée ou non. Cette solution impliquerait probablement une IA qui examinerait des millions de photos à la fois trafiquées ou non, et en tirerait des leçons. Cependant, il s’agit plus d’une solution théorique et peu pratique ... vous ne la verriez probablement que dans les films. Ce serait extrêmement complexe à développer et prendrait probablement des années. Et même si vous obteniez quelque chose comme ceci pour fonctionner, cela ne serait probablement toujours pas correct à 100% tout le temps. Je suppose que la technologie de l'IA n'est toujours pas à ce niveau et pourrait prendre un certain temps avant de l'être.

Une fonctionnalité peu connue d’exiftool vous permet de reconnaître le logiciel d’origine par le biais d’une analyse des tables de quantification JPEG (ne reposant pas sur des métadonnées d’image). Il reconnaît les tables écrites par de nombreuses applications. Notez que certaines caméras peuvent utiliser les mêmes tables de quantification que certaines applications. Ce n'est donc pas une solution à 100%, mais il vaut la peine de s'y intéresser. Voici un exemple d’exiftool exécuté sur deux images, la première a été modifiée par 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

Cela fonctionnera même si les métadonnées ont été supprimées.

Il existe un logiciel qui utilise diverses techniques (artefact de compression, comparaison aux profils de signature dans une base de données de caméras, etc.) pour analyser les données d'image réelles afin de détecter toute altération. Si vous avez accès à un tel logiciel et que le logiciel à votre disposition fournit une API pour un accès externe à ces fonctions d'analyse, il existe alors une bonne chance qu'il existe un module Perl assurant l'interface avec cette API et, si aucun module n'existe, il pourrait probablement être créé assez rapidement.

En théorie, il serait également possible d'appliquer le code d'analyse d'image directement en Perl natif, mais je ne suis au courant de personne qui l'ait fait et je m'attends à ce que vous fassiez mieux d'écrire quelque chose d'aussi bas beaucoup de ressources en processeur dans un langage entièrement compilé (par exemple, C / C ++) plutôt qu'en Perl.

http://www.impulseadventure.com/photo/jpeg-snoop.html est un outil qui fait le travail presque bien

S'il y a eu un clonage, il y a une variation de la densité de pixels..ou de la concentration qui apparaît parfois .. lors d'une inspection manuelle une zone clonée de Photoshop aura une densité de pixels régulière (ma signification est une variation de Pixels par rapport à une image numérisée)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top