提取非零像素坐标后二值图像方向偏移及Shapefile翻转问题求助
解决Shapefile翻转与坐标显示异常的问题
这个问题本质是图像坐标系和常规/地理坐标系的y轴方向不一致导致的,咱们来一步步拆解原因和解决方案:
问题根源
- NumPy存储图像时,行索引(对应图像的y轴)是从上到下递增的——也就是图像顶部是y=0,越往下y值越大
- 而
plt.scatter用的是常规笛卡尔坐标系,y轴是从下到上递增的;同时地理坐标系(比如UTM)的北向(y轴)也是向上递增的 - 你用
imshow显示图像正常,是因为imshow默认适配了图像的存储坐标系,但直接把NumPy提取的y坐标用于scatter或地理转换时,就会出现翻转
代码修正步骤
1. 修正坐标翻转问题
在你提取骨架坐标后的转换步骤中,需要先翻转y坐标,再加上原图像的偏移量:
# 原代码的坐标转换(存在问题) # x = x + 25500 # y = y + 28500 # 修正后的代码 crop_height = image_crop.shape[0] # 获取裁剪后图像的高度,此处为30000-28500=1500 # 翻转y坐标:将图像从上到下的索引转为从下到上的索引 y_flipped = 28500 + (crop_height - 1 - y) x_original = x + 25500 # x轴方向与常规坐标系一致,直接加偏移即可
2. 结合地理参考数据的正确转换
当你从TIFF提取地理参考后,要注意GDAL的地理变换参数默认是左上角为原点,y轴向下递减的,所以转换为地理坐标时要配合修正后的y值:
# 获取原图像的地理变换参数 geo_transform = ds.GetGeoTransform() # 转换为地理坐标 x_geo = geo_transform[0] + x_original * geo_transform[1] y_geo = geo_transform[3] + y_flipped * geo_transform[5]
这里geo_transform[5]是y方向的分辨率,通常为负数,刚好配合翻转后的y索引得到正确的北向坐标。
3. 验证修正效果
可以用scatter验证坐标方向:
plt.scatter(x_original, y_flipped) plt.gca().invert_yaxis() # 可选:如果要匹配imshow的显示效果,可以反转y轴 plt.show()
这时候scatter的点分布应该和imshow显示的骨架完全一致。
额外注意点
- 你代码里的
plt.imshow(coord[:,0],coord[:,1])是错误的,应该用plt.scatter(coords[:,0], coords[:,1])来显示坐标点 - 骨架化后的坐标提取
y,x = np.nonzero(skel)是正确的,nonzero返回的是(行,列),对应图像的(y,x)
内容的提问来源于stack exchange,提问作者janema
相关产品推荐
相关产品推荐

