Обработка фотографий текста
Здесь я предложу несколько вариантов решения этой задачи. Основная проблема фотографий это неравномерность освещенности страницы, когда в центре яркость больше, а по краям меньше, или что-либо подобное. Так же часто необходимо повысить контрастность текста по сравнению со страницей
При обычной коррекции Уровней некоторые части изображения получаются засвечены, а некоторые наоборот слишком тёмные
Все методы более или менее решают эту проблему. В качестве материала для обработки я взял эту страничку(Предварительно обрезав всё лишнее):
В скобках приведены английские названия инструментов, а также использованные в данном случае настройки
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3bjNsSf1CUwTaUsASKyhZjUeCYHOLUgjTLBSXe1AK2AmQbVG_Ii6yc2ELxt4AmQLDAL7M17Ng4iGSnptfZTtlScRfzVP0w1xjcKoRNsTgJ98hPy35dxH8ztkdwzUvkXseTbPvwX_wVlP/s200/2_blur-divide_small.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-RrPPHUPRWJxC_8Yabjx-YZY-wVAwH35I3qJd6NmKhmqYv8Zd7wMJLFECgxUGFGBDEq7L0mRKxux_c61EimD0WOKZmQ5P0u6mB8xPBNzu9BKe4LF9tKyx_k-mb6sVzGepRuIWKZeeDHJo/s200/3_blur-laplace-inverse_small.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxJ6scKDmyRAYqJ2eTbG3iRFLJw0wFnh6t_oxLkqRT_P2se4tCQ72Za3nk91iHXKM7D_jTGigZxhWgpwILdeiM1d3Hxij1WQxg0tu2cUOyh81I85vasCZpOtqydyIaP-qBVDTPJwpP1lbX/s200/3_blur-laplace_small.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDqXiINqVSlPREt-DB62CugBpWbHYrvZW1JNcdzPE5uKpH4CEPWVzNFDuO-IPikt9-Pv_O4pb0DMZUH-JeP0i3kaznTnkJcQekRG37eX76Phm0AL5uWqQO0nJYPS-mmKcBdeqgEWyePqju/s200/4_blur-value_small.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEFpDOvsbPDomfOh3b6DfLIKYifyKrFmA876OhlCGDmwcf-5Owv6QTBH3pCPOpDi3QL3-0hdII_GzhMjkF3F4-Li9p4gWTe5qpmddVVXVTcjaeF8gXoJpx_vC98lS9pSt0UZObA7X3WkPt/s200/im4_small.jpg)
При обычной коррекции Уровней некоторые части изображения получаются засвечены, а некоторые наоборот слишком тёмные
Все методы более или менее решают эту проблему. В качестве материала для обработки я взял эту страничку(Предварительно обрезав всё лишнее):
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiidFYPZb5tENiJsi0ResBzyuVDRysVRU-W3hg7I9cLZOvSZqTDiItsOvJGcuA1P9JzWc7JCt5shxbIE1nzeH5V87CsNW_ItF5gLfLMprxl94An6tfwG1ntbjhHfgn7P2CwdbVSRSdniYee/s200/1_original.jpg)
В скобках приведены английские названия инструментов, а также использованные в данном случае настройки
Метод с делением слоёв
- Создать новый слой с копией изображения
- Размыть новый слой по Гауссу до относительной равномерности, когда текст уже почти не оставляет следов, но разница яркости в углах и центре заметна
(Filters -> Blur -> Gaussian blur: Blur radius - 100) - Назначить режим этого слоя в деление(Layers window: Mode - Divide)
- Свести слои (Layers -> merge)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3bjNsSf1CUwTaUsASKyhZjUeCYHOLUgjTLBSXe1AK2AmQbVG_Ii6yc2ELxt4AmQLDAL7M17Ng4iGSnptfZTtlScRfzVP0w1xjcKoRNsTgJ98hPy35dxH8ztkdwzUvkXseTbPvwX_wVlP/s200/2_blur-divide_small.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoAPlbDdIriprkjosXbZdQoXfl3fnA6zHDhxLoB4o0S01tOnce9hktSW7M2ga9Urlyw7Eoi3z3yVBRWad9z4ljWcKGuwBe9vO_ckN2ULecHPwYVERbQHXTd0ABaK537oPpMzw8JKa6ITvr/s200/2_blur-divide.jpg)
Метод с детектированием краёв
- Размыть фон по гауссу. Подобрать дельту так что бы текст не размывался, Радиус размытия думаю больше 10 ставить не стоит.(Filters - > Blur -> Selective Gaussian blur: Delta - 19; Radius - 15)
- Выделите края настраиваемым методом Лапласа (Filters -> Edge-detect -> Edge...: Algorithm: Laplace; Amount: 2)
- Если хотите, инвертируйте цвет картинки
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-RrPPHUPRWJxC_8Yabjx-YZY-wVAwH35I3qJd6NmKhmqYv8Zd7wMJLFECgxUGFGBDEq7L0mRKxux_c61EimD0WOKZmQ5P0u6mB8xPBNzu9BKe4LF9tKyx_k-mb6sVzGepRuIWKZeeDHJo/s200/3_blur-laplace-inverse_small.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxJ6scKDmyRAYqJ2eTbG3iRFLJw0wFnh6t_oxLkqRT_P2se4tCQ72Za3nk91iHXKM7D_jTGigZxhWgpwILdeiM1d3Hxij1WQxg0tu2cUOyh81I85vasCZpOtqydyIaP-qBVDTPJwpP1lbX/s200/3_blur-laplace_small.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKo2aF4Qd5yndPwSrbHjxNrlYa9isuzx0wXUhYOb1q7xkJmBxA6bcRcT4XiRnqho0QgTjg6HfptSyNfe1J-pOLon9SDRW600RSDnfySliaw22Mqg9woHY4ywQsTaTCSAXCty637nF0Gi5h/s200/3_blur-laplace-inverse.jpg)
Долгий метод с отдельной коррекцией яркости
- Размыть фон по Гауссу. Подобрать дельту так что бы текст не размывался, Радиус размытия думаю больше 10 ставить не стоит.(Filters - > Blur -> Selective Gaussian blur: Delta - 19; Radius - 15)
- Создать новый слой с копией изображения
- Размыть новый слой по Гауссу до относительной равномерности, когда текст уже почти не оставляет следов, но разница яркости в углах и центре заметна (Filters -> Blur -> Gaussian blur: Blur radius - 100) (Filters -> Blur -> Gaussian blur: Blur radius - 100)
- Назначить режим этого слоя в Яркость и поставить плотность 50% (Layers window: Mode - Value; Opacity: 50)
- Свести слои (Layers -> merge)
- Обработайте картинку: Color -> Auto -> Stretch HSV
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDqXiINqVSlPREt-DB62CugBpWbHYrvZW1JNcdzPE5uKpH4CEPWVzNFDuO-IPikt9-Pv_O4pb0DMZUH-JeP0i3kaznTnkJcQekRG37eX76Phm0AL5uWqQO0nJYPS-mmKcBdeqgEWyePqju/s200/4_blur-value_small.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8IkiWALwnlbJoAHkyDHp73OKN2ShrW_uKgVyf-OgGhrczXpakt_rdgThQ70fJQwUXgvtb-jktV_s-U_jg-N9gltyrhGxSEPnlrREhTKoS7cTccgIHtuYsjBMN6vkxp6Tpbhi8C7BhQ5f2/s200/4_blur-value.jpg)
Относительной читабельности можно добиться и с помощью пакета ImageMagic
convert ./1_original.jpg -colorspace gray \( +clone -blur 10x65535 \) -compose subtract -composite -threshold 50% ./im4.jpg![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEFpDOvsbPDomfOh3b6DfLIKYifyKrFmA876OhlCGDmwcf-5Owv6QTBH3pCPOpDi3QL3-0hdII_GzhMjkF3F4-Li9p4gWTe5qpmddVVXVTcjaeF8gXoJpx_vC98lS9pSt0UZObA7X3WkPt/s200/im4_small.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEsTZT6QsPX5bFoWh4Mv95rKuNDho1BkfuPWkNcLQLg3aiKyNx4dmslVQhP0D-i3RNqSObkKiO4g4IqitG5VZUyj4CDuV5ahW-VS2P7uk_G2TuWDj3pJT_g12Tv_YLASzVrikiN2mB_eY8/s200/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)