Как я могу обнаружить увеличенные фотографии?

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

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

Просто чтобы уточнить, вы спрашиваете о полностью автоматическом обнаружении без какой-либо оценки человеческими глазными яблоками?
Для автоматизированного теста stackoverflow, скорее всего, даст вам ответ
@Renan Даже ручной тест с использованием последовательности фильтров GIMP может работать для выборочной проверки изображений конкретного продавца.
Я предполагаю, что вопрос, который мы должны задать, заключается в том, почему вас это волнует? Это имеет большое значение для ответа ...
@JamesSnell Плохие фотографии отпугивают покупателей. См., например , руководство eBay .
Вы можете попробовать преобразовать изображение Фурье и посмотреть на наличие высокочастотных составляющих. Масштабированные изображения не будут содержать много высокочастотных компонентов. Остерегайтесь, однако, что сжатие JPEG также удаляет некоторые из них. Я только что попробовал этот метод, и он кажется довольно чувствительным к уменьшению, а затем увеличению масштаба. Однако для того, чтобы сделать его надежным, потребуется немало усилий.
@tepples - это не объясняет, почему вы заботитесь и от чего вы на самом деле пытаетесь защитить себя, или что вы делаете (и что вы контролируете) - все это то, что нам нужно, чтобы на самом деле дать вам полезный ответ.
@JamesSnell Я предполагаю, что рынок пытается: а) защитить покупателей от необходимости возвращать продукт, размытая фотография которого скрывает существенные недостатки продукта, или б) сохранить согласованность UX от одного списка продуктов к другому. Неважно, играет ли моя личная роль роль продавца, покупателя или рынка, поскольку все три стороны должны знать, какого результата ожидать, когда покупатель сообщает рынку о привычке продавца использовать размытые фотографии.
Тем не менее... создавайте барьеры, ожидайте обхода. Особенно от клиентов.

Ответы (5)

Пусть СОБАКА вынюхивает размытие на фотографиях.

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

Попробуйте найти разницу между изображением и размытой копией самого себя. Если изображение уже размыто, размытие по Гауссу в 1 пиксель не изменит изображение так сильно, как если бы изображение было резким. Таким образом, будет больше различий между четким изображением и размытой версией, чем между размытым изображением и более размытой версией. В компьютерном зрении этот метод называется « разностью гауссианов » (СОС).

  1. Откройте изображение в GIMP или другом многослойном фоторедакторе.
  2. Дублируйте слой.
  3. Примените Gaussian Blur с радиусом 1 пиксель к этому новому слою.
  4. Измените режим слоя на «Разница». Изображение станет черным, кроме краев.
  5. Повторите шаги 1–4 для заведомо резкого изображения аналогичного объекта, композиции и размера.
  6. Сравните интенсивность краев на двух разностных изображениях. Вы можете посмотреть это на глаз или использовать гистограмму.

Я только что попробовал это на фотографии 400x480 пикселей и на той же фотографии, которая была уменьшена до 200x240 (50%), а затем снова увеличена до 400x480 (200%), и края на увеличенной фотографии были заметно тусклее. Это не будет окончательным при легком увеличении, таком как 140%, но оно выявит вопиющие случаи.

Несколько библиотек компьютерного зрения включают средства для вычисления разности гауссиан на изображении. Как и многие графические редакторы изображений. Последние версии GIMP, например. включите макрос DOG , который автоматизирует шаги со 2 по 4: Filters > Edge-Detect > Difference of Gaussians, затем установите радиусы на 1,0 и 0,0.

Связанные вопросы на других сайтах Stack Exchange:

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

  1. Откройте изображение.
  2. Дублируйте слой.
  3. Сместите новый слой на один пиксель вверх или влево.
  4. Измените режим слоя на «Разница».
  5. Ищите образец пустых строк.
Что, если к увеличенному изображению применена очень сильная нерезкая маска?
Нерезкая маска @mattdm увеличивает контрастность, она не создает высокочастотный контент изображения.
@mattdm USM — фильтр с высоким усилением: x + amt*(x - GB(x, r)). Сочетание USM и увеличения увеличит только средние частоты (средние пространственные частоты), а не высокие, потому что высоких не существует. DOG(x, 1, 0) изолирует максимумы.

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

Возможно, можно было бы рассчитать показатель сложности изображения, например оценку энтропии (например, см. https://stackoverflow.com/questions/4935380/get-or-calculate-the-entropy-of-an-image-with -ruby-and-imagemagick ).

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

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

Мне нравится последняя часть — если никто не может сказать, кого это волнует? Напоминает мне этот Xkcd . (Предупреждение: ненормативная лексика.)

На самом деле вы можете

Вам не нужна собака, чтобы понюхать картину. Перейти к:

http://rest7.com/image_upscaled

На этой странице вы можете загрузить свое изображение и получить исходные размеры , например:

{
  "is_upscaled": true,
  "current_width": "2000",
  "current_height": "928",
  "original_width": "1750",
  "original_height": "696",
  "accuracy": "82%",
  "accuracy_width": "82%",
  "accuracy_height": "82%",
  "success": 1
}

Иногда он не угадывает исходное разрешение правильно. Я думаю, это зависит от того, какой алгоритм масштабирования использовался на фотографии. Также я обнаружил, что если фотография была увеличена, а затем сжата в формат JPEG с сильным сжатием (например, 30%), артефакты JPEG затрудняют угадывание этой страницы. Но если ваши фотографии хорошего качества, масштабированные популярными методами (Lanczos, Bilinear), то они должны быть достаточно точными.

Вот 2 примера изображений:

ОРИГИНАЛ

https: // я. куча. изображение . ком / iXYKV.png

(извините, у меня недостаточно репутации, чтобы размещать более 2 ссылок)

УВЕЛИЧЕННОЕ И ОБРЕЗАННОЕ

введите описание изображения здесь

Если вы разместите обрезанное фото, эта страница вернется:

{
  "is_upscaled": true,
  "current_width": "700",
  "current_height": "300",
  "original_width": 352.33333333333,
  "original_height": 151,
  "accuracy": "57%",
  "accuracy_width": "57%",
  "accuracy_height": "57%",
  "cropped": true,
  "success": 1
}

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

Этот сайт будет работать только до тех пор, пока вы можете доверять данным, встроенным в изображение. Но изменить такие данные тривиально легко. И если бы я пытался обмануть рынок за деньги, я бы изменил данные слева направо и в центре.
@PeterM Я не совсем понимаю, что вы имеете в виду. Вы хотите обрезать изображение? Этот сайт по-прежнему обнаружит, что он был увеличен.
Спросите себя, как он узнает, что изображение было обрезано. Как вы думаете, где хранится информация о том, какой был исходный размер изображения?
@PeterM Ну, я не уверен, как именно это работает, но я немного использовал его, и я могу сказать вам, что он анализирует пиксели и определяет исходное разрешение на основе этого. Он анализирует не формат файла, а сами пиксели. Таким образом, исходное разрешение нигде не сохраняется.
@Jack Когда «он анализирует пиксели», он, вероятно, использует что-то вроде DOG.
@DamianYerrick Возможно, но не требует Gimp и меньшего количества ручных щелчков. Можете ли вы оценить, насколько точен ваш метод с DOG?
-1 пока кто-нибудь не скажет мне, что за волшебство происходит, я предполагаю, что невозможно узнать исходный размер изображения, которое было обрезано, масштабировано и отредактировано, а метаданные были удалены или изменены . Выберите здесь «случайное» маленькое изображение и протестируйте его. Я так и сделал, и сайт на самом деле довольно честно сказал "accuracy": "0%"в своем ответе
@RolazaroAzeveires Конечно, он не даст вам размеры исходного изображения до масштабирования и обрезки. Это невозможно. Но он может сказать вам, что изображение было увеличено, даже если вы обрезали изображение. Я обновил свой ответ, чтобы показать вам пример.
Я удалил свой «-1», но это плохой ответ, потому что он основан на «волшебстве».
Основываясь на схожести вычисленных процентов «точности», этот сайт, похоже, использует вариант алгоритма по умолчанию в github.com/0x09/resdet — я говорю это, потому что это число довольно конкретное и представляет собой процент симметричных изменений знака. вокруг заданной строки или столбца в частотной области (что, когда более 50%, является убедительным показателем того, что изображение было увеличено с этого места).

Я бы выбрал гибридный подход. Я думаю, что другие идеи использования разности гауссианов, проверки EXIF ​​или других метаданных или даже БПФ могут быть объединены. Другой, возможно, более простой способ — просто взять каждое изображение, уменьшить его, снова увеличить и сравнить. Если они очень похожи (возможно, с использованием чего-то вроде Delta E ), то вполне вероятно, что они были увеличены (или размыты, как предполагает другой пост). Возможно, вы могли бы установить порог количества пройденных и не пройденных тестов? Если проходит более половины тестов, то это хорошо, в противном случае — плохо, или требуется вмешательство человека для проверки, или что-то в этом роде.

Вы должны быть в состоянии сделать достаточно хорошую работу, частично распаковав сами данные JPEG и проведя некоторый тривиальный подсчет.

Данные JPEG создаются путем выполнения дискретного косинусного преобразования исходных данных изображения, квантования (отбрасывания данных с высоким разрешением), затем прохождения полученного блока DCT по зигзагообразному шаблону и упаковки результирующего потока битов с помощью кодирования Хаффмана.

Если вы измените кодирование Хаффмана и отмените зигзаг, у вас будет ряд блоков DCT 8x8, в которых данные с самой низкой частотой находятся в верхнем левом углу блока, а информация о самой высокой частоте — в правом нижнем углу.

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