R / ImageJ: Messung des kürzesten Abstands zwischen Punkten und Kurven
Frage
Ich habe einige Erfahrungen mit R als Statistikplattform, bin aber unerfahren in bildbasierter Mathematik.Ich habe eine Reihe von Fotografien (TIFF-Format, px / µm ist bekannt) mit Löchern und unregelmäßigen Kurven.Ich möchte den kürzesten Abstand zwischen einem Loch und der nächsten Kurve für dieses bestimmte Loch messen.Ich möchte dies für jedes Loch in einem Foto tun.Die Löcher sind auch nicht regelmäßig, daher muss ich dem Programm möglicherweise mitteilen, was Löcher und was Kurven sind (ImageJ verfügt über Funktionen für Punkte und segmentierte Linien).
Irgendwelche Ideen, wie das geht?Welches Paket soll ich in R verwenden?Würden Sie ein anderes Programm für diese Art von Aufgabe empfehlen?
Lösung
BEARBEITEN: Dies ist jetzt mit dem Skleropaket möglich.Das Paket ist derzeit unter GitHub verfügbar. Die Vorgehensweise wird ausführlich in das Tutorial .Zur Veranschaulichung verwende ich ein Beispiel aus dem 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)
Mit den Funktionen des sclero-Pakets können auch Stichprobenfleckgrößen hinzugefügt werden.Bitte lesen Sie Abschnitt 2.5 im Tutorial.
Andere Tipps
Für Image J wurde ein Tool zur Kantenerkennung geschrieben, mit dem Sie zuerst die Löcher und Linien finden und klären können. Sie finden es unter
http://imagejdocu.tudor.lu/doku. php? id= plugin: filter: edge_detection: start
Das Herumspielen mit den Einstellungen für die Schwellenwertbildung und die Hysterese kann hilfreich sein, um die gefundenen Linien und Löcher zu erhalten. Es ist schwer zu sagen, ob dies eine große Chance hat, ohne Ihre tatsächlichen Fotos zu sehen, aber ein Kollege von mir hat mit diesem Tool gute Ergebnisse bei FRAP-Bildern erzielt. Ich habe ein ImageJ-Tool programmiert, das anhand dieser Bilder Wiederherstellungen in der FRAP-Analyse berechnen kann. Wenn Sie sich den Code ansehen, erhalten Sie möglicherweise einige Ideen (siehe: ) http://imagejdocu.tudor.lu/doku.php?id=plugin:analysis:frap_normalization:start )
Ich weiß nur, dass Sie mit Bildern arbeiten können, indem Sie EBImage
verwenden, der im Bioconductor-System enthalten ist. Der Rimage
des Pakets ist verwaist und wird daher nicht mehr verwaltet.
So finden Sie die kürzeste Entfernung: Sobald Sie die Koordinaten der Linien und Löcher haben, können Sie sich für die Schrotflinte entscheiden: Berechnen Sie die Abstände zwischen allen Punkten und der Linie und nehmen Sie dann das Minimum. Eine Illustration dazu in 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
)
)
}
Dann:
> calc.distance(a.line,a.hole)
[1] 95.51649
Was Sie mathematisch überprüfen können, indem Sie die Gleichungen aus dem Kreis und der Linie ableiten. Dies geht schnell genug, wenn Sie nicht Millionen von Punkten haben, die Tausende von Linien und Löchern beschreiben.