C # хэширование и поиск изображений - PullRequest
0 голосов
/ 23 января 2010

Сейчас я нахожусь в точке, где я могу преобразовать растровое изображение в байтовые массивы. Предположим, у меня есть 26 изображений, представляющих a-z с 26 соответствующими байтовыми массивами. Учитывая изображение, я хотел бы использовать байтовый массив для мгновенного поиска правильной буквы, а не выполнять до 26 сравнений. Есть ли какой-нибудь способ хэширования байтовых массивов для создания хэш-кода, который можно сохранить в файле конфигурации?

В качестве альтернативы, если есть лучший (более быстрый) подход, чем хеширование изображений (при условии, что у меня нет доступа к основному текстовому представлению), я бы очень хотел узнать о них. Для пояснения предположим, что у меня есть «a.bmp», «b.bmp» и т. Д. Теперь у меня есть неизвестное изображение на экране. Я бы подумал, что хеширование изображения и выполнение одного поиска будет самым быстрым способом для положительной идентификации. Это должно быть быстрее, чем выполнение до 26 отдельных сравнений. Если это предположение неверно, я был бы признателен за описание оптимального метода.

Примечание. Это не классическая проблема с распознаванием текста (распознавание рукописного ввода и т. Д.), Поскольку буквы будут отображаться одинаково каждый раз. Поэтому буква «а» всегда будет давать точно такой же хеш-код

Ответы [ 3 ]

4 голосов
/ 23 января 2010

Вы можете найти алгоритм C # для хэширования массива байтов здесь . Затем вы можете использовать тип данных хеш-таблицы C # для сопоставления хеша с символом. Однако вам все равно нужно будет сканировать каждый байт каждого растрового изображения, поэтому операция - это O (B * N), где B - количество байтов в растровом изображении, а N - количество символов. Не особенно эффективно, учитывая размер типичных растровых изображений.

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

1 голос
/ 23 января 2010

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

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

1 голос
/ 23 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...