【发布时间】:2016-03-23 16:14:24
【问题描述】:
我正在尝试使用 R 测量感兴趣对象之间的距离(在本示例中为树中的年轮)。My earlier attempt 非常复杂,以至于我很难使用不同类型的数字重现类似类型问题的解决方案.我认为必须有一种更简单的方法来进行测量。尽管 ImageJ 可能用于图片分析,但我发现它太笨拙,无法用于重复性工作。为什么不使用图像处理程序用不同的颜色标记感兴趣的对象并尝试提取有关其位置的信息? (这不是问题)。这是一个例子:
(将图片另存为tree.jpg)。为了测量从开始(蓝点)到红点和绿点(代表两个不同的任意测量值)的距离,我需要提取每个点的质心和颜色特征(即点是绿色、蓝色还是红色)图片中的点。
我使用的颜色如下:
cols <- list(red = rgb(255/255, 0/255, 0/255), green = rgb(0/255, 255/255, 0/255), blue = rgb(0/255, 0/255, 255/255))
我已成功打开文件并绘制它:
library("jpeg")
img <- readJPEG("tree.jpg")
ydim <- attributes(img)$dim[1] # Image dimension y-axis
xdim <- attributes(img)$dim[2] # Image dimension x-axis
plot(c(0,xdim), c(0,ydim), type='n')
rasterImage(img, 0,0,xdim,ydim)
图中的尺寸以像素为单位。我还可以在其中一个 RGB 通道中提取信息(此处为绿色):
plot(c(0,xdim), c(0,ydim), type='n')
rasterImage(img[,,2], 0,0,xdim,ydim)
在此之后,我开始遇到问题。我发现Momocs package 可能能够从 RGB 通道矩阵中提取形状,但我怀疑它是否是解决此问题的正确工具。也许其中一个空间包可以工作? (不过,我没有找到用于此目的的功能)。如何使用 R 从图像中提取彩色点的位置(使用任意坐标系以像素为单位)?
【问题讨论】:
-
这不是您真正想要的答案,但我建议提取一条线上的所有点,然后处理这条线(例如使用微分滤波器,并寻找零交叉点)。一旦图像被表示为 2D 矩阵,您应该能够很容易地沿一条线插入像素(不需要特殊的图像处理包)。
-
好吧,如果您相信您想要的“红色”点在红色层中具有较大的值,那么
which(img[,,1] > x, array.indices=TRUE)将定位这些点(选择一些阈值x值)。抱歉,如果第一层不是红色的。如果您需要找到簇的质心,请查看spatstat是否可以提供帮助。