Как я могу распознать немного измененные изображения?

У меня есть очень большая база данных изображений jpeg, приблизительно 2 миллионов. Я хотел бы сделать нечеткий поиск дубликатов среди тех изображений. Дублирующиеся изображения являются двумя изображениями, которые имеют многих (приблизительно половина) их пикселей с идентичными значениями, и остальные выключены приблизительно +/-3 в их значениях R/G/B. Изображения идентичны невооруженному глазу. Это - вид различия, которое Вы получили бы от пересжатия jpeg.

У меня уже есть надежный способ обнаружить, если два изображения идентичны: Я суммирую яркость дельты по всем пикселям и выдерживаю сравнение с порогом. Этот метод доказал, что 100%-я точная, но делающая 1 фотография против 2 миллионов является невероятно медленной (часы на фотографию).

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

21
задан Eyal 30 January 2010 в 18:03
поделиться

5 ответов

Я сомневаюсь, что это означает замену всего, что Флэш способен охватить. Тем не менее, если вы посмотрите вокруг Интернета в настоящее время, вы увидите, что Flash широко используется для доставки видео или аудио контента в браузере. Что-то, что включено в HTML 5, хотя и подорвано сейчас, так как они не смогли договориться о каких-либо стандартных кодеках.

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

Действительно ли это будет смерть Флэша для видео, пока неясно. Проблемы видеокодека HTML 5 могут быть рано или поздно устранены. Однако Flash, скорее всего, останется той средой выбора, где доставщики контента захотят большего контроля над тем, что будет поставляться, DRM и аналогичными методами, & c.

-121--1836509-

Что люди свободно ссылаются на HTML5 в контексте этого обсуждения, так это сочетание HTML в качестве языка разметки, CSS, который указывает, как он визуализируется, и javascript-код, который динамически манипулирует HTML и CSS.

Кроме того, HTML5 имеет не только стандартные текстовые элементы, но и < canvas > , на которых можно рисовать 2d-графику, и < video > элементы, которые встраивают видео (как предполагает название).

Таким образом, в полноценной реализации HTML5 можно реализовать динамические веб-сайты без использования Flash. Примером может служить HTML5 версия Youtube, недавно представленная в качестве бета-версии для пользователей Safari/Chrome, см. здесь . Другой - эмулятор NES в javascript + HTML. (Ну, последнее не очень касается HTML5... используется < холст > .)

-121--1836496-

Посмотрите на О. Чума, Дж. Филбина и А. Циссермана, Обнаружение почти повторяющихся изображений: min-hash и tf-idf weighting , в Трудах британской конференции машинного видения, 2008. Они решают проблему и демонстрируют результаты для 146k изображений. Тем не менее, у меня нет опыта из первых рук с их подходом.

19
ответ дан 29 November 2019 в 21:38
поделиться

Наивная идея: создайте небольшие миниатюры (50x50 пикселей), чтобы найти «Возможно идентичные» изображения, затем увеличить размер миниатюр, чтобы выбросить больше изображений.

3
ответ дан 29 November 2019 в 21:38
поделиться

Также хорошо о хеш от миниатюр: масштабированные дубликаты распознаны (с небольшим модификацией)

1
ответ дан 29 November 2019 в 21:38
поделиться

Я не думаю, что эта проблема может быть решена путем хеширования. Вот трудности: предположим, что у вас есть красный пиксель, и вы хотите 3 и 5, чтобы хэш с одинаковым значением. Ну, тогда вы также хотите 5 и 7 к хэш к тому же значению, а 7 и 9, и так далее ... Вы можете построить цепь, которая говорит, что вы хотите, чтобы все пиксели были к тому же значения.

Вот то, что я бы попробую вместо этого:

  1. построить огромное b-дерево, с 32-подвесной велосот на каждом узле, содержащем все изображения.
  2. Все изображения в дереве являются одинаковым размером, или они не дублирует.
  3. Дайте каждый цветной пиксель уникальный номер, начиная с нуля. В верхнем левом углу может быть пронумерован 0, 1, 2 для компонентов R, G, B, или вам может быть лучше со случайной перестановкой, потому что вы собираетесь сравнивать изображения в порядке этого нумерации.
  4. Внутренний узел на глубине N дискриминирует 32 способа по значению пикселя N, разделенным на 8 (это выталкивает некоторые из шума в близлежащих пикселях.
  5. Узел листьев содержит немного небольшого количества изображений, скажем 10 до 100. Или, может быть, количество изображений - это повышенная функция глубины, так что если у вас есть 500 дубликатов одного изображения, после определенной глубины вы перестаете пытаться отличить их.

Один все два миллиона узлов вставляются в Дерево, два изображения дублируются только в том случае, если они в одном узле. Правильно? Неправильно! Если значение пикселя в двух изображениях составляют 127 и 128, один идет в Overgede 15, а другой идет в Outlede1 На пикселе вы можете вставить это изображение в одну или два детей:

  • для яркости b , вставка в b / 8 , B-3) / 8 , а (B + 3) / 8 . Иногда все 3 будут равны, и всегда 2 из 3 будут равны. Но с вероятностью 3/8 вы дважды количество OutedGes, на которых появляется изображение. В зависимости от того, насколько глубоки у вас могут быть много дополнительных узлов.

Кто-то еще придется сделать математику и посмотреть, если вы должны разделить чем-то более 8, чтобы сохранить изображения от дублирования слишком много. Хорошая новость заключается в том, что даже если истинный вентилятор только около 4 вместо 32, вам нужно только дерево глубиной 10. Четыре дупликации в 10 приходят в 32 миллиона изображений на листьях. Я надеюсь, у вас есть много оперативной памяти в вашем распоряжении! Если нет, вы можете поставить дерево в файловую систему.

Дайте мне знать, как это идет!

1
ответ дан 29 November 2019 в 21:38
поделиться

Основываясь на идее minHash ...

Моя идея состоит в том, чтобы создать 100 справочных таблиц, используя все изображения в базе данных. Справочные таблицы отображают яркость конкретного пикселя в список изображений, которые имеют такую ​​же яркость в том же пикселе. Чтобы найти изображение, просто введите его в хеш-таблицы, получите 100 списков и получите балл за каждое изображение, когда оно появляется в списке. Каждому изображению будет присвоена оценка от 0 до 100. Выигрывает изображение с наибольшим количеством баллов.

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

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

2
ответ дан 29 November 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: