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



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

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

通常,当您想以python读取或写图像时(任何位深度和格式(时,最好使用Imageio。顾名思义,其单一目标是输入/输出图像。只有警告:它可能会忽略图像的元数据。也就是说:它可能无法正确处理定义标准SRGB以外的颜色空间的图像,或者可能无法保留图像的预期方向。

您会在图像中阅读,例如example.tif,就像:

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

至于转换,那只是基本数学。您将收到像素数据的数据结构是一个numpy数组。Introspect image.shapeimage.dtype。您应该期望您的图像具有(y, x, 3)shape,其中y是垂直的像素的数量,在水平方向上x3代表三种颜色通道:红色,绿色,蓝色。其dtype(数据类型(应为uint16,意思是未签名的16位整数。

侧面注意:由于有三个颜色通道,每个通道都用16位分辨率采样,因此图像的颜色深度通常被描述为" 48位"(每个像素(。

16位整数范围在0和65535之间(= 2 16 -1(。它们需要被胁迫到8位范围:0至255(= 2 8 -1(。因此,除以256(= 2 8 (:

image = image / 256

这将产生一系列浮点像素值。它的数据类型必须明确地施放到8位整数以删除任何分数。

image = image.astype('uint8')

等效地,更有效地,您也可以在右边的16位值换一个:

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

这使转换更快(在现代硬件上大约2倍(,因为它跳过了浮点操作。

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

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

如果您想要的只是转换,则.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。然后将其保存到目标位置。

嘿,我使用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)
 

最新更新