我有一些R作为统计平台的经验,但对基于图像的数学经验不足。我有一系列照片(tiff格式,px /μm是已知的),带有孔和不规则曲线。我想测量一个孔与最接近的特定孔的曲线之间的最短距离。我想为照片中的每个洞做这个。这些孔也不规则,所以我可能需要告诉程序什么是孔,什么是曲线(ImageJ具有点和分段线功能)。R/ImageJ:测量点和曲线之间的最短距离
任何想法如何做到这一点?我应该在R中使用哪个包?你会推荐另一个程序来完成这种任务吗?
我有一些R作为统计平台的经验,但对基于图像的数学经验不足。我有一系列照片(tiff格式,px /μm是已知的),带有孔和不规则曲线。我想测量一个孔与最接近的特定孔的曲线之间的最短距离。我想为照片中的每个洞做这个。这些孔也不规则,所以我可能需要告诉程序什么是孔,什么是曲线(ImageJ具有点和分段线功能)。R/ImageJ:测量点和曲线之间的最短距离
任何想法如何做到这一点?我应该在R中使用哪个包?你会推荐另一个程序来完成这种任务吗?
编辑:这样做现在可以使用sclero软件包。该包装目前可在GitHub上找到,该程序在the tutorial中有详细描述。只是为了说明,我使用从教程的一个示例:
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)
另外,也可以添加使用由巩膜包中提供的功能的示例的光斑尺寸。请参阅教程中的第2.5节。
有针对图像J,可以帮助您先找到孔和线路,并澄清他们而写的边缘检测的工具。您在
http://imagejdocu.tudor.lu/doku.php?id=plugin:filter:edge_detection:start
找到将它与tresholding,滞后能以获得发现的线条和孔帮助设置混。很难说这是否有很大的机会没有看到你的实际照片,但我的一位同事在FRAP图像上使用这个工具有很好的效果。我编写了一个ImageJ工具,可以根据这些图像计算FRAP分析中的回收率。看代码时,你可能会得到一些想法,为自己(见:http://imagejdocu.tudor.lu/doku.php?id=plugin:analysis:frap_normalization:start)
我知道你可以用图像工作的唯一办法,是您使用了包含在Bioconductor的系统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
您可以通过从圆而行推导数学公式检查。如果您没有数百万个描述数千个线条和洞的点,则速度足够快。
感谢您的有用答案Joris!我用一张真实的照片替换了插图。我尝试了你的插件,但是怀疑它可以分开我标记为红色的线条。你知道吗,如果可以手动定义点和线,然后将它们导入EBImage? – Mikko 2012-01-12 16:17:35
@拉尔:的确,忘了在那张照片中找到那些线条。您也可以在ImageJ中手动执行此操作,然后将这些行的坐标导出到csv文件中。您可以用R读取该文件。对于圆圈(EdgeDetection应该可以轻松找到)可以找到相同的文件。我从头到尾都不记得如何在ImageJ中做到这一点,我已经使用它几年了,但有Burge和Burgers的书(这非常棒:http://www.imagingbook ),他们也有一个ImageJ教程。此外,网络上还有大量关于此的信息。 – 2012-01-12 16:53:35
再次感谢Joris。我想知道如何将点和分段线信息从ImageJ或EBImage转移到R,而不会丢失像素信息(或者在传输之前将像素转换为μm)。 Bio7可能可以做到这一点,但使用起来相当复杂(大量点击)。 – Mikko 2012-01-13 11:46:25
关闭我的头顶,我会先与ImageJ一起去。我不是那种工具的专家,但它似乎擅长找到点并与他们做事。 – 2012-01-12 12:18:56
这可能是因为Bio7可能适合完成这项任务。任何Bio7大师在那里?该程序做了太多,很难找出它实际上做了什么=) – Mikko 2012-01-13 11:42:25