将16位Tiff图像转换为8位RGB

时间:2019-06-25 18:34:23

标签: python tiff

我正在处理一些卫星图像,其中包括16位.tiff图像。颜色编码为每个通道16位。我想知道如何将这些图像转换为普通的8位RGB,以进行进一步的CNN处理。

我已经尝试过OpenCV(cv2.read('file',-1))和PIL(read('file')),但是这两个软件包无法识别和读取16位tiff图像。

2 个答案:

答案 0 :(得分:1)

如果只需要转换,则将.tiff文件的颜色空间转换为RGB。然后尝试:-

from PIL import Image

img = Image.open(r"Path_to_tiff_image")
img = img.convert("RGB")
img.save(r"path_of_destination_image")

上面的代码首先打开一个.tiff图像,然后将其颜色模式更改为RGB。然后将其保存到目标位置。

答案 1 :(得分:1)

通常,当您想使用Python读取或写入图像(任何位深度和​​格式)时,最好使用ImageIO。顾名思义,它的唯一目标就是输入/输出图像。

您将像这样读入图像,说example.tif

import imageio
image = imageio.imread('example.tif')

至于转换,这只是基础数学。您将接收像素数据的数据结构是一个Numpy数组。内省image.shapeimage.dtype。您应该期望图像的shape(y, x, 3),其中y是垂直像素数,x是水平像素,{{1} }代表三个颜色通道:红色,绿色,蓝色。其3(数据类型)应为dtype,表示无符号16位整数。

16位整数在0到65535之间(2 16 -1)。您需要强制将其范围降低到8位:0到255(2 8 -1)。

uint16

(通常)这将为您提供一个浮点像素值数组。必须将其数据类型显式转换为8位整数才能删除任何分数。

image = image / 2**8

然后使用该image = image.astype(numpy.uint8) 进行进一步处理或将其保存到(新)文件中:

image