【问题标题】:Returning the 8 points directly adjacent to a point in a connected 2-D raster返回与连接的二维栅格中的点直接相邻的 8 个点
【发布时间】:2016-02-23 18:50:10
【问题描述】:

我目前正在研究确定光栅图像中像素连接性的代码。我目前在选择给定像素的最小距离内的所有像素时遇到问题。

这行代码的目标是从矩阵中提取一个子集,其条目如下所示:

             jcol      icol    valcol
300   0.005076142 0.8860759 0.0000000
27077 0.862944162 0.2911392 0.0000000
30604 0.974619289 0.4746835 0.0000000
3138  0.096446701 0.7341772 0.0000000
9926  0.314720812 0.4240506 0.0000000
27328 0.868020305 0.8734177 0.0000000
17624 0.558375635 0.8417722 0.0000000
13117 0.416243655 0.4936709 0.0000000
22622 0.720812183 0.2721519 0.6509804
15720 0.497461929 0.8670886 0.0000000

其中 jcol 是相对 y 位置,icol 是相对 x 位置,valcol 是像素 (x,y) 处的光栅值。该矩阵覆盖整个栅格。

目前我正在尝试使用subset 函数来完成这项任务:

P_N = subset(cluster.matrix, abs(cluster.matrix[,1]-x_N[,1]) == xthresh | abs(cluster.matrix[,2]-x_N[,2]) == ythresh)

其中xhtreshythresh 表示样本点x_N 周围的距离,该点是从原始点中选择的(示例如下):

     jcol      icol    valcol 
3099    1 0.6518987 0.4862745

问题是我得到了P_N 的以下输出:

[1] jcol     icol     valcol
<0 rows> (or 0-length row.names)

理想情况下,P_N 将返回与x_N 直接相邻的 8 个点

我认为我在子集函数中的语法是错误的,特别是因为 x_N 是一个 1x4 数据条目,而 cluster.matrix 是一个 ~7000x4 矩阵。

【问题讨论】:

  • 可能 raster::clump (see e.g. here) 帮助您解决更大的问题,关于光栅中像素的连接性?
  • 我建议您将“==”符号替换为“
  • clump 的行中,另请参阅this gist,您可以为其指定邻域距离(ping @JoshO'Brien)。
  • @jbaums 我找到了一个修复程序,并在my own fork of that gist 中进行了编辑。 (基本上避免了我遇到的错误,我需要通过添加以下行来以几种方式完善pypathpypath &lt;- tools::file_path_sans_ext(normalizePath(pypath))。不过,我并不真正熟悉 gists 的工作原理。有什么方法你可以将该修复和 Pakillo 合并到您的原始要点中吗?
  • @jbaums 嗨,约翰。是的,我就是这么用的。 (我通过首先打开 OSGeo4W 并弄清楚它想要什么命令然后从那里返回来调试 polygonizer()。事实上,至少在我的机器上,只需执行 pypath &lt;- "gdal_polygonize" 就可以了。我有点期待它也可以在其他安装了 OSGeo4W64 的 Windows 机器上执行此操作,尽管在 Sys.which() 的搜索路径上查找它似乎没有太大的危害。)再次感谢您向我指出这些要点!

标签: r algorithm subset distance raster


【解决方案1】:

我想你想要raster::adjacent

library(raster)
r <- raster(matrix(runif(100), 10))
cells <- adjacent(r, 34, 8, pairs=FALSE)
adj <- cbind(xyFromCell(r, cells), value=extract(r, cells))

上面,adjacent 返回栅格r 的第 34 单元格相邻的 8 个单元格的单元格编号。您还可以传递可能从距离矩阵/栅格中派生的邻域矩阵 - 请参阅?adjacent 上的参数 directions 的帮助。

然后我们使用xyFromCell 提取x 和y 坐标,使用extract 提取单元格值(或者我们可以只使用r[cells])。

【讨论】:

  • 感谢您的建议——使用adjacent 时,如何使用cells 参数识别特定单元格?描述中的约定似乎含糊不清。
  • @TimColeman - 您是在问如何指定要检查邻接的单元格吗?如果您有坐标并需要获取手机号码,您可以使用cellFromXY
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多