2012-01-12 194 views
5

我有一些R作为统计平台的经验,但对基于图像的数学经验不足。我有一系列照片(tiff格式,px /μm是已知的),带有孔和不规则曲线。我想测量一个孔与最接近的特定孔的曲线之间的最短距离。我想为照片中的每个洞做这个。这些孔也不规则,所以我可能需要告诉程序什么是孔,什么是曲线(ImageJ具有点和分段线功能)。R/ImageJ:测量点和曲线之间的最短距离

任何想法如何做到这一点?我应该在R中使用哪个包?你会推荐另一个程序来完成这种任务吗?

Example image

+2

关闭我的头顶,我会先与ImageJ一起去。我不是那种工具的专家,但它似乎擅长找到点并与他们做事。 – 2012-01-12 12:18:56

+0

这可能是因为Bio7可能适合完成这项任务。任何Bio7大师在那里?该程序做了太多,很难找出它实际上做了什么=) – Mikko 2012-01-13 11:42:25

回答

2

编辑:这样做现在可以使用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) 

enter image description here

另外,也可以添加使用由巩膜包中提供的功能的示例的光斑尺寸。请参阅教程中的第2.5节。

1

有针对图像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 

您可以通过从圆而行推导数学公式检查。如果您没有数百万个描述数千个线条和洞的点,则速度足够快。

+0

感谢您的有用答案Joris!我用一张真实的照片替换了插图。我尝试了你的插件,但是怀疑它可以分开我标记为红色的线条。你知道吗,如果可以手动定义点和线,然后将它们导入EBImage? – Mikko 2012-01-12 16:17:35

+1

@拉尔:的确,忘了在那张照片中找到那些线条。您也可以在ImageJ中手动执行此操作,然后将这些行的坐标导出到csv文件中。您可以用R读取该文件。对于圆圈(EdgeDetection应该可以轻松找到)可以找到相同的文件。我从头到尾都不记得如何在ImageJ中做到这一点,我已经使用它几年了,但有Burge和Burgers的书(这非常棒:http://www.imagingbook ),他们也有一个ImageJ教程。此外,网络上还有大量关于此的信息。 – 2012-01-12 16:53:35

+0

再次感谢Joris。我想知道如何将点和分段线信息从ImageJ或EBImage转移到R,而不会丢失像素信息(或者在传输之前将像素转换为μm)。 Bio7可能可以做到这一点,但使用起来相当复杂(大量点击)。 – Mikko 2012-01-13 11:46:25