如何使图像亮度均匀(使用 Python/PIL)

Posted

技术标签:

【中文标题】如何使图像亮度均匀(使用 Python/PIL)【英文标题】:How to Make an Image Uniform Brightness (using Python/PIL) 【发布时间】:2010-10-14 11:11:24 【问题描述】:

我想为已拍摄的文档拍摄图像,并使其看起来像是经过扫描的。由于扫描仪会在整个文档上放置一个恒定的光源,我想在文档的照片上实现这种效果。所需的效果是消除任何阴影或低光区域(或至少使它们不那么明显)并使整张照片相当明亮。

我的第一个想法是定位目标图像中最亮的部分,然后它们使整个图像具有该亮度。假设这甚至是正确的算法,我将如何在 PIL 中做到这一点?有没有获取亮度的方法?等等?

(这是this earlier question的后续。)

【问题讨论】:

您可以添加您的示例图片吗? 【参考方案1】:

作为第一次尝试,尝试对图像进行阈值处理。暗区变为黑色,亮区变为白色。我没有使用过 PIL,但我想有什么简单的方法可以做到。

【讨论】:

【参考方案2】:

尝试使用 ImageChops.screen(image1, image2) 复制 2 个图像。如果不满意,请尝试 ImageChops 模块中的其他一些功能。

另外,您可能需要先将其转换为灰度:ImageOps.grayscale(image)。

【讨论】:

【参考方案3】:

首先在图像编辑程序(如 GIMP)中手动尝试。我认为您正在寻找的是调整亮度和对比度。

【讨论】:

不,这不仅仅是因为较暗的区域应该比已经明亮的区域获得更多的亮度。【参考方案4】:

什么类型的图像?如果它应该是理想的纯黑白,就像文本页面一样,那么您的原始数据可能类似于灰度渐变,具有不同级别的非全黑字母。对常数设置阈值可能会产生良好的结果,但如果照明太不均匀或镜头眩光干扰则不会。针对图像本身的平滑版本设置阈值。使用 PIL_usm.gblur(image, radius) 对其进行平滑处理,其中半径(以像素为单位)类似于十、二十或与字母元素宽度相当的某个值。旧笔记中的快速 hackcode 仅用于说明:

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,如果这些文档有照片或其他非双层图形,你需要更聪明。

【讨论】:

以上是关于如何使图像亮度均匀(使用 Python/PIL)的主要内容,如果未能解决你的问题,请参考以下文章

快速图像阈值处理

如何使用 Python PIL 模糊图像的非矩形或圆形区域?

matlab亮度增加100

如何将图像彼此对齐,以使它们沿页面宽度均匀分布? [关闭]

如何使用 Python PIL 或 CV 裁剪图像?

如何使用 Python PIL 将图像保存到特定目录?