我有一些Landsat 8图像,其CRS = EPSG:32610。我有一个地面真实图像,其中每个像素代表该区域的类,其CRS = EPSG:4326。
我试图像documentation这样说,在rasterio中转换地面实况的CRS:
dst_crs = raster.crs
transform, width, height = calculate_default_transform(
labels.crs, dst_crs, labels.width, labels.height, *labels.bounds)
kwargs = labels.meta.copy()
kwargs.update({
'crs': dst_crs,
'transform': transform,
'width': width,
'height': height
})
with rasterio.open('groundtruth.tif', 'w', **kwargs) as dst:
reproject(
source=rasterio.band(labels, 1),
destination=rasterio.band(dst, 1),
src_transform=labels.transform,
src_crs=labels.crs,
dst_transform=transform,
dst_crs=dst_crs,
resampling=Resampling.nearest)
这是转换前的标签(基本事实)元数据:
{'driver': 'GTiff',
'dtype': 'uint8',
'nodata': None,
'width': 4268,
'height': 4782,
'count': 1,
'crs': CRS.from_epsg(4326),
'transform': Affine(0.00032590510777881894, 0.0, -122.486874,
0.0, -0.0003259224173985775, 40.110855)}
这是在转换之后:
{'driver': 'GTiff',
'dtype': 'uint8',
'nodata': None,
'width': 3721,
'height': 5316,
'count': 1,
'crs': CRS.from_epsg(32610),
'transform': Affine(32.8370217224448, 0.0, 543729.4708124083,
0.0, -32.8370217224448, 4441798.7147279335)}
这是Landsat图像元数据:
{'driver': 'GTiff',
'dtype': 'int16',
'nodata': None,
'width': 7463,
'height': 7702,
'count': 6,
'crs': CRS.from_epsg(32610),
'transform': Affine(30.0, 0.0, 504045.0,
0.0, -30.0, 4421925.0)}
我知道我可以像这样在地球表面上找到像素的位置:
raster.transform * (x , y)
对于图像中的每个(x,y)位置。
我的问题是Landsat影像中的像素比例为30米。当我进行转换时,比例不是30x30。如果我使用labels.transform * (x, y)
,则它永远不会与Landsat图像中raster.transform * (x, y)
中的任何像素匹配,并且数字有很多小数位。
如何找到相应的像素?图像和地面真实图像来自同一站点,但不完全对齐,并且大小不同。
这种方法甚至对于寻找相应点是否正确?我的专业不是遥感,我对术语和CRS的细节也不熟悉。如果您能尽可能简单地向我解释,我将不胜感激。
答案 0 :(得分:1)
在用例中,您希望labels
图像与raster
图像完全对齐。
为此,您不应该使用calculate_default_transform
函数,因为您已经注意到,它给出的transform
,width
和height
与那些函数不完全匹配您参考的raster
图片中的一个。
相反,您应该将transform
的{{1}},width
和height
变量直接传递给raster
函数:
reproject
完成此操作后,kwargs = labels.meta.copy()
kwargs.update({
'crs': raster.crs,
'transform': raster.transform,
'width': raster.width,
'height': raster.height
})
with rasterio.open('groundtruth.tif', 'w', **kwargs) as dst:
reproject(
source=rasterio.band(labels, 1),
destination=rasterio.band(dst, 1),
src_transform=labels.transform,
src_crs=labels.crs,
dst_transform=raster.transform,
dst_crs=raster.crs,
resampling=Resampling.nearest)
和labels
图像应完全对齐,并且应该能够将两个图像的像素一一对应。