Pull to refresh

Обработка фотографий текста с помощью Gimp

Lumber room
Здесь я предложу несколько вариантов решения этой задачи. Основная проблема фотографий это неравномерность освещенности страницы, когда в центре яркость больше, а по краям меньше или что-либо подобное. Так же часто необходимо повысить контрастность текста по сравнению со страницей. При обычной коррекции Уровней некоторые части изображения получаются засвечены, а некоторые наоборот слишком тёмные. Все методы более или менее решают эти проблемы.

В качестве материала для обработки я взял эту страничку(Предварительно обрезав всё лишнее):

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

Метод с делением слоёв

  1. Создать новый слой с копией изображения
  2. Размыть новый слой по Гауссу до относительной равномерности, когда текст уже почти не оставляет следов, но разница яркости в углах и центре заметна
    (Filters -> Blur -> Gaussian blur: Blur radius — 100)
  3. Назначить режим этого слоя в деление(Layers window: Mode — Divide)
  4. Свести слои (Layers -> merge)



Метод с детектированием краёв

  1. Размыть фон по гауссу. Подобрать дельту так что бы текст не размывался, Радиус размытия думаю больше 10 ставить не стоит.(Filters — > Blur -> Selective Gaussian blur: Delta — 19; Radius — 15)
  2. Выделите края настраиваемым методом Лапласа (Filters -> Edge-detect -> Edge...: Algorithm: Laplace; Amount: 2)
  3. Если хотите, инвертируйте цвет картинки




Долгий метод с отдельной коррекцией яркости

  1. Размыть фон по Гауссу. Подобрать дельту так что бы текст не размывался, Радиус размытия думаю больше 10 ставить не стоит.(Filters — > Blur -> Selective Gaussian blur: Delta — 19; Radius — 15)
  2. Создать новый слой с копией изображения
  3. Размыть новый слой по Гауссу до относительной равномерности, когда текст уже почти не оставляет следов, но разница яркости в углах и центре заметна (Filters -> Blur -> Gaussian blur: Blur radius — 100)(Filters -> Blur -> Gaussian blur: Blur radius — 100)
  4. Назначить режим этого слоя в Яркость и поставить плотность 50% (Layers window: Mode — Value; Opacity: 50)
  5. Свести слои (Layers -> merge)
  6. Обработайте картинку: Color -> Auto -> Stretch HSV



Относительной читабельности можно добиться и с помощью пакета ImageMagic

(Никакого отношения к GIMP не имеет, просто альтернатива)
convert ./1_original.jpg -colorspace gray \( +clone -blur 10x65535 \) -compose subtract -composite -threshold 50% ./im4.jpg



Автоматизация

Murkt разобрался в Python-Fu и написал скрипт которым можно это всё автоматизировать. Пишем в консоль(Filters -> Python-Fu -> Console) следующее:
from gimpfu import *

def textify_divide(img):
   ly2 = img.active_layer.copy()
   img.add_layer(ly2)
   pdb.plug_in_gauss_rle(img, ly2, 100, 1, 1)
   ly2.mode = DIVIDE_MODE
   img.flatten()

def textify_edges(img, radius=10, max_delta=25, amount=2):
   ly = pdb.gimp_image_get_active_layer(img)
   pdb.plug_in_sel_gauss(img, ly, radius, max_delta)
   pdb.plug_in_edge(img, ly, amount, 1, 5)
   pdb.gimp_invert(ly)

Теперь можно из этой же консоли обработать все открытые изображения с помощью команды:
[textify_edges(x) for x in gimp.image_list()]

Еще можно попытаться использовать прочие возможности Python-Fu, как открытие файлов и т.п.:
image = pdb.file_jpeg_load(filename, raw_filename)
image = pdb.file_png_load(filename, raw_filename)
Tags:
Hubs:
Total votes 23: ↑23 and ↓0 +23
Views 8K
Comments Comments 4

Please pay attention