微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将图像中的每个像素转换为字母 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 值与像素的感知亮度并不完全匹配,但这超出了本问题的范围。

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。