¿Cómo escribo un script de Perl para filtrar imágenes digitales que han sido manipuladas?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Anoche, antes de acostarme, volví a examinar la sección de Datos escalares de Learning Perl y encontré la siguiente oración:

  

la capacidad de tener cualquier carácter en una cadena significa que puede crear, escanear y manipular datos binarios en bruto como cadenas.

Se me ocurrió de inmediato que podía dejar que Perl escaneara las imágenes que había almacenado en mi disco duro para comprobar si contenían la cadena Adobe. Parece que al hacerlo, puedo decir cuáles de ellos han sido retocados. Así que intenté implementar la idea y se me ocurrió el siguiente 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";
            }
        }
    }
}

Emocionantemente, el código parece estar realmente funcionando y hace el trabajo de filtrar las imágenes que han sido retocadas. Pero el problema es que muchas imágenes son editadas por otras utilidades. Creo que estoy un poco atrapado allí. ¿Tenemos algún método simple pero universal para saber si una imagen digital ha sido editada o no, algo así como

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

¿O simplemente tenemos que agregar más condiciones? me gusta

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

¿Alguna idea sobre esto? ¿O estoy simplificando demasiado debido a mi conocimiento de programación miserablemente limitado?

Gracias, como siempre, por cualquier orientación.

¿Fue útil?

Solución

Su mejor apuesta en Perl es probablemente ExifTool . Esto le da acceso a cualquier información que no sea de imagen incrustada en la imagen. Sin embargo, como dijeron otras personas, es posible eliminar esta información, por supuesto.

Otros consejos

No voy a decir que no hay absolutamente ninguna manera de detectar alteraciones en una imagen, pero el problema es extremadamente difícil.

La única persona que conozco que dice tener una respuesta es Dr. Neal Krawetz , quien afirma que las partes alteradas digitalmente de una imagen tendrán tasas de error de compresión diferentes de las partes originales. Afirma que volver a guardar un JPEG en diferentes niveles de calidad resaltará estas diferencias.

No he encontrado que este sea el caso, en mis investigaciones, pero quizás podría tener mejores resultados.

No. No hay una distinción funcional entre una imagen perfectamente editada, y una que era como era desde el principio: después de todo, todo es solo una bolsa de píxeles al final, y cualquier otro metadato que pueda eliminar o falsificar todo lo que desee.

El nombre del programa de gráficos utilizado para editar la imagen no es parte de los datos de la imagen en sí, sino de algo llamado metadatos, que puede almacenarse en el archivo de imagen pero, como otros han notado , no es obligatorio (por lo que algunos programas pueden no almacenarlo, algunos pueden permitirle la opción de no almacenarlo) ni confiable; si falsificó una imagen, también podría haber falsificado los metadatos.

Entonces, la respuesta a su pregunta es "no, no hay manera de saber universalmente si la foto fue editada o no, aunque algunos softwares de edición de imágenes pueden escribir su firma en el archivo de imagen y quedará allí por descuido de la persona editora.

Si está dispuesto a aprender más sobre el procesamiento de imágenes en Perl, puede echar un vistazo a algunos de los excelentes módulos que CPAN tiene para ofrecer:

  • Imagen :: Magia - lee, manipula y escribe un gran número de formatos de archivo de imagen
  • GD : cree dibujos en color utilizando una gran cantidad de primitivas gráficas y emita el dibujos en varios formatos.
  • GD :: Graph - crea gráficos
  • GD :: Graph3d - cree gráficos 3D con GD y GD :: Gráfico

Sin embargo, hay otras utilidades disponibles para identificar varios formatos de imagen. Es más una pregunta para Super User , pero para varias distribuciones de Unix puede usar file para identificar muchos tipos diferentes de archivos , y para MacOSX, Graphic Converter nunca me ha decepcionado. (Incluso fue capaz de abrir la extraña radiografía de múltiples archivos de la pelvis destrozada de mi gato que obtuve en un disco del veterinario).

¿Cómo sabrías cuál era el formato original? Estoy bastante seguro de que no hay una forma garantizada de saber si una imagen ha sido modificada.

Simplemente puedo abrir el archivo (con mi lenguaje de programación favorito y la API del sistema de archivos) y simplemente escribir lo que quiera en ese archivo willy-nilly. Mientras no arruine algo con el formato de archivo, nunca sabrás que sucedió.

Diablos, podría imprimir la imagen y luego escanearla nuevamente; ¿Cómo lo distinguirías de un original?

Como han dicho otros, no hay forma de saber si la imagen fue manipulada. Supongo que lo que básicamente quieres saber es la diferencia entre una fotografía realista y una que ha sido mejorada o modificada.

Siempre existe la opción de ejecutar un algoritmo de reconocimiento de imagen extremadamente complejo que analizaría cada píxel en su imagen y haría algunas cosas muy complicadas para determinar si la imagen fue manipulada o no. Esta solución probablemente involucraría IA que examinaría millones de fotos que están alteradas y las que no lo están, y aprendería de ellas. Sin embargo, esta es más una solución teórica y no es muy práctica ... probablemente solo la verías en películas. Sería extremadamente complejo de desarrollar y probablemente llevaría años. E incluso si conseguiste que algo como esto funcionara, probablemente aún no sería 100% correcto todo el tiempo. Supongo que la tecnología de inteligencia artificial todavía no está en ese nivel y podría tomar un tiempo hasta que lo esté.

Una característica no conocida de exiftool le permite reconocer el software de origen a través de un análisis de las tablas de cuantificación JPEG (sin depender de los metadatos de la imagen). Reconoce tablas escritas por muchas aplicaciones. Tenga en cuenta que algunas cámaras pueden usar las mismas tablas de cuantización que algunas aplicaciones, por lo que esta no es una solución al 100%, pero vale la pena analizarla. Aquí hay un ejemplo de exiftool ejecutado en dos imágenes, la primera fue editada 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

Esto funcionará incluso si se han eliminado los metadatos.

Existe un software existente que utiliza varias técnicas (artefactos de compresión, comparación con perfiles de firmas en una base de datos de cámaras, etc.) para analizar los datos reales de la imagen en busca de evidencia de alteración. Si tiene acceso a dicho software y el software que tiene a su disposición proporciona una API para acceso externo a estas funciones de análisis, entonces existe una buena posibilidad de que exista un módulo Perl que interactuará con esa API y, si no existe dicho módulo, podría probablemente se creará con bastante rapidez.

En teoría, también sería posible implementar el código de análisis de imagen directamente en Perl nativo, pero no estoy al tanto de que alguien lo haya hecho y espero que sea mejor que escribas algo de bajo nivel y procesador intensivo en un lenguaje totalmente compilado (por ejemplo, C / C ++) en lugar de en Perl.

http://www.impulseadventure.com/photo/jpeg-snoop.html es una herramienta que hace el trabajo casi bien

Si ha habido alguna clonación, hay una variación en la densidad de píxeles ... o concentración que a veces aparece .. tras una inspección manual un área clonada de Photoshop tendrá una densidad de píxeles uniforme (mi significado es la variación de píxeles con una imagen escaneada)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top