Как реализовать сравнение или распознавание изображений?

Есть много картинок 7px на 14px. На каждой картинке черная цифра на белом фоне. Одинаковые цифры внешне одинаковы, то есть человек глазом не может отличить 9 на одной картинке, от 9 на другой. Всего 10 разных внешне картинок. Получены эти картинки каким-то явно автоматическим способом. Задача - понять, на какой картинке какая цифра.

Первое, что я попробовал - вычислил хеш. Он, к сожалению, видимо из-за каких-то сжатий у картинок с одинаковой цифрой разный.

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

Прошу подсказать мне как это сделать или где можно прочитать о том, как это сделать. Или, возможно, есть решение проще? Может, какие-то линуксовые распознавалки простенькие?
Пользуюсь я php. А картинки тырятся с сайта с помощью curl. Идеальная точность не нужна.

Буду очень благодарен за любые идеи/подсказки.
  • Вопрос задан
  • 4006 просмотров
Решения вопроса 1
@lnked
если есть заданная ширина и высота может попробовать вычислить у каждой цифры 2 - 3 точки и сравнивать по этим точкам, допустим у 9-ки будет 10x12 черным, 20x14 белым а у других нет и сравнивать по цвету этой точки все картинки
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@maxxxixxxx
php.ru/forum/viewtopic.php?t=40513
Распознавание цифр

Самое простое, это написать программу которыя будет закрашивать все не белые цвета в черные, дальше сравнивать попиксельно с шаблонами и самым большим процентом совпадений считать за ответ.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
По хэшам естественно ничего не выйдет - картинки то хоть и одинаковые свиду, но не факт что те же.

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

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

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

Этот метод можно класифицировать как "тупой".

Нейронки (в частности проще всего это будет сделать используя многослойный перцептрон, исходники реализаций которого в сети валяются в достаточном объеме) так же хороши, но для обучения нужна хоть какая-то выборка и еще тестовая выборка цифр. Если у вас их достаточно (хотя бы по 5 штук на цифру) и еще столько же тестовых образов (они должны хоть как-то отличаться) - то без проблем. Алгоритм там довольно простой, хотя объемы теории могут повергнуть в легкий ужас.
Ответ написан
Комментировать
@xandox
 Самый простой способ - для каждой цифры усредняешь картинки (I1 + I2 + ... + In) / n
Потом кросс корреляцией (sum(I1(x, y) * I2(x, y))/sum(I1(x,y))*sum(I2(x,y))) с усредненным значением сравниваешь с проверяемым изображением и какой цифры кроскореляция больше - то скорее всего это она. Но понятно может и ошибаться иногда.
Лучше перед процессингом лучше из 8 бит на канал перевести в float на канал
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы