Как сделать изображение равномерной яркости (используя Python/PIL)
Я хочу сделать снимок документа, который был сфотографирован, и сделать так, чтобы он был отсканирован. Так как сканер будет помещать постоянный источник света по всему документу, я хочу добиться такого эффекта на фотографии документа. Желаемый эффект будет состоять в том, чтобы удалить любые тени или области при слабом освещении (или, по крайней мере, сделать их менее заметными) и сделать всю фотографию довольно яркой.
Моей первой мыслью было бы найти самую яркую часть целевого изображения, и они сделали все изображение такой яркостью. Предполагая, что это даже правильный алгоритм, как бы я сделал это в PIL? Есть ли метод получения яркости? так далее?
(Это продолжение предыдущего вопроса.)
4 ответа
В качестве первой попытки попробуйте установить пороговое изображение. Темные области становятся черными, светлые области становятся белыми. Я не использовал PIL, но я думаю, что есть простой способ сделать это.
Попробуйте ImageChops.screen(image1, image2) с 2 копиями изображения. Если это неудовлетворительно, попробуйте некоторые другие функции в модуле ImageChops.
Кроме того, вы можете сначала преобразовать его в оттенки серого: ImageOps.grayscale(изображение).
Какой тип изображения? Если он должен быть идеально чисто черно-белым, как с текстовыми страницами, то ваши необработанные данные, вероятно, являются чем-то вроде градаций серого с различными уровнями не совсем черных букв. Пороговое значение относительно константы может дать хорошие результаты, но не в том случае, если освещение слишком неравномерно или мешает блики объектива. Пороговое изображение против сглаженной версии себя. Сгладьте его, используя PIL_usm.gblur(изображение, радиус), где радиус (в пикселях) - это что-то вроде десяти, двадцати или некоторого значения, сопоставимого с шириной элементов букв. Быстрый хак-код из старых заметок только для иллюстрации:
import Image
import PIL_usm
# see http://www.cazabon.com/pyCMS/PIL_usm.html for PIL_usm
img = Image.open(...)
sm = PIL_usm(img, 10)
thr = Image.ImageChops.subtract(img,sm, .001, 128)
# or whatever works 4u...
OTOH, если в этих документах есть фотографии или другая не двухуровневая графика, вам нужно быть более умным.
Сначала попробуйте вручную в программе для редактирования изображений, например, GIMP. Я думаю, что вы ищете регулировку яркости и контрастности.