我正在尝试在Python中读取一张16位TIFF图像(26446 x 16688)。使用OpenCV时,仅通过以下方式读取黑色图像(所有强度读取为0):
self.img = cv2.imread(self.filename, cv2.IMREAD_UNCHANGED)
openCV能够处理16位或更大的图像(~840MB)吗?有什么解决方法吗?
编辑:此外,cv2.imshow("output", self.img[0:600])
会显示黑色图像。
使用针对栅格数据(在您的情况下,Sentinel-1)特定的图像库。例如,您可以使用rasterio
来读取和显示卫星图像。
示例:
import rasterio
from rasterio.plot import show
img = rasterio.open("image.tif")
show(img)
是的,OpenCV可以完美地读取uint16:
img_np = cv2.imread(path, cv2.IMREAD_ANYDEPTH | cv2.IMREAD_UNCHANGED)
提到文件大小限制,取决于像素数量:
默认情况下,像素数必须小于 2^30。可以使用系统变量 OPENCV_IO_MAX_IMAGE_PIXELS 设置限制。
https://docs.opencv.org/3.4/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56
import tifffile as tiff
import matplotlib.pyplot as plt
filename = 'Image.tif'
img = tiff.imread(filename)
plt.imshow(img)
identify
命令来检查你的 TIFF 文件中目录的最小值/最大值/平均值/数量。它在大多数 Linux 系统上安装了。你需要运行identify -verbose YourImage.tif
。 - undefinedimshow
中显示也是正确的,尽管可能被截断为8位 -34067, 34983, 35287]],dtype=uint16)
- 这是我的图像结尾(当没有使用cv2.IMREAD_UNCHANGED
加载时为137, 137, 137)。也许你正在加载一张黑色图片,或者实际范围不完全是16位(例如12位,并通过8位移位产生大部分零值)。要么是图像的大小问题,要么就是正常工作 - 尝试将图像乘以某个2的幂次方,或者在显示之前进行归一化处理(拉伸对比度)。或者前600行是黑色的... - undefined