python之PIL 二值图像处理和保存
0.
1.参考
http://pszpcl.baike.com/article-77327.html
windows 图片右键:属性 详细信息 位深度
位深度 用于指定图像中的每个像素可以使用的颜色信息数量。
位深度为 1 的图像的像素有两个可能的值:黑色和白色。
位深度为 8 的灰度模式图像有 256 个可能的灰色值。
RGB 图像由三个颜色通道组成。8 位/像素的 RGB 图像中的每个通道有 256 个可能的值,这意味着该图像有 1600 万个以上可能的颜色值。
有时将带有 8 位/通道 (bpc) 的 RGB 图像称作 24 位图像(8 位 x 3 通道 = 24 位数据/像素)。
2.结论:
载入黑白图片也可能是0/1二值
保存黑白图片优选 gif,自动转为0/1二值,且windows下显示正常。
3. 载入图片后的探索
#载入黑白图 In [82]: img.mode Out[82]: 'P' In [114]: img.getbands() Out[114]: ('P',) In [83]: img.getcolors() Out[83]: [(1048, 0), (102, 1)] In [84]: print list(img.getdata())[:10] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] In [90]: set(img.getdata()) Out[90]: {0, 1} #载入彩色图 In [103]: imgc.mode Out[103]: 'RGBA' In [100]: imgc.getbands() Out[100]: ('R', 'G', 'B', 'A') In [106]: imgc.getcolors() Out[106]: [(34, (255, 255, 255, 255)), (11, (250, 215, 245, 255)), In [112]: list(imgc.getdata()) Out[112]: [(244, 245, 245, 255), (245, 245, 245, 255),
4. 保存二值黑白图片要区分 gif / png
In [176]: img=Image.open('split_image/61234.png') In [177]: img.show() In [178]: img.getcolors() #注意原图 0/1 足以显示为黑白图像 Out[178]: [(1048, 0), (102, 1)] In [179]: gray = img.convert('L') In [180]: gray_array = np.array(gray) In [181]: Image.fromarray(gray_array).show() In [182]: gray_array Out[182]: array([[249, 249, 249, ..., 249, 249, 249], [249, 249, 249, ..., 249, 249, 249], [249, 249, 249, ..., 249, 249, 249], ..., [249, 249, 249, ..., 249, 249, 249], [249, 249, 249, ..., 249, 249, 249], [249, 249, 249, ..., 249, 249, 249]], dtype=uint8) In [183]: bilevel = Image.fromarray(np.where(gray_array<100,0,200)) In [184]: bilevel.getcolors() Out[184]: [(1048, 200), (102, 0)] In [185]: bilevel.save('png.png') In [186]: bilevel.save('gif.gif') In [187]: Image.open('png.png').getcolors() #png灰度值得以保留 Out[187]: [(1048, 200), (102, 0)] In [188]: Image.open('gif.gif').getcolors() #gif只剩0/1 Out[188]: [(102, 0), (1048, 1)]
原图png
PIL处理后保存的gif:
PIL处理后保存的png,在windows中也显示为黑图,PIL show显示正常:
d