Используя C #, как мне искать изображения в файловой системе Windows, как TinEye.com в Интернете? - PullRequest
3 голосов
/ 06 января 2012

Привет и спасибо за поиск!

Обновление

Ради ясности, сторонняя библиотека .NET вполне подойдет.Предпочтительно с открытым исходным кодом или бесплатный.Решение не обязательно должно быть нативным .NET.

Справочная информация

Я работаю над корпоративным веб-приложением, для которого клиент предоставил нам тысячи страниц контента в документах MS Word, которые нам необходимы.анализировать, извлекать данные и отправлять в базу данных контента.

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

Клиент не указал пути кисходное исходное изображение, поэтому, когда мы видим содержимое со встроенным изображением в документе MS Word, нам нужно пройти через несколько папок «активов» и найти соответствующее изображение, которое требует очень много времени.

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

Вопрос

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

TinEye.com делает это через Интернет.Мне интересно, если, используя System.Drawing или что-то еще, мы можем сделать это на ПК с C #.

Спасибо!

Matt

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Ненавижу предлагать ответ на свой вопрос, но я думаю, что я могу кое-что здесь. Вот эвристический / псевдокод для приложения форм C # - ваши мысли приветствуются:

Часть 1

  1. Используя System.IO, просмотрите папки «assets» и получите все изображения.
  2. Для каждого изображения Base64 кодировать его.
  3. Возьмите полученную строку и поместите в файл XML:
<Image>
     <Path>C:\SomePath</Path>
     <EncodedString>[Some Base64 String]<Encoded String>
</Image>

Теперь у нас есть XML-файл, содержащий все оригинальные изображения в форме Base64 вместе с путем к файлу.

часть 2

  1. Используя DocX , извлеките все изображения из MS Word Doc.
  2. Для каждого изображения используйте Linq-to-Xml для поиска точного совпадения в файле XML из части 1.
  3. Если точных совпадений нет, начните итерацию файла XML и вычислите Расстояние Левенштейна .
  4. Находясь в foreach, сохраните идентификатор узла XML (или путь к файлу) и расстояние Левенштейна как пару значений ключа в объекте.
  5. Возьмите пару k / v с наименьшей оценкой LD и верните путь к файлу.
  6. Для производительности установите допуск, чтобы foreach останавливался, если определенное исходное изображение имеет приемлемо низкий показатель LD по сравнению с изображением, извлеченным из документа.

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

UPDATE

Эвристика выше работала прекрасно! В итоге я использовал библиотеку Sift для эффективного вычисления расстояний между строками Base64. В частности, я использовал их метод FastDistance (). Имея 100% точность нахождения нужных мне изображений, даже если угол, под которым была сделана фотография, немного отличается.

0 голосов
/ 06 января 2012

Согласно этому SO-ответу на аналогичный вопрос, вам следует взглянуть на OpenCV и VLFeat.Первый имеет C ++ API, а второй - C API, так что вам нужно написать свою собственную оболочку P / Invoke или, возможно, обернуть их в фасад C ++ / CLI, который можно вызвать из C #.

0 голосов
/ 06 января 2012

В .NET Framework нет встроенного алгоритма для генерации сходства изображений.Вам нужно будет использовать стороннюю библиотеку или сделать это самостоятельно.Много вопросов о сходстве изображений на SO:

Алгоритм поиска похожих изображений

Как измерить сходство между двумя изображениями?

программное сравнение изображений - lib или класс

Еще одна, для .NET: Существуют ли какие-либо библиотеки распознавания изображений OK для .NET? .Этот отсылает вас к AForge , который, кажется, имеет алгоритм, который вы ищете.

...