我正在处理一些卫星图像,这些图像是由16位的.tiff
图像组成。颜色被编码为每个通道16位。我想知道如何将这些图像转换为普通的8位RGB以供进一步的CNN处理。
我尝试了OpenCV (cv2.read('file',-1)
)和PIL (read('file')
),但这两个软件包无法识别和读取16位的tiff图像。
我正在处理一些卫星图像,这些图像是由16位的.tiff
图像组成。颜色被编码为每个通道16位。我想知道如何将这些图像转换为普通的8位RGB以供进一步的CNN处理。
我尝试了OpenCV (cv2.read('file',-1)
)和PIL (read('file')
),但这两个软件包无法识别和读取16位的tiff图像。
example.tif
:import imageio
image = imageio.imread('example.tif')
image.shape
和image.dtype
。您应该期望您的图像具有shape
为(y, x, 3)
,其中y
是垂直方向上的像素数,x
是水平方向上的像素数,3
表示三个颜色通道:红色、绿色、蓝色。它的dtype
(数据类型)应该是uint16
,意味着无符号16位整数。image = image / 256
这将产生一个浮点像素值数组。它的数据类型必须显式转换为8位整数,以消除任何小数部分。
image = image.astype('uint8')
同样地,更高效的方法是将16位值向右位移8位:
image = (image >> 8).astype('uint8')
这样做可以加快转换速度(在现代硬件上大约提高了2倍),因为它跳过了浮点运算。
然后,要么将最终的image
数组用于进一步处理,要么将其保存到新文件中:
imageio.imwrite('example.png', image)
嘿,我使用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)
.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
。最后将其保存到指定位置。
.tiff
文档中阅读更多信息。 - Vasu Deo.S