Как написать сценарий Perl для фильтрации цифровых фотографий, которые были обработаны? - PullRequest
4 голосов
/ 26 октября 2009

Прошлой ночью, перед тем как лечь спать, я снова просмотрел раздел «Скалярные данные» изучения 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/)

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

Спасибо, как всегда, за любые указания.

Ответы [ 10 ]

8 голосов
/ 26 октября 2009

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

4 голосов
/ 26 октября 2009

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

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

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

3 голосов
/ 26 октября 2009

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

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

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

3 голосов
/ 26 октября 2009

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

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

3 голосов
/ 26 октября 2009

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

1 голос
/ 28 октября 2009

Не очень известная функция 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

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

1 голос
/ 26 октября 2009

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

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

1 голос
/ 26 октября 2009

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

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

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

0 голосов
/ 06 января 2010

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

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

0 голосов
/ 26 октября 2009

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

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

...