Выпуск "Delphi FAQ - сам себе программист" рассылки "Delphi FAQ - сам себе программист" от 03 октября 2010 года
| Давно не доходили руки до написания того, чего хочется и выпуска рассылки... Но
вот оно появилось - предлагаю вашему вниманию... Есть множество фотографий
(5мп), каждая сождержит одну страницу текста, или две. Освещение при фотографировании было неравномерное, поскольку снималось в библиотеке. Как повысить читаемость текста? Немного поискав, я обнаружил следующие методы, которые меня заинтересовали. Метод 1 - с использованием Gimp 1. Создаём копию слоя 2. Размываем её до исчезновения текста (Gaussian Blur, radius=50, delta=237 - как пример) 3. Устанавливаем режим отображения текста "Деление" Что мы видим? Довольно хорошее изображение. Метод 2 - с использованием PIL 1. Копию загруженного изображения размываем, также - до исчезновения текста 2. Вычитаем исходное изображение из размытого 3. Убиваем "призраков" - едва провечивающий текст с обратной стороны 4. Инвертируем полученнй результат Результат аналогичен тому, что получен в Gimp-е. Единственное, что остаётся в обеих методах - это несколько "тонкие" символы. Не беда, с помощью PIL сделаем текст потемнее. Сначала посмотрим, что нам покажет гистограмма. В моём случае, большую часть изображения делят между собой белые пикселы (255), и находящиеся в пределах от 40 до 225. В этих пределах и оказываются символы. Первая мысль - сдвинуть их яркости вниз, на те же 40 уровней. Или разделить их значения на какое-нибудь число. Надо экспериментировать. Для размытия я использовал следующие действия: Import Image, ImageFilter img1 = Image.open('/home/maxim/AiT/DSCN0014.JPG').convert('L') im1 = img1.filter(ImageFilter.MedianFilter(17)) #1 im1 = im1.filter(ImageFilter.MinFilter(3)) #2 im1 = im1.filter(ImageFilter.MaxFilter(17)) #3 Как видно из кода, сначала применён медианный фильтр (#1) - он применялся к квадратом со стороной 17 точек, затем фильтр(#2), присваивающией точке самую тёмное значение из окрестности, далее - максимальное (#3) значение по квадрату со стороной 17. Эти значения получены экспериментально, меньшие - давали не очень хороший результат. Фильтр 2 убирает слишком яркие точки, фильтр 3 - окончательно убирает остатки текста, равняя его на фон. Метод 3 - использовать порог Просто, все точки светлее определённого значения сделать белыми. Метод не очень удобен, так освещение часто неравномерное - остаются фрагменты фона по углам. Что было написано... Программа принимает два параметра - первый указывает папку с изображениями, второй - тип файла, в который будут сохранены результаты работы. После того, как получен список файлов (у меня jpg, поэтому особо не заморачивался и пропустил только их), каждый файл открывается, получается картинка с размазанным текстом, происходит вычитание, очистка от незначительных "призраков", инвертирование и сохранение. После этого по списку новых файлов пробегаемся программой cuneiform - это линуксовая распознавалка текста, существует версия и для windows. Она принимает только bmp-шки, поэтому второй параметр запуска моей программы - bmp. Исходник комментировать было некогда, но там вроде бы всё понятно... Если вы есть в "контакте" - то обсудить эту задачу можно там Группа *nix в ЮУрГУ исходник |
Рейтинг выпуска
Еще в этой рассылке
Соседние выпуски:
- →Delphi FAQ - сам себе программист (11.11.11)
- →Delphi FAQ - сам себе программист (03.10.10)
- →Delphi FAQ - сам себе программист (20.04.10)
- →Delphi FAQ - сам себе программист (07.12.09)
