Выпуск "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 в ЮУрГУ исходник
 

Рейтинг выпуска

 

Рейтинг:

(нет голосов)
 
Для того, чтобы проголосовать за рассылку, Вам необходимо авторизоваться

Дополнительно

 

Для подписки на рассылку введите адрес email и нажмите кнопку "Подписаться".

Адрес email
Нравится   В блог / На сайт В блог / На сайт  Отправить Отправить  Печать Печать  В закладки

Оставить комментарий

 
Для того, чтобы комментировать выпуски рассылки, Вам необходимо авторизоваться

Подписчику

Вы вводите русские буквы
Забыли пароль?

Автору

Забыли пароль?
 
 
 
 
.