[英]Python: Manipulating a 16-bit .tiff image in PIL &/or pygame: convert to 8-bit somehow?
[英]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.shape
和image.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.