繁体   English   中英

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

[英]Convert 16-bit Tiff image to 8-bit 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数组。 内省image.shapeimage.dtype 您应该期望您的图像具有(y, x, 3)shape ,其中y是垂直方向的像素数, x是水平方向的像素数, 3表示三个颜色通道:红色、绿色、蓝色。 它的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 位值向右移位8 位:

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)
 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM