Как я могу обнаружить увеличенные фотографии? - Фотопедия
7 голосов
/ 12 февраля 2015

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

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

Ответы [ 5 ]

8 голосов
/ 13 февраля 2015

Сделайте так, чтобы СОБАКА обнаружила размытость на фотографиях.

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

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

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

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

Несколько библиотек компьютерного зрения включают средства для вычисления разности гауссиан на изображении. Как и многие графические редакторы изображений. Последние версии GIMP, например. включите макрос DOG , который автоматизирует шаги 2–4: «Фильтры»> «Обнаружение краев»> «Разница по Гауссу», затем установите радиусы на 1,0 и 0,0.

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

СОБАКА не будет ловить ближайшего соседа, но вы можете сделать это, ища образец строк и столбцов, которые идентичны их непосредственному соседу вверху или влево.

  1. Откройте изображение.
  2. Дублируйте слой.
  3. Смещение нового слоя на один пиксель вверх или влево.
  4. Измените режим слоя на «Разница».
  5. Найдите шаблон пустых строк.
1 голос
/ 12 февраля 2015

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

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

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

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

0 голосов
/ 18 июня 2017

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

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

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

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

0 голосов
/ 17 июня 2017

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

0 голосов
/ 17 июня 2017

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

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

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 примера изображения:

ORIGINAL

https: // i. стек. imgur. com / iXYKV.png

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

UPSCALED & CROPPED

enter image description here

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

{
  "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
}

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

...