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

5

我正在处理一些卫星图像,这些图像是由16位的.tiff图像组成。颜色被编码为每个通道16位。我想知道如何将这些图像转换为普通的8位RGB以供进一步的CNN处理。

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


"将16位TIFF图像转换为RGB"?TIFF是一种图像文件格式,而RGB是一种颜色空间/模式。不清楚您想要如何处理您的“.tiff”文件。 - Vasu Deo.S
@JohnHennig 是的,每个通道16位。 - qqxlafk
请注意,如果您使用卫星图像,则应使用rasterio软件包进行处理。请注意,在rasterio中,第一个索引是通道,要将其转换为pillow等软件包,您必须执行image = np.moveaxis(image,[0,1,2],[2,1,0])的操作。 - Learning from masters
3个回答

11
一般而言,当你想在Python中读取或写入任何位深度和格式的图像时,最好使用ImageIO。顾名思义,它的唯一目标就是输入/输出图像。唯一的注意事项是:它可能会忽略图像的元数据。也就是说:它可能无法正确处理定义为标准sRGB以外颜色空间的图像,或者可能无法保留图像的预期方向。
你可以这样读取图像,比如example.tif
import imageio
image = imageio.imread('example.tif')

关于转换,那只是基础数学。您将接收像素数据的数据结构是NumPy数组。内省image.shapeimage.dtype。您应该期望您的图像具有shape(y, x, 3),其中y是垂直方向上的像素数,x是水平方向上的像素数,3表示三个颜色通道:红色、绿色、蓝色。它的dtype(数据类型)应该是uint16,意味着无符号16位整数。
旁注:由于有三个颜色通道,每个通道都以16位分辨率采样,因此图像的色深更常被描述为“48位”(每个像素)。
16位整数数字的范围在0到65535之间(=216-1)。它们需要强制转换为8位范围:0到255(=28-1)。因此,除以256(=28)。
image = image / 256

这将产生一个浮点像素值数组。它的数据类型必须显式转换为8位整数,以消除任何小数部分。

image = image.astype('uint8')

同样地,更高效的方法是将16位值向右位移8位:

image = (image >> 8).astype('uint8')

这样做可以加快转换速度(在现代硬件上大约提高了2倍),因为它跳过了浮点运算。

然后,要么将最终的image数组用于进一步处理,要么将其保存到新文件中:

imageio.imwrite('example.png', image)

3

嘿,我使用tifffile来处理文件,并使用在另一个帖子中发现的计算方法对16位图像进行了缩放,使其变成8位。

import numpy as np
import tifffile as tif
import cv2

image = tif.imread('/home/trance/test.tiff')

# Rescale 16-bit to 8-bit
img_rescaled = 255 * (image - image.min()) / (image.max() - image.min())

# Colourising image and saving it with opencv
img_col = cv2.applyColorMap(img_rescaled.astype(np.uint8), cv2.COLORMAP_INFERNO)
cv2.imwrite('/home/trance/test.png', img_col)
 

3
如果你只是想将你的 .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
PIL无法识别16位tiff图像...它会报错:无法识别图像文件'/spacenet_sample/spacenet_sample/AOI_2_Vegas_Train/RGB-PanSharpen/RGB-PanSharpen_AOI_2_Vegas_img225.tif'。 - qqxlafk
1
@Qianhui Liang:更好的方法是上传图片并在您的问题中放置一个链接。 - martineau
@QianhuiLiang PIL本身支持16位3通道的未压缩tiff图像,如果它们是未压缩的。如果在尝试打开tiff文件时出现错误,则可能是压缩文件。请在官方PIL.tiff文档中阅读更多信息 - Vasu Deo.S

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