Pull to refresh

Comments 34

Интересный алгоритм распознавания цифр
Под цифрами штрих-код — его не проще распознать? :)
Не интересно же! (всё-таки это хаб «ненормальное программирование»)
Человеку надоело вбивать цифры. Он решил их программно распознать, чтоб не мешались :)
Госуслуги? Счет за квартиру? Я просто в Альфа-клике вписываю сумму и все. Можно еще привязать карту и автоматически списывать.
Что-то «Хабр» сглючил, ответил вам чуть ниже комментарием.
Найду распознавалку — попробу. Автору спасибо.
Отлично. Но мой город в «Альфе» в разделе «Другой» и там нет моего ТСЖ размером в один дом. А в «Госуслугам» — есть.
Надо ж такой идее в голову прийти :)

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

Алгоритм интересный, но на словах без кода не очень наглядно получается. Понятно, что по ссылке код можно рассмотреть, но в статье он смотрелся бы органичней, IMHO
Большой он слишком, не хотел захламлять статью :)
UFO just landed and posted this here
Бинаризацию значительно лучше делать не по фиксированному пороговому значению в 75%, а адаптивно:
Прогнать каким-нибудь префильтром, увеличивающим локальную контрастность. — поможет для «шумных» или «темных» изображений (где недостаточна контрастность для разделения);

Считать для каждой точки разность интенсивности до соседей, затем применить пороговое значение к разностям. — поможет для картинок с неравномерной освещенностью;

Из полученнных пикселей составить области «слабой связности», в одну область попадают точки, которые расположены недалеко друг от друга. Каждая область слабой связности состоит из нескольких компонент связности.
Далее, пытаемся распознать каждую компоненту, если она не соответствует никакой цифре, то пытаемся распознать всю область слабой связности, включающую компоненту. — поможет, если пороговый фильтр по какой-то причине выкинул кусок одной цифры, и она разбилась на компоненты.

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

Ну и плюс учитывать начальный поворот изображения (здесь это легко, т.к. при downsampling'е до 32x32 например, должны образоваться линии (из пикселей букв и цифр), поворачиваем картинку так, чтобы они стали горизонтальными).

А так, неплохо, количество переходов — это один из самых простых и надежных топологических признаков изображения.
Бинаризацию значительно лучше делать не по фиксированному пороговому значению в 75%
У меня 75% от среднего цвета. Это адаптивная величина.
Все-таки, ваша бинаризация — это функция вида f(image, threshold(image), mean_intensity(image)),
mean_intensity(x) — зависит от исходной картинки,
threshold(x) = 0.75 — нет, она не адаптивна, и она является параметром метода, а не «служебной константой». Я понимаю, что такой фокус можно применить к любой константе, но в теории обработки изображений это справедливо, т.к. какими бы константы «хорошими» не были, они всегда срезают диапазон успешно распознаваемых изображений.
Да я понимаю, просто пытался на неточность указать.
Да, хорошо, я ее действительно породил.
Посмотрел код, в общем классно, что такие вещи можно на джаваскрипте делать.

У нас подобная система, только ядро на C++, а алгоритмы тяжелые; символы распознаем по дескрипторам Фурье, попробую поэкспериментировать с подобным подходом (посчитать какие-либо топологические признаки). В общем спасибо за пример того, что этот подход может реально работать :)
Проверил на хроме — работает, но только со второго раза — нужно перезагрузить страницу.
Я немного не понял алгоритма подсчетов переходов между черным и белым.
Если смотреть на 6 у вас на картинке, слева от центральной линии:
по линии номер 1 — один переход: от белого к черному.
а вот по линии номер 3 и 4 я насчитал 2 перехода:
сначала от белого к черному, потом обратно.
Поясните, пожалуйста.
Считаются только переходы на чёрный. С чёрного на белый не учитывается.
Тогда справа у шестерки по линиям 1 и 2 будет 0 :-)
Понял, что справа считаются наоборот — от чёрного на белый.
Попозже добавлю в статью.
Да было бы не плохо для жестоко одаренных читателей, вроде меня :-)
Скорректировал.
Не, алгоритм очень интересный, я о таком не слышал. Яростно плюсую!
В стабильной Opera Mobile тоже есть поддержка камеры. Попробовал на своей A501 вашу демку и не смог добиться нормальных результатов — то ли, автофокус не работает из-под браузера, то ли еще чего, но, из-за того, что картинка размытая в верхнем окошке цифры очень сильно исковерканы.
Но, всё равно большое спасибо за статью. И работа с камерой и распознавание на JS — интересный материал.
Как не изощрялся, распознать в Opera Mobile не получилось :)

image
Что-то даже границы цифр не обозначились. Какой метод КАНВАСа, возможно, не работает. Если руки дойдут, посмотрю!
Булка хлеба, колёса, отвертка.
3 часа = 180 минут.
ввести цифры 30 секунд= 180/0,3=600 раз
600 раз/12 месяцев = 50 лет
Профит?
Муравей, челюсти, мощность, командная работа, покорение природы.
300 миллионов лет, эволюция, человек, мозг, умные рассуждения. Смысл?
Клетка, существо, племя, космос. Spore ©
Профит не только в выйгранном этим спобосом времени.
Опыт — он бесценен.
Обожемой, Вы убиваете Кении. Прямо сейчас!
30 секунд = это 0.5, а значит 180/0.5=360.
360/12 = 30 лет, а ведь это совсем другой расклад!

Нет, все-таки Вы неправы, с учетом Вашей ошибки тут есть за что побороться.

p.s. экспа — бесценна! :) Тем более научиться распознавать цифры, придумав свой рабочий алгоритм за три часа :)
UFO just landed and posted this here
Sign up to leave a comment.

Articles