Pillow - 如何使用阈值将图像二值化?

3

我想将PNG图像二值化。

如果可能的话,我想使用Pillow库。

我看到有两种方法可以使用:

image_file = Image.open("convert_image.png") # open colour image
image_file = image_file.convert('1') # convert image to black and white

这种方法似乎通过抖动图像来处理填充有浅色的区域。我不想要这种行为。例如,如果有一个浅黄色的圆圈,我希望它变成黑色圆圈。

更一般地说,如果像素的RGB值为(x,y,z),那么对于某个阈值0<t<255,如果x<=t或y<=t或z<=t,则我希望该像素变为黑色。

我可以将图像转换为灰度或RGB,然后手动应用阈值测试,但这似乎效率低下。

我看到的第二种方法是:

threshold = 100
im = im2.point(lambda p: p > threshold and 255)

这里获取,但我不知道它是如何工作的,阈值是什么,这里的功能是什么,以及“和255”的作用。

我正在寻找如何应用方法2的解释或使用Pillow的替代方法。

1个回答

13

我认为你需要将图像转换为灰度图,应用阈值,然后再转换为单色图像。

image_file = Image.open("convert_iamge.png")
# Grayscale
image_file = image_file.convert('L')
# Threshold
image_file = image_file.point( lambda p: 255 if p > threshold else 0 )
# To mono
image_file = image_file.convert('1')

表达式"p > threshhold and 255"是Python的技巧。"a and b"的定义是"a如果为假,否则为b"。因此,这将为每个像素产生"False"或"255",而"False"将被计算为0。我的if/else以可能更易读的方式完成了同样的事情。


1
可能有一种更易读的方式,轻描淡写地说。在我九年的Python编程经验中从未见过这个“技巧”。希望再也不会遇到它。谢谢你的回答。 - Neil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接