2012-01-12 65 views
5

統計プラットフォームとしてRを使用した経験がありますが、画像ベースの数学では経験がありません。私は穴と不規則な曲線を持つ一連の写真(tiff形式、px /μmは知られています)を持っています。私は穴とその特定の穴の最も近い曲線の間の最短距離を測定したいと思います。私は写真の穴ごとにこれをしたいと思います。穴も規則的ではないので、プログラムに穴が何か、どのような曲線(ImageJに点と線分の関数があるか)を伝える必要があるかもしれません。R/ImageJ:点と曲線の間の最短距離を測定する

どのようにすればいいですか?どのパッケージをRで使うべきですか?あなたはこの種の仕事のために別のプログラムを勧めますか?

Example image

+2

私の頭の上から外れて、私はImageJと最初に行くだろう。私はそのツールの専門家ではありませんが、スポットを見つけてそれらを使ってうまくやっているようです。 –

+0

これは、Bio7がこの作業に適している可能性があります。そこにあるBio7の教祖?プログラムは本当に何かを理解するのは難しいですね。) – Mikko

答えて

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のために書かれたエッジ検出のためのツールがあります。あなたはtresholding、見つかった線や穴を得るために助けることができるヒステリシスの設定で遊んで

http://imagejdocu.tudor.lu/doku.php?id=plugin:filter:edge_detection:start

でそれを見つけます。あなたの実際の写真を見ることなくこれが働く機会が多いかどうかを知ることは難しいですが、私の同僚はこのツールをFRAP画像に使用して良い結果を得ていました。私は、これらの画像に基づいてFRAP解析で回復を計算できるImageJツールをプログラミングしました。コードを見るときにあなた自身のアイデアを得るかもしれません(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 

あなたがサークルとラインから次方程式を導出することにより、数学的に確認することができます。何千もの行と穴を記述する何百万ものポイントを持っていなければ、これは十分に速くなります。

+0

助けてくれてありがとうJoris!イラストを本物の写真に置き換えました。私はあなたのプラグインを試しましたが、私が赤でマークした行を分けることができるのではないかと疑います。ポイントとラインを手動で定義してからEBImageにインポートすることが可能な場合は、ご存知ですか? – Mikko

+1

@ Largh:確かに、その写真の中のそれらの行を見つけることを忘れてしまいます。 ImageJでも手動で行うことができ、csvファイルでそれらの行の座標をエクスポートすることができます。このファイルはRで読み取ることができます。サークルと同じです(Edge Detectionが簡単に見つかるはずです)。私はImageJでこれを行う方法を私の頭の上から覚えていません。私はそれを使って作業してから数年経ちましたが、BurgeとBurgersの本(素晴らしいです:http://www.imagingbook .com /)、彼らはまた側にImageJチュートリアルを持っています。加えて、これに関する情報はウェブ上にたくさんあります。 –

+0

もう一度Jorisに感謝します。 ImageJやEBImageからポイント情報やセグメント化されたライン情報をピクセル情報を失うことなく(または転送前に画素をμmに変換することなく)どのように転送するのだろうか。 Bio7はおそらくこれを行うことができますが、使用するのはかなり複雑です(たくさんのクリック)。 – Mikko

関連する問題