Удаление [закрытых] дублирующихся изображений

Тот факт, что вы вызываете этот код из ConsoleApplication, является важным фактором здесь, поскольку любой DependencyObject, Canvas, являющийся одним, должен быть создан в контексте Single Aff Affinity. Вы должны отметить поток Console как STAThread:

[STAThread]
static void Main(string[] args)
{
    StreamReader sr = new StreamReader(@"C:\Users\silviun\Desktop\Canvas.txt");
    XmlReader xmlReader = XmlReader.Create(sr);
    Canvas savedCanvasChildren = (Canvas)XamlReader.Load(xmlReader);
}

Также при проверке Exception проверьте также InnerException, в этом случае оно будет иметь следующее сообщение: «Вызывающий поток должен быть STA, потому что многие компоненты пользовательского интерфейса требуют этого ». что является общей проблемой при работе с WPF.

33
задан Karl Glennon 5 December 2008 в 16:28
поделиться

15 ответов

Недавно я хотел выполнить эту задачу для галереи изображений PHP. Я хотел иметь возможность сгенерировать «нечеткий» отпечаток пальца для загруженного изображения и проверить базу данных на наличие любых изображений с одним и тем же отпечатком пальца, указав, что они похожи, а затем сравнить их более внимательно, чтобы определить, насколько они похожи.

Я добился этого, изменив размер загруженного изображения до 150 пикселей в ширину, уменьшив его до шкалы серого, округлив значение каждого цвета до ближайшего числа, кратного 16 (давая 17 возможных оттенков серого от 0 до 255), нормализовав их и хранить их в массиве, создавая тем самым "нечеткую" цветную гистограмму, а затем создавая md5-сумму гистограммы, которую я затем мог бы искать в своей базе данных. Это было чрезвычайно эффективно для сужения изображений, которые были визуально очень похожи на загруженный файл.

Затем, чтобы сравнить загруженный файл с каждым «похожим» изображением в базе данных, я взял оба изображения, изменил их размер до 16x16, проанализировал их пиксель за пикселем и убрал значение RGB каждого пикселя от значения соответствующего пиксель на другом изображении, сложив все значения вместе и разделив на количество пикселей, что дало мне среднее отклонение цвета. Все, что меньше определенного значения, было признано дубликатом.

Все это написано на PHP с использованием модуля GD, и сравнение с тысячами изображений занимает всего несколько сотен миллисекунд на загруженный файл.

Мой код и методология находятся здесь: http://www.catpa.ws/php-duplicate-image-finder/

21
ответ дан 27 November 2019 в 18:33
поделиться

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

, Возможно, необходимо сгруппировать изображения местоположением, так как это - турист изображения.

-1
ответ дан 27 November 2019 в 18:33
поделиться

Если у Вас есть немного денег для расходов, и возможно после того как Вы выполняете первичную обработку для определения, который изображения , возможно соответствия, Вы могли записать тест для Mechanical Turk Amazon.

https://www.mturk.com/mturk/welcome

По существу, Вы создали бы маленький виджет, который AMT покажет настоящим пользователям - людям, которые должны были бы затем в основном просто ответить на вопрос "Действительно ли эти два изображения, то же?". Или Вы могли показать им, сетка говорит 5x5 изображения и спрашивает их, "Которые из этих изображений соответствуют?". Вы затем собрали бы данные.

