Comments 34
Интересный алгоритм распознавания цифр
0
Под цифрами штрих-код — его не проще распознать? :)
+11
Госуслуги? Счет за квартиру? Я просто в Альфа-клике вписываю сумму и все. Можно еще привязать карту и автоматически списывать.
0
Найду распознавалку — попробу. Автору спасибо.
0
Отлично. Но мой город в «Альфе» в разделе «Другой» и там нет моего ТСЖ размером в один дом. А в «Госуслугам» — есть.
0
Надо ж такой идее в голову прийти :)
Алгоритм интересный, но на словах без кода не очень наглядно получается. Понятно, что по ссылке код можно рассмотреть, но в статье он смотрелся бы органичней, IMHO
Алгоритмы, которые я нашёл в интернете, были очень монструозными, да и переписывать готовое было скучноА вот это еще мягко сказано. Переписывать чужой код, мерзлей занятия не придумаешь.
Алгоритм интересный, но на словах без кода не очень наглядно получается. Понятно, что по ссылке код можно рассмотреть, но в статье он смотрелся бы органичней, IMHO
0
Бинаризацию значительно лучше делать не по фиксированному пороговому значению в 75%, а адаптивно:
Прогнать каким-нибудь префильтром, увеличивающим локальную контрастность. — поможет для «шумных» или «темных» изображений (где недостаточна контрастность для разделения);
Считать для каждой точки разность интенсивности до соседей, затем применить пороговое значение к разностям. — поможет для картинок с неравномерной освещенностью;
Из полученнных пикселей составить области «слабой связности», в одну область попадают точки, которые расположены недалеко друг от друга. Каждая область слабой связности состоит из нескольких компонент связности.
Далее, пытаемся распознать каждую компоненту, если она не соответствует никакой цифре, то пытаемся распознать всю область слабой связности, включающую компоненту. — поможет, если пороговый фильтр по какой-то причине выкинул кусок одной цифры, и она разбилась на компоненты.
Если все равно не удалось распознать, то вероятно пороговым значением было включено слишком много пикселей, и порог нужно немного увеличить (локально, для уже выделенного прямоугольника цифры).
Ну и плюс учитывать начальный поворот изображения (здесь это легко, т.к. при downsampling'е до 32x32 например, должны образоваться линии (из пикселей букв и цифр), поворачиваем картинку так, чтобы они стали горизонтальными).
А так, неплохо, количество переходов — это один из самых простых и надежных топологических признаков изображения.
Прогнать каким-нибудь префильтром, увеличивающим локальную контрастность. — поможет для «шумных» или «темных» изображений (где недостаточна контрастность для разделения);
Считать для каждой точки разность интенсивности до соседей, затем применить пороговое значение к разностям. — поможет для картинок с неравномерной освещенностью;
Из полученнных пикселей составить области «слабой связности», в одну область попадают точки, которые расположены недалеко друг от друга. Каждая область слабой связности состоит из нескольких компонент связности.
Далее, пытаемся распознать каждую компоненту, если она не соответствует никакой цифре, то пытаемся распознать всю область слабой связности, включающую компоненту. — поможет, если пороговый фильтр по какой-то причине выкинул кусок одной цифры, и она разбилась на компоненты.
Если все равно не удалось распознать, то вероятно пороговым значением было включено слишком много пикселей, и порог нужно немного увеличить (локально, для уже выделенного прямоугольника цифры).
Ну и плюс учитывать начальный поворот изображения (здесь это легко, т.к. при downsampling'е до 32x32 например, должны образоваться линии (из пикселей букв и цифр), поворачиваем картинку так, чтобы они стали горизонтальными).
А так, неплохо, количество переходов — это один из самых простых и надежных топологических признаков изображения.
+8
Бинаризацию значительно лучше делать не по фиксированному пороговому значению в 75%У меня 75% от среднего цвета. Это адаптивная величина.
0
Все-таки, ваша бинаризация — это функция вида f(image, threshold(image), mean_intensity(image)),
mean_intensity(x) — зависит от исходной картинки,
threshold(x) = 0.75 — нет, она не адаптивна, и она является параметром метода, а не «служебной константой». Я понимаю, что такой фокус можно применить к любой константе, но в теории обработки изображений это справедливо, т.к. какими бы константы «хорошими» не были, они всегда срезают диапазон успешно распознаваемых изображений.
mean_intensity(x) — зависит от исходной картинки,
threshold(x) = 0.75 — нет, она не адаптивна, и она является параметром метода, а не «служебной константой». Я понимаю, что такой фокус можно применить к любой константе, но в теории обработки изображений это справедливо, т.к. какими бы константы «хорошими» не были, они всегда срезают диапазон успешно распознаваемых изображений.
0
Да я понимаю, просто пытался на неточность указать.
0
Да, хорошо, я ее действительно породил.
Посмотрел код, в общем классно, что такие вещи можно на джаваскрипте делать.
У нас подобная система, только ядро на C++, а алгоритмы тяжелые; символы распознаем по дескрипторам Фурье, попробую поэкспериментировать с подобным подходом (посчитать какие-либо топологические признаки). В общем спасибо за пример того, что этот подход может реально работать :)
Посмотрел код, в общем классно, что такие вещи можно на джаваскрипте делать.
У нас подобная система, только ядро на C++, а алгоритмы тяжелые; символы распознаем по дескрипторам Фурье, попробую поэкспериментировать с подобным подходом (посчитать какие-либо топологические признаки). В общем спасибо за пример того, что этот подход может реально работать :)
+1
Проверил на хроме — работает, но только со второго раза — нужно перезагрузить страницу.
0
Я немного не понял алгоритма подсчетов переходов между черным и белым.
Если смотреть на 6 у вас на картинке, слева от центральной линии:
по линии номер 1 — один переход: от белого к черному.
а вот по линии номер 3 и 4 я насчитал 2 перехода:
сначала от белого к черному, потом обратно.
Поясните, пожалуйста.
Если смотреть на 6 у вас на картинке, слева от центральной линии:
по линии номер 1 — один переход: от белого к черному.
а вот по линии номер 3 и 4 я насчитал 2 перехода:
сначала от белого к черному, потом обратно.
Поясните, пожалуйста.
0
В стабильной Opera Mobile тоже есть поддержка камеры. Попробовал на своей A501 вашу демку и не смог добиться нормальных результатов — то ли, автофокус не работает из-под браузера, то ли еще чего, но, из-за того, что картинка размытая в верхнем окошке цифры очень сильно исковерканы.
Но, всё равно большое спасибо за статью. И работа с камерой и распознавание на JS — интересный материал.
Но, всё равно большое спасибо за статью. И работа с камерой и распознавание на JS — интересный материал.
+1
Мозг!
0
Как не изощрялся, распознать в Opera Mobile не получилось :)
![image](http://img.buratinka.com/images/screenshot133373068.png)
![image](http://img.buratinka.com/images/screenshot133373068.png)
0
Булка хлеба, колёса, отвертка.
3 часа = 180 минут.
ввести цифры 30 секунд= 180/0,3=600 раз
600 раз/12 месяцев = 50 лет
Профит?
3 часа = 180 минут.
ввести цифры 30 секунд= 180/0,3=600 раз
600 раз/12 месяцев = 50 лет
Профит?
-1
Муравей, челюсти, мощность, командная работа, покорение природы.
300 миллионов лет, эволюция, человек, мозг, умные рассуждения. Смысл?
300 миллионов лет, эволюция, человек, мозг, умные рассуждения. Смысл?
-1
Профит не только в выйгранном этим спобосом времени.
Опыт — он бесценен.
Опыт — он бесценен.
+3
Обожемой, Вы убиваете Кении. Прямо сейчас!
30 секунд = это 0.5, а значит 180/0.5=360.
360/12 = 30 лет, а ведь это совсем другой расклад!
Нет, все-таки Вы неправы, с учетом Вашей ошибки тут есть за что побороться.
p.s. экспа — бесценна! :) Тем более научиться распознавать цифры, придумав свой рабочий алгоритм за три часа :)
30 секунд = это 0.5, а значит 180/0.5=360.
360/12 = 30 лет, а ведь это совсем другой расклад!
Нет, все-таки Вы неправы, с учетом Вашей ошибки тут есть за что побороться.
p.s. экспа — бесценна! :) Тем более научиться распознавать цифры, придумав свой рабочий алгоритм за три часа :)
+4
UFO just landed and posted this here
Sign up to leave a comment.
Поддержка камеры и распознавание цифр в браузере «Опера»