tiff影像一般具有多个波段,常见的为4波段影像:红、绿、蓝、近红外/透明度
一般来讲,读取时按照正常图片读取就可以,但是实际使用过程中,波段顺序和数量会因为不同的库表现不同
numpy、cv2、matplot、tifffile
测试文件为4个波段的tiff影像
import cv2
img_0 = cv2.imread(ç,0)
print(img_0.shape)
img_1 = cv2.imread('/Users/apple/Downloads/test.tiff',1)
print(img_1.shape)
img_o = cv2.imread('/Users/apple/Downloads/test.tiff',cv2.IMREAD_UNCHANGED)
print(img_o.shape)
#IMREAD_UNCHANGED = -1 # 不进行转化,比如保存为了16位的图片,读取出来仍然为16位。
#IMREAD_GRAYSCALE = 0 # 进行转化为灰度图,比如保存为了16位的图片,读取出来为8位,类型为CV_8UC1。
#IMREAD_COLOR = 1 # 进行转化为RGB三通道图像,图像深度转为8位
#IMREAD_ANYDEPTH = 2 # 保持图像深度不变,进行转化为灰度图。
#IMREAD_ANYCOLOR = 4 # 若图像通道数小于等于3,则保持原通道数不变;若通道数大于3则只取取前三个通道。图像深度转为8位
输出如下:
(8314, 7525)
(8314, 7525, 3)
(8314, 7525)
可以看出4波段的影像在opencv的读取方式中,显示为前三个波段,而且读取顺序为BGR
import numpy as np
img_np = np.fromfile('/Users/apple/Downloads/test.tiff')
print(img_np.shape)
(62579547,)
numpy会默认将第一波段拆分成一维数组来进行计算,这样做的好处是在统计一些统计值或者异常值时,一维数组的计算速度会远远快于多维数组
from PIL import Image
img_pil = Image.open('/Users/apple/Downloads/test.tiff')
结果报错,因为这种方式仅支持单通道及多通道Uint8 TIFF图像读取,读取单通道Uint16 TIFF图像转为Uint8处理
import tifffile as tf
# tifffile是我在pypi上找到的tiff文件的读取库,类似的还有GDAL
img_tf = tf.imread('/Users/apple/Downloads/test.tiff')
print(img_tf.shape)
(8314, 7525, 4)
使用tifffile可以完整地读取tiff文件
使用常见的库来进行多波段数据的读取是一种常见的方式,但是根据使用情况的不同,读取的效率和读取方式需要认真筛选。