Другой подход должен был бы использовать принципы Человеческого Вычисления, которые были наиболее заметно поддержаны Luis Von Ahn ( http://www.cs.cmu.edu/~biglou/ ) с reCaptcha, который использует ответы Капчи для определения нечитабельных слов, которые были выполнены посредством Оптического распознавания символов, таким образом помогая оцифровать книги. Вы могли сделать капчу, которая попросила, чтобы пользователи помогли совершенствовать изображения.

0
ответ дан 27 November 2019 в 18:33
поделиться

Самая важная часть должна сделать файлы сопоставимыми.

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

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

0
ответ дан 27 November 2019 в 18:33
поделиться

Я предположил бы, что самый масштабируемый метод должен будет снабдить цифровой отпечаток каждым изображением. Затем, когда новое изображение добавляется, это - простой случай SELECT id FROM photos where id='uploaded_image_id' для проверки на дубликаты (или берущий отпечатки пальцев у всех изображений, затем делая запрос для дубликата

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

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

Тем не менее Вы можете сходить с рук что-то более простое. Что-то столь же основное как изменение размеров изображения для равенства ширине или высоте, вычитание image_a от image_b, и подведение итогов различия. Если общее различие ниже порога, изображение является дубликатом.

проблема с этим - Вы, должен сравнить каждое изображение с любым. Требуемое время экспоненциально увеличится..

0
ответ дан 27 November 2019 в 18:33
поделиться

Если можно придумать способ сравнить изображения, который повинуется треугольному неравенству (например, если d (a, b) является различием между изображениями a и b, то d (a, b) < d (a, c) + d (b, c) для всего a, b, c), затем Дерево BK было бы эффективным способом индексировать изображения, таким образом, что можно найти соответствия в O (зарегистрируйте n), время вместо O (n) время для каждого изображения.

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

0
ответ дан 27 November 2019 в 18:33
поделиться

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

1
ответ дан 27 November 2019 в 18:33
поделиться

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

0
ответ дан 27 November 2019 в 18:33
поделиться

Подобие изображения является, вероятно, подполем обработки изображений / AI.

быть готовым реализовать алгоритмы/формулы из бумаг, если Вы ищете превосходное (т.е. производительные и масштабируемые) решение.

, Если Вы хотите что-то быстрый n грязный, поисковый Google для Подобие Изображения

, Вот приложение подобия изображения C#, которое могло бы сделать то, что Вы хотите.

В основном, все алгоритмы извлекают и сравнивают функции. То, как они определяют "функцию", зависит от математической модели, на основе которой они.

1
ответ дан 27 November 2019 в 18:33
поделиться

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

поля Even, такие как производитель камер и модель могли использоваться для сокращения ряда 1 000 000 изображений для высказывания 100 наборов 10 000 изображений, существенного улучшения.

1
ответ дан 27 November 2019 в 18:33
поделиться

Это - все еще область исследования, я верю. Если у Вас есть некоторое время в Ваших руках, некоторые соответствующие ключевые слова:

  • обнаружение копии Изображения
  • извлечение изображения На основе содержимого
  • Изображение, индексирующее
  • удаление дубликата Изображения

В основном, каждое изображение обрабатывается (индексированное) для создания "подписи изображения". Подобные изображения имеют подобные подписи. Если Ваши изображения просто повторно масштабируются затем, вероятно, их подпись почти идентична, таким образом, они кластеризируются хорошо. Некоторыми популярными подписями является MPEG 7 дескрипторов. Для кластеризации я думаю, K-средства или любой из его вариантов могут быть достаточно. Однако, вероятно, необходимо иметь дело с миллионами изображений, это может быть проблемой.

Вот ссылка на основную статью в Википедии:
http://en.wikipedia.org/wiki/CBIR

Hope это помогает.

4
ответ дан 27 November 2019 в 18:33
поделиться

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

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

примером простой метрики является среднее значение всех пикселей в изображении, выраженном как единственное полутоновое значение. Это должно работать, только если дубликаты не имели никаких визуальных изменений. Используя формат файла с потерями может также привести к визуальным изменениям.

1
ответ дан 27 November 2019 в 18:33
поделиться

Попробуйте PerceptualDiff за сравнение 2 изображений с теми же размерами. Позволяет threshholds, такому как рассмотрение изображений только с X числами пикселей, отличающихся быть визуально неразличимым.

, Если визуальные дубликаты могут иметь различные размеры из-за масштабирования или различных типов файлов, можно хотеть сделать стандартный формат для сравнений. Например, я мог бы использовать ImageMagick, чтобы масштабировать все изображения к 100x100 и сохранить их как файлы PNG.

5
ответ дан 27 November 2019 в 18:33
поделиться

Очень простой подход следующий:

  • Преобразовывают изображение в шкалу полутонов в памяти, таким образом, каждый пиксель является только числом между 0 (черными цветами) и 255 (белыми) цветами.

  • Масштаб изображение к фиксированному размеру. Открытие правильного размера важно, необходимо играть вокруг с различными размерами. Например, Вы могли масштабировать каждое изображение к 64x64 пикселям, но можно поправиться или худшие результаты или с меньшими или с большими изображениями.

  • , После того как Вы сделали это для всех изображений (да, который будет требовать времени), всегда загружайте два изображения в памяти и вычитайте их друг от друга. Это, вычитают значение пикселя (0,0) в изображении Обь значение пикселя (0,0) в изображении B, теперь сделайте то же для (0,1) в обоих и так далее. Получающееся значение могло бы быть положительным или отрицательным, необходимо всегда хранить абсолютное значение (так 5 результатов в 5,-8 однако результаты в 8).

  • Теперь у Вас есть третье изображение, являющееся "изображением различия" (изображение дельты) изображения A и B. Если они были идентичны, изображение дельты является полностью черным (все значения вычтут для обнуления). "Менее черный" это, менее идентичное, которое изображения. Необходимо найти хороший порог, с тех пор даже если изображения будут на самом деле идентичны (глазам), путем масштабирования, изменения яркости и так далее, то изображение дельты не будет полностью черным, это будет однако иметь только очень темный greytones. Таким образом, Вам нужен порог, который говорит, "Если средняя погрешность (яркость изображения дельты) ниже определенного значения, существует все еще хороший шанс, они могли бы быть идентичными, однако если это выше того значения, они наиболее вероятны нет. Нахождение правильного порога настолько же трудно как находит правильный размер масштабирования. У Вас всегда будут ложные положительные стороны (изображения, которые, как считают, были идентичны, хотя они нисколько не) и ложные отрицательные стороны (изображения, которые, как считают, были не идентичны, хотя они).

Этот алгоритм крайний медленный. На самом деле только создание полутоновых изображений берет уйму времени. Затем необходимо сравнить каждое изображение GS друг с другом один, снова, уйма времени. Также хранение всех изображений GS берет большое дисковое пространство. Таким образом, этот алгоритм очень плох, но результаты не состоят в том что плохо, даже при том, что его настолько просты. В то время как результаты не удивительны, они лучше, чем я первоначально думал.

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

5
ответ дан 27 November 2019 в 18:33
поделиться

На самом деле я написал приложение , которое делает именно это.

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

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

Определенно есть алгоритмы лучше, чем MSE / MAE (фактически, проблемы с этими двумя алгоритмами как применение к визуальной информации было хорошо задокументировано), например SSIM , но за это приходится платить. Другие люди пытаются сравнить другие визуальные качества изображения, такие как яркость, контраст, цветовые гистограммы и т. Д., Но все это дорого стоит по сравнению с простым измерением сигнала ошибки.

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

5
ответ дан 27 November 2019 в 18:33
поделиться
Другие вопросы по тегам:

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