В предыдущем посте я описал рабочий способ нахождения подписи на документе, но в процессе тестирования алгоритм несколько усложнился и из отдельного класса превратился в целое приложение + я добавил веб интерфейс, чтобы можно было со внешней системы делать запрос с адресом скана, а в ответ получать json с результатом. Данный пост описывает модернизацию алгоритма.
Исходный код здесь
Напомню, что передо мной стоит задача, в виде определения наличия или отсутствия подписи на скане документа. Для этого я вставил в документ специальный прямоугольник, в котором нужно расписаться, чтобы подпись была обнаружена:
Поэтому, если не получилось сразу найти подпись имеет смысл преобразовывать изображение перед поиском. По выше написанным причинам приходят на ум три преобразования:Исходный код здесь
Напомню, что передо мной стоит задача, в виде определения наличия или отсутствия подписи на скане документа. Для этого я вставил в документ специальный прямоугольник, в котором нужно расписаться, чтобы подпись была обнаружена:
Затем этот документ сканируется, и ссылка на него отдается в вебсервис. Приложение должно найти место для подписи, определить, есть ли там подпись и вернуть упакованный в json ответ: есть подпись, нет подписи, или не удалось определить.
Модернизация алгоритма
Сначала алгоритм ищет место для подписи. На исходном изображении место для подписи сразу может быть не найдено, это может быть по следующим причинам:
- Документ был слегка повернут при сканировании
- Условия сканирования не обеспечили должные яркость и контраст изображения
- Поворот на небольшой угол влево = L
- Поворот на небольшой угол вправо = R
- Нормализация яркости и контраста изображения = N
- Перевернуть изображение = U
Можно заменить, что все эти преобразования коммутативны. Пусть I - исходное изображение. Тогда поиск разделяется на 4 уровня:
Нулевой уровень: выполняется поиск на исходном изображении I
Первый уровень: выполняется поиск на изображениях после однократного преобразования:
LI, RI, NI, UI
Второй уровень: выполняется поиск на изображениях после двукратного преобразования:
UNI, URI, ULI, NRI, NLI
Третий уровень: выполняется поиск на изображениях после трехкратного преобразования:
UNRI, UNLI
Поиск переходит на каждый следующий уровень только если отсутствует результат поиска на текущем уровне. Как только место для подписи найдется, поиск прекращается, даже если на текущем уровни остались еще изображения.
Для большинства изображений данное улучшение алгоритма не удлиняет время обработки, т.к. обычно место для подписи находится уже на нулевом уровне.
Вторая часть алгоритма осталась без изменений и описана тут
Web приложение
Web приложение позволяет очень просто определить есть ли в документе подпись или нет, нужно просто отправить GET запрос:
http://localhost:8080/signfinder?url=....
В ответ придет json с булевой переменной внутри, которая определяет наличие подписи. Если придет null, значит либо место для подписи не найдено, либо в процессе работы случилась какая-та ошибка.
Итоговое веб приложение имеет 4 настройки: 2 для работы и 2 для отладки
max.deviation.level - уровень среднеквадратичного отклонения цвета пикселей внутри рамки для того, чтобы сказать, что тут подпись есть. По сути это чувствительность датчика подписи.
angle.correction - угол, на который будут поворачивать изображение преобразования L и R.
write.image = true/false - нужно ли записывать преобразованное изображение с обведенным в прямоугольник место для подписи. (для отладки).
write.image.dir - директория для записи отладочных изображений
Чтобы не нагружать код (зрительно), запись отладочных изображений осуществляется аспектом.
Скорость работы алгоритма
Видно, что скорость работы алгоритма зависит от входных данных. Хорошее изображение, где место для подписи найдется на нулевом уровне, на 8-ядерном i7 процессоре 3.4 Ghz, алгоритм обработает за время порядка 100 мс. В худшем случае, если место для подписи не находится и алгоритм вынужден много раз преобразовывать изображение, время обработки приближается к секунде. Скан стандартный примерно 2000 на 3000 точек, jpg, размером порядка мегабайта.
Комментариев нет :
Отправить комментарий