【发布时间】:2017-11-13 13:10:15
【问题描述】:
我有一个非常简单的 Python 程序,带有 OpenCV 和 GDAL。在这个程序中,我使用以下行读取 GeoTiff 图像
image = cv2.imread(sys.argv[1], cv2.IMREAD_LOAD_GDAL | cv2.IMREAD_COLOR)
问题在于特定图像imread 返回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 返回具有(通道、宽度、高度)形状的图像
- GDAL 返回的图像在 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)
问题是我认为这是一个非常缓慢的过程,我想知道是否有自动转换过程。
【问题讨论】:
-
这可能是因为您尝试打开的图像的位深度。 Opencv 在这方面有点严格,更糟糕的是,当它得到它无法处理的东西时,它不会给你任何错误。如果您使用的是 gdal,则可以使用它来打开图像。
标签: python opencv gis gdal geotiff