我正在处理一些卫星图像,其中包括16位.tiff
图像。颜色编码为每个通道16位。我想知道如何将这些图像转换为普通的8位RGB,以进行进一步的CNN处理。
我已经尝试过OpenCV(cv2.read('file',-1)
)和PIL(read('file')
),但是这两个软件包无法识别和读取16位tiff图像。
答案 0 :(得分:1)
如果只需要转换,则将.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
。然后将其保存到目标位置。
答案 1 :(得分:1)
通常,当您想使用Python读取或写入图像(任何位深度和格式)时,最好使用ImageIO。顾名思义,它的唯一目标就是输入/输出图像。
您将像这样读入图像,说example.tif
:
import imageio
image = imageio.imread('example.tif')
至于转换,这只是基础数学。您将接收像素数据的数据结构是一个Numpy数组。内省image.shape
和image.dtype
。您应该期望图像的shape
为(y, x, 3)
,其中y
是垂直像素数,x
是水平像素,{{1} }代表三个颜色通道:红色,绿色,蓝色。其3
(数据类型)应为dtype
,表示无符号16位整数。
16位整数在0到65535之间(2 16 -1)。您需要强制将其范围降低到8位:0到255(2 8 -1)。
uint16
(通常)这将为您提供一个浮点像素值数组。必须将其数据类型显式转换为8位整数才能删除任何分数。
image = image / 2**8
然后使用该image = image.astype(numpy.uint8)
进行进一步处理或将其保存到(新)文件中:
image