У меня есть коллекция фотографий в формате JPEG, каждая размером от 500 до 600 пикселей по длинной стороне. Как я могу определить, какие из них были увеличены алгоритмически из значительно меньшей фотографии?
Онлайн-рынок требует, чтобы каждый продавец загружал фотографии продуктов, которые он продает, и эти фотографии должны быть не менее 500 пикселей в ширину или 500 пикселей в высоту, потому что фотографии продуктов с небольшим количеством деталей вызывают у покупателей плохое впечатление. Я уже могу сказать, пытается ли продавец обойти это требование, добавляя однотонную рамку, например, расширяя стандартный белый фон большим количеством белого. Но в последнее время продавцы начали обходить это, масштабируя старые фотографии, сделанные до того, как было опубликовано требование в 500 пикселей. Как определить, были ли увеличены фотографии с интерполяцией ближайшего соседа, билинейной или бикубической интерполяцией?
Если вы собираетесь наказывать за фотографии, увеличенные в цифровом виде, вы также можете наказывать за фотографии не в фокусе. Размытые края и детали в обоих случаях вызывают одинаково неприятные ощущения у зрителей, независимо от того, вызвано ли это маленьким оригиналом или плохой фокусировкой. Что вам нужно сделать, так это обнаружить размытие, то есть отсутствие высоких пространственных частот.
Попробуйте найти разницу между изображением и размытой копией самого себя. Если изображение уже размыто, размытие по Гауссу в 1 пиксель не изменит изображение так сильно, как если бы изображение было резким. Таким образом, будет больше различий между четким изображением и размытой версией, чем между размытым изображением и более размытой версией. В компьютерном зрении этот метод называется « разностью гауссианов » (СОС).
Я только что попробовал это на фотографии 400x480 пикселей и на той же фотографии, которая была уменьшена до 200x240 (50%), а затем снова увеличена до 400x480 (200%), и края на увеличенной фотографии были заметно тусклее. Это не будет окончательным при легком увеличении, таком как 140%, но оно выявит вопиющие случаи.
Несколько библиотек компьютерного зрения включают средства для вычисления разности гауссиан на изображении. Как и многие графические редакторы изображений. Последние версии GIMP, например. включите макрос DOG , который автоматизирует шаги со 2 по 4: Filters > Edge-Detect > Difference of Gaussians, затем установите радиусы на 1,0 и 0,0.
Связанные вопросы на других сайтах Stack Exchange:
DOG не найдет ближайшего соседа, но вы можете сделать это, ища набор строк и столбцов, которые идентичны их ближайшим соседям сверху или слева.
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 ).
Если вы сделаете это для большого количества изображений, вы сможете сгенерировать статистику для всей коллекции. Затем вы можете вручную просмотреть изображения, которые являются выбросами в этой статистике.
К сожалению, это всегда будет приводить к ложным срабатываниям, и изображения, которые были хорошо масштабированы, могут не быть пойманы (но если они хороши, имеет ли это значение?)
Вам не нужна собака, чтобы понюхать картину. Перейти к:
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
}
Таким образом, вы можете видеть, что обнаруженное изображение было увеличено и обрезано. Он не сообщит вам размер исходного изображения перед кадрированием, поскольку просто невозможно получить информацию о том, что было удалено, только из пикселей, которые остались нетронутыми.
"accuracy": "0%"
в своем ответеЯ бы выбрал гибридный подход. Я думаю, что другие идеи использования разности гауссианов, проверки EXIF или других метаданных или даже БПФ могут быть объединены. Другой, возможно, более простой способ — просто взять каждое изображение, уменьшить его, снова увеличить и сравнить. Если они очень похожи (возможно, с использованием чего-то вроде Delta E ), то вполне вероятно, что они были увеличены (или размыты, как предполагает другой пост). Возможно, вы могли бы установить порог количества пройденных и не пройденных тестов? Если проходит более половины тестов, то это хорошо, в противном случае — плохо, или требуется вмешательство человека для проверки, или что-то в этом роде.
Вы должны быть в состоянии сделать достаточно хорошую работу, частично распаковав сами данные JPEG и проведя некоторый тривиальный подсчет.
Данные JPEG создаются путем выполнения дискретного косинусного преобразования исходных данных изображения, квантования (отбрасывания данных с высоким разрешением), затем прохождения полученного блока DCT по зигзагообразному шаблону и упаковки результирующего потока битов с помощью кодирования Хаффмана.
Если вы измените кодирование Хаффмана и отмените зигзаг, у вас будет ряд блоков DCT 8x8, в которых данные с самой низкой частотой находятся в верхнем левом углу блока, а информация о самой высокой частоте — в правом нижнем углу.
Это означает, что вы можете буквально взглянуть на данные в этом промежуточном формате и сказать, были ли они передискретизированы, потому что все блоки 8x8 будут иметь ненулевые значения только в верхнем левом углу (примерно).
свалкаблеск
Ренан Ле Каро
Дамиан Йеррик
Джеймс Снелл
Дамиан Йеррик
Сабольч
Джеймс Снелл
Дамиан Йеррик
взломщик