我正在处理一些由 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')
Run Code Online (Sandbox Code Playgroud)
至于转换,那只是基本的数学运算。您将在其中接收像素数据的数据结构是一个NumPy数组。自省image.shape和image.dtype。你应该期望你的图像有一个shapeof (y, x, 3),其中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
Run Code Online (Sandbox Code Playgroud)
这将产生一个浮点像素值数组。它的数据类型必须显式转换为 8 位整数才能删除任何分数。
image = image.astype('uint8')
Run Code Online (Sandbox Code Playgroud)
同样,更有效的是,您还可以将 16 位值向右移位8 位:
image = (image >> 8).astype('uint8')
Run Code Online (Sandbox Code Playgroud)
这使得转换速度更快(在现代硬件上大约是 2 倍),因为它跳过了浮点运算。
然后,要么使用最终image数组进行进一步处理,要么将其保存到一个新文件中:
imageio.imwrite('example.png', image)
Run Code Online (Sandbox Code Playgroud)
如果您只想将.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")
Run Code Online (Sandbox Code Playgroud)
上面的代码,首先打开一个.tiff图像,然后将其颜色模式更改为RGB. 然后将其保存到目标位置。
| 归档时间: |
|
| 查看次数: |
7631 次 |
| 最近记录: |