R语言stars栅格裁剪后执行边缘检测出现NA错误如何解决?
问题原因
st_crop 裁剪栅格时会默认将裁剪边界外的像元赋值为NA,而边缘检测函数edge.detect默认不支持处理含NA值的输入数组,因此触发报错。
解决方法
你可以根据数据场景选择以下任意一种方案处理:
- 方案1:裁剪后替换NA值为背景有效值
这是兼容性最好的方案,不会影响裁剪区域内的检测结果,你可以根据栅格数值范围将NA替换为0、栅格最小非NA值等合理背景值。
完整代码如下:
# 执行裁剪 raster_cropped <- st_crop(raster, other_object) # 替换NA为0(可根据实际情况调整替换值) raster_cropped[[1]][is.na(raster_cropped[[1]])] <- 0 # 执行边缘检测并可视化 image(rot90c(edge.detect(raster_cropped[[1]], thresh1=1, thresh2=80, noise="gaussian", noise.s=3, method="Canny")))
- 方案2:给
edge.detect添加na.rm参数
如果你使用的是较新版本的starsExtra包,edge.detect已经内置了NA值处理逻辑,直接传入na.rm = TRUE参数即可:
image(rot90c(edge.detect(st_crop(raster,other_object)[[1]], thresh1=1, thresh2=80, noise="gaussian", noise.s=3, method="Canny", na.rm = TRUE)))
- 方案3:裁剪时避免生成NA
如果你希望严格保留原始像元值,也可以通过调整裁剪参数,仅保留裁剪范围内完整覆盖的像元,避免生成NA:
raster_cropped <- st_crop(raster, st_bbox(other_object), snap = "out") # 后续直接执行边缘检测即可 image(rot90c(edge.detect(raster_cropped[[1]], thresh1=1, thresh2=80, noise="gaussian", noise.s=3, method="Canny")))
内容的提问来源于stack exchange,提问作者coder11
相关产品推荐
相关产品推荐

