如何解决将图像中的每个像素转换为字母 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
编辑:感谢 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 举报,一经查实,本站将立刻删除。