use*_*281 2 opencv tiff raster scikit-image
我有一个600×600×40维度的阵列,每个波段(40波段)代表600×600图像我想将它保存到多波段.tif图像.我已经尝试过scikit-image和openCV中的这些功能,但它们不能保存超过3个波段(如RGB).
import cv2
cv2.imwrite('image.tif',600by600_just3band_array)
Run Code Online (Sandbox Code Playgroud)
您可以使用 PIL/Pillow 将多个图像保存在单个 TIFF 文件中,每个图像代表单个波段(灰度),甚至多个波段(彩色):
from PIL import Image
# Synthesize 8 dummy images, all greyscale, all same size but with varying brightness
size=(480,640)
b1 = Image.new('L', size, color=10)
b2 = Image.new('L', size, color=20)
b3 = Image.new('L', size, color=30)
b4 = Image.new('L', size, color=40)
b5 = Image.new('L', size, color=50)
b6 = Image.new('L', size, color=60)
b7 = Image.new('L', size, color=70)
b8 = Image.new('L', size, color=80)
# Save all 8 to single TIFF file
b1.save('multi.tif', save_all=True, append_images=[b2,b3,b4,b5,b6,b7,b8])
Run Code Online (Sandbox Code Playgroud)
如果您现在在命令行中使用ImageMagick检查该文件,您可以看到所有 8 个波段都存在:
magick identify multi.tif
multi.tif[0] TIFF 480x640 480x640+0+0 8-bit Grayscale Gray 2.34473MiB 0.000u 0:00.000
multi.tif[1] TIFF 480x640 480x640+0+0 8-bit Grayscale Gray 2.34473MiB 0.000u 0:00.000
multi.tif[2] TIFF 480x640 480x640+0+0 8-bit Grayscale Gray 2.34473MiB 0.000u 0:00.000
multi.tif[3] TIFF 480x640 480x640+0+0 8-bit Grayscale Gray 2.34473MiB 0.000u 0:00.000
multi.tif[4] TIFF 480x640 480x640+0+0 8-bit Grayscale Gray 2.34473MiB 0.000u 0:00.000
multi.tif[5] TIFF 480x640 480x640+0+0 8-bit Grayscale Gray 2.34473MiB 0.000u 0:00.000
multi.tif[6] TIFF 480x640 480x640+0+0 8-bit Grayscale Gray 2.34473MiB 0.000u 0:00.000
multi.tif[7] TIFF 480x640 480x640+0+0 8-bit Grayscale Gray 2.34473MiB 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
如果您使用 OpenCV 或 Numpy 数组进行处理,您可以使用以下命令将 OpenCV 或 Numpy 数组制作成 PIL/Pillow 图像:
PILimage = Image.fromarray(numpyImage)
Run Code Online (Sandbox Code Playgroud)
反之,从 PIL/Pillow 图像到 Numpy 数组:
NumpyImage = np.array(PILimage)
Run Code Online (Sandbox Code Playgroud)
如果您想读回它们,可以这样做:
# Open the multi image
im = Image.open('multi.tif')
# Iterate through frames
for frame in ImageSequence.Iterator(im):
frame.show()
Run Code Online (Sandbox Code Playgroud)
如果你想移动到特定的频段,你可以这样寻找:
im = Image.open('multi.tif')
im.seek(3)
im.show()
Run Code Online (Sandbox Code Playgroud)
您还可以在命令行中使用ImageMagick从 TIF 中提取 band3 并另存为 PNG :
magick multi.tif[3] band3.png
Run Code Online (Sandbox Code Playgroud)
或者使用以下命令制作波段 1、2、7 RGB 合成:
magick multi.tif[1] multi.tif[2] multi.tif[7] -colorspace RGB -combine 127rgb.png
Run Code Online (Sandbox Code Playgroud)
它看起来是深蓝色的,因为红色和绿色通道非常低,只有蓝色通道具有较大的值。
我在 Python 方面不是世界上最好的,所以不确定是否有任何影响/错误,但我认为如果你有一个 600x600x40 numpy 图像数组,你可以按照我的建议进行操作:
# Synthesize dummy array of 40 images, each 600x600
nparr = np.random.randint(0,256,(600,600,40), dtype=np.uint8)
# Make PIL/Pillow image of first
a = Image.fromarray(nparr[:,:,0])
# Save whole lot in one TIF
a.save('multi.tif', save_all=True, append_images=[Image.fromarray(nparr[:,:,x]) for x in range(1,40)])
Run Code Online (Sandbox Code Playgroud)
关键词:多波段、多波段、多光谱、多光谱、卫星图像、影像、图像处理、Python、Numpy、PIL、Pillow、TIFF、TIF、NDVI
tifffile(https://pypi.org/project/tifffile/)支持多通道.tiff,并且具有类似于scikit-image或者的API OpenCV:
In [1]: import numpy as np
In [2]: import tifffile
In [3]: # Channel dimension should come first
In [4]: x = np.random.randint(0, 255, 4*100*100).reshape((4, 100, 100))
In [5]: tifffile.imsave('test.tiff', x)
In [6]: y = tifffile.imread('test.tiff')
In [7]: np.all(np.equal(x, y))
Out[7]: True
Run Code Online (Sandbox Code Playgroud)