Python Pil将灰度Tif转换为RGB

17

我有一个灰度TIF文件,我需要将它转换为RGB格式或以一种可操作的方式读取。

img = Image.open(GIF_FILENAME)
rgbimg = img.convert('RGB')
for i in range(5):
    print rgbimg.getpixel((i, 0))

使用convert.("RGB")会自动将所有东西变为(255,255,255),即使画面是一个非常暗的黑色画面。

如果我只读取灰度数字,我会得到大约1400到1900左右的数字。

我还需要保存一份RGB Jpeg格式的图片副本。 相关图片:[这里]: http://imgur.com/kEwfFs3

我该怎么做呢?

2个回答

25

怎么样:

img = Image.open(GIF_FILENAME)
rgbimg = Image.new("RGBA", img.size)
rgbimg.paste(img)
rgbimg.save('foo.jpg')

[编辑]

创建了一个测试:

from PIL import Image
from collections import defaultdict
import pprint

img = Image.open("kEwfFs3.png")
rgbimg = Image.new("RGBA", img.size)
rgbimg.paste(img)

found_colors = defaultdict(int)
for x in range(0, rgbimg.size[0]):
    for y in range(0, rgbimg.size[1]):
        pix_val = rgbimg.getpixel((x, y))
        found_colors[pix_val] += 1 
pprint.pprint(dict(found_colors))

rgbimg.save('kEwfFs3.jpg')

并输出:

{(0, 0, 0, 255): 747802,
 (1, 1, 1, 255): 397,
 (2, 2, 2, 255): 299,
 (3, 3, 3, 255): 255,
 (4, 4, 4, 255): 221,
 (5, 5, 5, 255): 200,
 (6, 6, 6, 255): 187,
 (7, 7, 7, 255): 138,
 (8, 8, 8, 255): 160,
 (9, 9, 9, 255): 152,
 (10, 10, 10, 255): 122,
 (11, 11, 11, 255): 116,
 (12, 12, 12, 255): 144,
 (13, 13, 13, 255): 117,
 (14, 14, 14, 255): 117,
 (15, 15, 15, 255): 102,
 (16, 16, 16, 255): 119,
 (17, 17, 17, 255): 299641,
 (18, 18, 18, 255): 273,
 (19, 19, 19, 255): 233,
.................... etc .......
.................... etc .......
 (249, 249, 249, 255): 616,
 (250, 250, 250, 255): 656,
 (251, 251, 251, 255): 862,
 (252, 252, 252, 255): 1109,
 (253, 253, 253, 255): 1648,
 (254, 254, 254, 255): 2964175}

这正是你所期望的。 你的输出不同吗?


非常感谢!你的代码唯一需要更正的是.paste(img)而不是paste(im)。 - 1478963
8
不客气。对你的更正,应该是.paste(img)而不是.past(img) ;) - RickyA
有没有一种方法可以在不保存图像的情况下处理它?如果我在保存之前尝试处理图片,会出现相同的错误(255,255,255,255)。 - 1478963
你有示例图像的链接吗?或者能否将其放在问题中? - RickyA
1
Imgur将图片更改为PNG文件。但是,如果我在tiff文件上运行它,输出的JPG看起来像http://imgur.com/qtQTJKQ。由于某种原因,它只读取黑色或白色,而不是中间颜色。此外,我的颜色设置仅给我偶数(0,0,0),然后是(2,2,2)。 - 1478963
16位的TIFF格式是否有助于/改变情况? - 1478963

4
我遇到了与一个I;16(16位灰度)tiff转换为RGB相同的问题。深入研究手册(链接1)后发现,问题与lut PIL用于将灰度图像转换为RGB有关。它在8位颜色空间中工作;也就是说,它剪切所有高于255的值。因此,一个快速简单的解决方案是使用自己的lut手动转换为RGB,该lut使用点方法缩放范围内的值,如下所示:
path = 'path\to\image'
img = Image.open(path)
img.point(lambda p: p*0.0039063096, mode='RGB')
img = img.convert('RGB')
img.show() # check it out!

我通过将256除以16位等效值65535来确定“lut”公式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接