OpenCV return None 在 GDAL 支持下调用 imread

OpenCV return None whan imread is called with GDAL support

我在 python 中有一个使用 OpenCV 和 GDAL 的非常简单的程序。在此程序中,我使用以下行读取 GeoTiff 图像

image = cv2.imread(sys.argv[1], cv2.IMREAD_LOAD_GDAL | cv2.IMREAD_COLOR)

问题是针对特定图像 imread return None。我使用的图片来自:https://www.sensefly.com/drones/example-datasets.html

Assessing crops with RGB imagery (eBee SQ) > Map (orthomosaic) 中的图片效果很好。它的大小是:19428, 19784 有 4 个波段。

Urban mapping (eBee Plus/senseFly S.O.D.A.) > Map (orthomosaic) 中的图像无效。它的大小是:26747、25388和4个波段。

对找出问题所在有什么帮助吗?

编辑:我尝试了@en_lorithai建议的解决方案并且它有效,问题是我需要用OpenCV做一些图像处理并且GDAL加载的图像有几个问题

OpenCV加载的图像是(调整为700x700):

GDAL 加载的图像(当然是在改变形状之后)是(调整为 700x700)

最后,如果我尝试使用

将此图像从 BGR 转换为 RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

我得到(调整为 700x700)

我可以用下面的代码从GDAL格式转换成OpenCV格式

image = ds.ReadAsArray() #Load image with GDAL
tmp = image.copy()
image[0] = tmp[2,:,:] # swap read channel and blue channel
image[2] = tmp[0,:,:]
image = np.swapaxes(image,2,0) # convert from (height, width, channels) to (channels, height, width)

image = cv2.flip(image,0) # flip in Y-axis
image = cv2.transpose(image) # Rotate by 90 degress (clockwise)
image = cv2.flip(image,1)

问题是我认为这是一个非常慢的过程,我想知道是否有自动转换过程。

您可以尝试在 gdal 中打开图像

from osgeo import gdal

g_image = gdal.Open('161104_hq_transparent_mosaic_group1.tif')
a_image = g_image.ReadAsArray()

无法测试,因为我没有足够的可用内存来打开该图像。

编辑:对另一张图片进行等价操作

from osgeo import gdal
import matplotlib.pyplot as plt

g_image = gdal.Open('Water-scenes-014.jpg') # 3 channel rgb image
a_image = g_image.ReadAsArray()
s_image = np.dstack((a_image[0],a_image[1],a_image[2]))
plt.imshow(s_image) # show image in matplotlib (no need for color swap)
s_image = cv2.cvtColor(s_image,cv2.COLOR_RGB2BGR) # colorswap for cv
cv2.imshow('name',s_image)

另一种从 gdal 获取单个条带的方法

g_image = gdal.Open('image_name.PNG')
band1 = g_image.GetRasterBand(1).ReadAsArray()

然后您可以对每个波段进行 numpy dstack。