Python 当使用GDAL支持调用imread时,OpenCV返回None

Python 当使用GDAL支持调用imread时,OpenCV返回None,python,opencv,gis,gdal,geotiff,Python,Opencv,Gis,Gdal,Geotiff,我有一个非常简单的python程序,带有OpenCV和GDAL。在这个程序中,我使用以下行读取GeoTiff图像 image = cv2.imread(sys.argv[1], cv2.IMREAD_LOAD_GDAL | cv2.IMREAD_COLOR) 问题在于特定图像imread返回None。我使用的图像来自: 使用RGB图像(eBee SQ)>地图(正马赛克)评估作物时,图像效果良好。它的大小是:1942819784,有4个波段 城市地图(eBee Plus/senseFly S.O

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

image = cv2.imread(sys.argv[1], cv2.IMREAD_LOAD_GDAL | cv2.IMREAD_COLOR)
问题在于特定图像
imread
返回
None
。我使用的图像来自:

使用RGB图像(eBee SQ)>地图(正马赛克)评估作物时,图像效果良好。它的大小是:1942819784,有4个波段

城市地图(eBee Plus/senseFly S.O.D.A.)>地图(正马赛克)中的图像不起作用。它的大小是:2674725388和4个波段

有什么可以帮助你找出问题所在吗

编辑:我尝试了@en_Loritai建议的解决方案,效果很好,问题是我需要用OpenCV进行一些图像处理,GDAL加载的图像有几个问题

  • GDAL将图像加载为RGB而不是BGR(在OpenCV中默认使用)
  • OpenCV期望的图像形状是(宽度、高度、通道),GDAL返回具有(通道、宽度、高度)形状的图像
  • GDAL返回的图像沿Y轴翻转,并顺时针旋转90度
OpenCV加载的图像是(大小调整为700x700):

GDAL加载的图像(当然,在更改形状后)是(大小调整为700x700)

最后,如果我尝试用

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数据堆栈。

这可能是因为您试图打开的图像的位深度。Opencv在这方面有点严格,更糟糕的是,当它得到它不能处理的东西时,它不会给你任何错误。如果您使用的是gdal,您可以使用它来打开图像。在本例中,它加载图像,但当我调用
cv2.imshow
时,图像加载的形状错误(它是(4,X,Y)而不是(X,Y,4),颜色错误(通道交换),在Y方向翻转,并在-90度方向旋转(水平方向)。是否有任何方法来纠正它,而不是手动进行(我的意思是,我可以使用
np.swapaxes
来重塑,使用
flip
来展开和
image[0]=tmp[2,:,:,:]
image[2]=tmp[0,:,:]
来交换频道,但速度非常慢)@RdlP颜色交换的原因是因为opencv。它使用BGR而不是RGB(gdal使用的)。您可以使用numpy方法或Opencvs自己的函数更改颜色:cv2.cvtColor(a_image,cv2.color_RGB2BGR)。形状更改将需要numpy方法/功能,但图像非常大,无论如何都会有点慢。我不能说图像翻转是opencv或gdal的结果,或者原始图像就是这样(我的笔记本电脑没有足够的内存来打开它)@en_lorithaiI将额外信息添加到主question@RdlP是的,我得到了一个类似的方法:g_image=gdal.Open('Water-scenes-014.jpg')a_image=g_image.ReadAsArray()s_image=np.dstack((a_image[0],a_image[1],a_image[2])s_image=cv2.cvtColor(s_image,cv2.COLOR_RGB2BGR)cv2.imshow('name',s_image)。问题是,我的计算机在试图准确打开您的图像时无法计算,我看到该图像有4个通道,而不是3个通道(但我认为等价物应该是np.dstack((a_-image[0]、a_-image[1]、a_-image[2]、a_-image[3])。如果您想避免颜色交换,可以使用plt.imshow()取而代之。谢谢你的帮助。我已将此答案标记为正确答案,因为你为我指明了正确的方向(使用GDAL打开图像)。我将研究是否有任何自动方法将GDAL图像转换为OpenCV