Как мне написать скрипт на Perl для фильтрации цифровых изображений, которые были подделаны?

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Прошлой ночью, перед тем как лечь спать, я снова просмотрел раздел скалярных данных Learning Perl и наткнулся на следующее предложение:

возможность использования любого символа в строке означает, что вы можете создавать, сканировать и манипулировать необработанными двоичными данными в виде строк.

Мне сразу пришла в голову идея, что я мог бы позволить Perl сканировать изображения, которые я сохранил на своем жестком диске, чтобы проверить, содержат ли они строку Adobe.Кажется, поступая таким образом, я могу определить, какие из них были отфотошоплены.Итак, я попытался реализовать эту идею и придумал следующий код:

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

Интересно, что код, похоже, действительно работает, и он выполняет работу по фильтрации изображений, которые были отфотошоплены.Но проблема в том, что многие изображения редактируются другими утилитами.Мне кажется, я там как бы застрял.Есть ли у нас какой-нибудь простой, но универсальный метод определить, было ли отредактировано цифровое изображение или нет, что-то вроде

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

Или мы просто должны добавить больше условий?Нравится

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

Есть какие-нибудь идеи по этому поводу?Или я слишком упрощаю из-за своих крайне ограниченных знаний в программировании?

Спасибо, как всегда, за любые рекомендации.

Это было полезно?

Решение

Лучшая ставка в Perl - ExifTool . Это дает вам доступ к любой информации, не относящейся к изображению, встроенной в изображение. Однако, как говорили другие люди, эту информацию, конечно, можно убрать.

Другие советы

Я не собираюсь говорить, что нет абсолютно никакого способа обнаружить изменения в изображении, но проблема чрезвычайно сложна.

Единственный известный мне человек, который утверждает, что у него есть ответ, это доктор. Нил Кравец , утверждающий, что измененные цифровым способом части изображения будут отличаться частотой ошибок сжатия от исходных частей. Он утверждает, что повторное сохранение JPEG с различными уровнями качества будет подчеркивать эти различия.

Я не обнаружил, что это имеет место в моих расследованиях, но, возможно, у вас могут быть лучшие результаты.

Нет.Нет функционального различия между идеально отредактированным изображением и тем, которое было таким, какое оно есть с самого начала - в конце концов, это всего лишь набор пикселей и любые другие метаданные, которые вы можете удалить или подделать по своему усмотрению.

Название графической программы, используемой для редактирования изображения, является частью не самих данных изображения , а так называемых метаданных, которые мочь должен храниться в файле изображения, но, как отмечали другие, не является ни обязательным (поэтому некоторые программы могут не сохранять его, некоторые могут разрешить вам не сохранять его), ни надежным - если вы подделали изображение, вы, возможно, подделали и метаданные.

Итак, ответ на ваш вопрос таков: "нет, нет способа универсально определить, была ли фотография отредактирована или нет, хотя некоторые программы для редактирования изображений могут записать свою подпись в файл изображения, и она будет оставлена там по неосторожности редактирующего лица.

Если вы хотите узнать больше об обработке изображений в Perl, вы могли бы взглянуть на некоторые из отличных модулей, которые может предложить CPAN:

  • Изображение:: Магия - чтение, манипулирование и запись большого количества форматов файлов изображений
  • Б - г - создавайте цветные рисунки, используя большое количество графических примитивов, и выдавайте рисунки в различных форматах.
  • GD:: График - создание диаграмм
  • GD::Graph3d - создание 3D-графиков с помощью GD и GD::Graph

Однако существуют и другие утилиты, доступные для идентификации различных форматов изображений.Это скорее вопрос для Суперпользователь, но для различных дистрибутивов unix вы можете использовать file для идентификации множества различных типов файлов, а также для MacOSX, Графический Конвертер никогда не подводил меня.(Он даже смог открыть причудливый многофайловый рентгеновский снимок раздробленного таза моей кошки, который я получил на диске от ветеринара.)

Как вы узнали, что это был за оригинальный формат? Я уверен, что нет гарантированного способа узнать, было ли изображение изменено.

Я могу просто открыть файл (с помощью моего любимого языка программирования и API файловой системы) и просто написать все, что захочу, в этот файл. Пока я не напортачу с форматом файла, вы никогда не узнаете, что это произошло.

Черт, я могу распечатать изображение, а затем отсканировать его обратно; как бы вы сказали это по оригиналу?

Как уже говорили другие, нет никакого способа узнать, было ли изображение подправлено. Я предполагаю, что вам нужно знать разницу между реалистичной фотографией и фотографией, которая была улучшена или изменена.

Всегда есть возможность запустить какой-нибудь чрезвычайно сложный алгоритм распознавания изображений, который проанализирует каждый пиксель в вашем изображении и сделает несколько очень сложных вещей, чтобы определить, было ли изображение подправлено или нет. Это решение, вероятно, будет включать в себя ИИ, который будет проверять миллионы фотографий, которые подделаны, и те, которые нет, и учиться на них. Тем не менее, это скорее теоретическое решение и не очень практичное ... вы, вероятно, увидите это только в кино. Это было бы чрезвычайно сложно для разработки и, вероятно, займет годы. И даже если бы вы сделали что-то подобное, это, вероятно, все равно не будет на 100% правильным все время. Я предполагаю, что технология ИИ все еще не на этом уровне и может занять некоторое время, пока это не так.

Не очень известная функция exiftool позволяет распознавать исходное программное обеспечение посредством анализа таблиц квантования JPEG (не полагаясь на метаданные изображения). Он распознает таблицы, написанные многими приложениями. Обратите внимание, что некоторые камеры могут использовать те же таблицы квантования, что и некоторые приложения, поэтому это не 100% -ное решение, но его стоит рассмотреть. Вот пример запуска exiftool на двух изображениях, первое было отредактировано 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

Это будет работать, даже если метаданные были удалены.

Существует существующее программное обеспечение, которое использует различные методы (создание артефактов сжатия, сравнение с профилями сигнатур в базе данных камер и т. д.) для анализа фактических данных изображения на наличие признаков изменения. Если у вас есть доступ к такому программному обеспечению, и программное обеспечение, которое вам доступно, предоставляет API для внешнего доступа к этим функциям анализа, то есть неплохой шанс, что существует модуль Perl, который будет взаимодействовать с этим API и, если такого модуля не существует, он мог бы вероятно, будет создан довольно быстро.

Теоретически, было бы также возможно реализовать код анализа изображений непосредственно на родном Perl, но я не знаю, кто бы это сделал, и я надеюсь, что вам лучше написать что-то такое низкое и интенсивно использует процессор в полностью скомпилированном языке (например, C / C ++), а не в Perl.

http://www.impulseadventure.com/photo/jpeg-snoop.html это инструмент, который делает работу почти хорошо

Если было какое-либо клонирование, то есть изменение в плотности пикселей .. или концентрация, которая иногда обнаруживается .. при ручной проверке клонированная область Photoshop будет иметь равномерную плотность пикселей (я имею в виду изменение пикселей по отношению к отсканированному изображению)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top