我正在尝试将彩色图像转换为纯BW。我环顾四周寻找一些代码,然后用
结算im = Image.open("mat.jpg")
gray = im.convert('L')
bw = gray.point(lambda x: 0 if x<128 else 255, '1')
bw.save("result_bw.jpg")
然而,结果仍然是灰色的!
所以,我试着自己做:
floskel = Image.open("result_bw.jpg")
flopix = floskel.load()
for i in range (0,floskel.size[0]):
for j in range (0, floskel.size[1]):
print flopix[i,j]
if flopix[i,j]>100:
flopix[i,j]=255
else:
flopix[i,j]=0
但是,STILL,图像中有灰色。
我做错了吗?
答案 0 :(得分:1)
您宁愿使用convert
来制作模式('1')图像。它会更快更好,因为它默认使用抖动。
bw = im.convert('1')
您看到的灰色可能出现在图像的部分,噪声接近128级,产生看起来是灰色的高频B&amp; W。
答案 1 :(得分:1)
正如sebdelsol所提到的,直接在颜色源图像上使用im.convert('1')
要好得多。标准的PIL“抖动”是Floyd-Steinberg误差扩散,这通常是相当不错的(取决于图像),但是还有其他各种选项,例如随机抖动和有序抖动,尽管你必须自己编码,所以他们会慢一点。
您在OP中的代码中使用的转换算法只是简单的阈值处理,它通常会丢失很多的细节,尽管它很容易编写。但我想在这种情况下你只是想确认你的理论是关于最终图像中出现的灰色像素。但正如sebdelsol所说,它只是看起来就像灰色像素一样,因为“噪音”,即包含大量黑白像素的区域混合在一起,你应该能够验证你是否放大进入图像。
FWIW,如果你想对整个图像进行逐个像素的处理,那么使用im.getdata()
获取像素列表会更有效,并将它们放回到im.putdata()
的图像中而不是那样flopix[i,j]
的东西。当然,如果您不需要知道坐标,使用im.point()
的算法通常很快。
最后,JPEG并不适合B&amp; W图像,它专为具有(大部分)连续色调的图像而设计。尝试保存为PNG;生成的文件可能比等效的JPEG小批次。通过低质量设置保存可以减少JPEG文件大小,但结果通常看起来不太好。