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加载的图像有几个问题
- GDAL 将图像加载为 RGB 而不是 BGR(在 OpenCV 中默认使用)
- OpenCV 期望的图像形状是(宽度、高度、通道)和 GDAL return 具有(通道、宽度、高度)形状的图像
- GDALreturn生成的图像在Y轴上翻转并顺时针旋转90度。
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。
我在 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加载的图像有几个问题
- GDAL 将图像加载为 RGB 而不是 BGR(在 OpenCV 中默认使用)
- OpenCV 期望的图像形状是(宽度、高度、通道)和 GDAL return 具有(通道、宽度、高度)形状的图像
- GDALreturn生成的图像在Y轴上翻转并顺时针旋转90度。
OpenCV加载的图像是(调整为700x700):
GDAL 加载的图像(当然是在改变形状之后)是(调整为 700x700)
最后,如果我尝试使用
将此图像从 BGR 转换为 RGBimage = 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。