我有一些使用 R 作为统计平台的经验,但在基于图像的数学方面缺乏经验。我有一系列带有孔和不规则曲线的照片(tiff 格式,px/µm 已知)。我想测量一个洞和那个特定洞的最近曲线之间的最短距离。我想对照片中的每个洞都这样做。这些孔也不是规则的,所以也许我需要告诉程序什么是孔,什么是曲线(ImageJ 具有点和分段线功能)。
任何想法如何做到这一点?我应该在 R 中使用哪个包?您会为此类任务推荐另一个程序吗?
编辑:现在可以使用 sclero 包执行此操作。该软件包目前在GitHub 上可用,教程中详细描述了该过程。只是为了说明,我使用教程中的一个例子:
library(devtools)
install_github("MikkoVihtakari/sclero", dependencies = TRUE)
library(sclero)
path <- file.path(system.file("extdata", package = "sclero"), "shellspots.zip")
dat <- read.ijdata(path, scale = 0.7812, unit = "um")
shell <- convert.ijdata(dat)
aligned <- spot.dist(shell)
plot(aligned)
也可以使用 sclero 包提供的功能添加样本点大小。请参阅教程中的第 2.5 节。
有一个为 Image J 编写的边缘检测工具,可以帮助您首先找到孔和线,并澄清它们。你可以在
http://imagejdocu.tudor.lu/doku.php?id=plugin:filter:edge_detection:start
调整阈值和滞后的设置有助于找到线和孔。如果没有看到您的实际照片,很难判断这是否有很大的工作机会,但我的一位同事在 FRAP 图像上使用此工具取得了良好的效果。我编写了一个 ImageJ 工具,该工具可以根据这些图像计算 FRAP 分析中的回收率。查看代码时,您可能会得到一些想法(参见: http://imagejdocu.tudor.lu/doku.php?id=plugin:analysis: frap_normalization :start )
我知道您可以使用图像的唯一方法是使用EBImage
包含在生物导体系统中的图像。该包Rimage
是孤立的,因此不再维护。
求最短距离:一旦有了线和孔的坐标,就可以采用霰弹枪法:计算所有点与线之间的距离,然后取最小值。R 中关于它的说明:
x <- -100:100
x2 <- seq(-70,-50,length.out=length(x)/4)
a.line <- list(x = x,
y = 4*x + 5)
a.hole <- list(
x = c(x2,rev(x2)),
y = c(200 + sqrt(100-(x2+60)^2),
rev(200 - sqrt(100-(x2+60)^2)))
)
plot(a.line,type='l')
lines(a.hole,col='red')
calc.distance <- function(line,hole){
mline <- matrix(unlist(line),ncol=2)
mhole <- matrix(unlist(hole),ncol=2)
id1 <- rep(1:nrow(mline),nrow(mhole))
id2 <- rep(1:nrow(mhole), each=nrow(mline))
min(
sqrt(
(mline[id1,1]-mhole[id2,1])^2 +
(mline[id1,2]-mhole[id2,2])^2
)
)
}
然后 :
> calc.distance(a.line,a.hole)
[1] 95.51649
您可以通过从圆和线推导出方程来进行数学检查。如果您没有数百万个点来描述数以千计的线和孔,那么这会足够快。