繁体   English   中英

将图像中的每个像素转换为字母 PIL

[英]Convert each pixel from a image to a letter PIL

我有一个文件“ map.jpg ”,它由黑白像素(16x16 img)组成,我想在文本文件中将白色像素转换为0,将黑色像素转换为1。我有这个:

from PIL import Image
import os

mapImg = Image.open('map.png')

with open('map.txt', 'a+') as map:
    for y in range(16):
        for x in range(16):
            pix = mapImg.getpixel((x, y))
            if x == 15:
                map.write('\n')
            else:
                if pix == (255, 255, 255):
                    map.write('0')
                else:
                    map.write('1')

但我不知道为什么我的 txt 文件中的结果是这样的:

000000000
0011000000
0111110000
0100000110
0010011100
0101010
0111100
000010101000
001110000
00011000000
0000100000
0011000
0000010000
00000000
000000000
000000000

这不是“ map.jpg ”文件的样子。

编辑:感谢 Random Davis,问题解决了,只需要更改图像格式,因为 jpeg 将 img 压缩到很多东西,谢谢!

除了 jpg 文件使用有损压缩这一事实外,正如另一个答案所描述的,无损压缩的图像文件(例如 png)还可以包含所有不同的 RGB 颜色组合(例如不同的灰色调)。 如果您只对黑白之间的差异感兴趣,您可以例如计算平均 RGB 值¹并使用阈值(如果平均值 ≥ 128,则写入0 ,否则写入1 )。 这也适用于有损压缩的 jpg 文件,因为压缩算法通常不会过多地改变像素,以至于明亮的像素会突然变暗。

你的最后一个if语句可以写成如下:

pix_avg_rgb = sum(pix) / 3
if pix_avg_rgb >= 128:
    map.write('0')
else:
    map.write('1')

¹ 由于 RGB 颜色空间与感知亮度之间的非线性关系,平均 RGB 值与像素的感知亮度不完全匹配,但对于这个问题,这超出了 scope 的范围。

如果您的图像是jpg ,那么它会被有损压缩,这意味着所有像素不一定都是全黑或全白的。 您需要一个真正只有这两个 colors 的无损源,否则像素将被错误分类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM