You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提取非零像素坐标后二值图像方向偏移及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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:48:29