R / ImageJ: Mesure de distance la plus courte entre les points et les courbes
Question
J'ai une certaine expérience avec R comme plate-forme de statistiques, mais je suis sans expérience en mathématiques à base d'image. J'ai une série de photographies (format tiff, px / um est connu) avec des trous et des courbes irrégulières. Je voudrais mesurer la distance la plus courte entre un trou et la courbe la plus proche de ce trou particulier. Je voudrais le faire pour chaque trou dans une photographie. Les trous ne sont pas réguliers non plus, je alors peut-être besoin de dire au programme quels sont les trous et quelles sont les courbes (ImageJ a un point et les fonctions de ligne segmentés).
Toutes les idées comment faire cela? Quel forfait dois-je utiliser dans R? Recommanderiez-vous un autre programme pour ce genre de tâche?
La solution
EDIT: Faire cela est maintenant possible en utilisant package scléro. Le paquet est actuellement disponible sur GitHub et la procédure est décrite en détail dans le tutoriel . Pour illustrer, j'utiliser un exemple du tutoriel:
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)
Il est également possible d'ajouter des tailles de tache échantillon à l'aide des fonctions fournies par le paquet scléro. S'il vous plaît voir la section 2.5 dans le tutoriel.
Autres conseils
Il y a un outil pour la détection de bord écrit pour l'image J qui pourrait vous aider à trouver d'abord les trous et les lignes, et les clarifier. Vous le trouverez à
http://imagejdocu.tudor.lu/doku. php id = plug-in: filtre: edge_detection: commencer
Jouer avec les paramètres du seuillage et la boîte hystérésis aide afin d'obtenir les lignes et les trous trouvés. Il est difficile de dire si cela a beaucoup de chance de travailler sans voir vos images réelles, mais un de mes collègues avait de bons résultats à l'aide de cet outil sur les images FRAP. J'ai programmé un outil ImageJ qui permet de calculer les recouvrements dans l'analyse de FRAP en fonction de ces images. Vous pourriez avoir quelques idées pour vous-même en regardant le code (voir: http://imagejdocu.tudor.lu/doku.php?id=plugin:analysis:frap_normalization:start )
La seule façon que je sais que vous pouvez travailler avec des images, est à l'aide EBImage
qui est contenu dans le système bioconductor. Le Rimage
paquet est devenu orphelin, donc n'est plus maintenu.
Pour trouver la distance la plus courte: une fois que vous avez les coordonnées des lignes et des trous, vous pouvez opter pour l'approche de fusil de chasse: calculer les distances entre tous les points et la ligne, puis prendre le minimum. Une illustration à ce sujet dans 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
)
)
}
Alors:
> calc.distance(a.line,a.hole)
[1] 95.51649
Que vous pouvez vérifier mathématiquement en dérivant les équations du cercle et de la ligne. Cela va assez vite si vous n'avez pas des millions de points décrivant des milliers de lignes et des trous.