2012-01-12 11 views
5

Tengo cierta experiencia con R como plataforma de estadísticas, pero no tengo experiencia en matemáticas basadas en imágenes. Tengo una serie de fotografías (formato tiff, se conoce px/μm) con agujeros y curvas irregulares. Me gustaría medir la distancia más corta entre un agujero y la curva más cercana para ese agujero en particular. Me gustaría hacer esto por cada hoyo en una fotografía. Los agujeros tampoco son regulares, así que tal vez necesite decirle al programa cuáles son los agujeros y cuáles son las curvas (ImageJ tiene un punto y funciones de línea segmentadas).R/ImageJ: medición de la distancia más corta entre los puntos y las curvas

¿Alguna idea de cómo hacer esto? ¿Qué paquete debería usar en R? ¿Recomendarías otro programa para este tipo de tarea?

Example image

+2

En la parte superior de mi cabeza, primero iría con ImageJ. No soy un experto con esa herramienta, pero parece ser bueno para encontrar lugares y hacer cosas con ellos. –

+0

Es posible que Bio7 sea bueno para esta tarea. ¿Algún gurú de Bio7 por ahí? El programa hace tanto, que es difícil averiguar lo que realmente hace =) – Mikko

Respuesta

2

EDITAR: Hacer esto ahora es posible con el paquete sclero. El paquete está actualmente disponible en GitHub y el procedimiento se describe en detalle en the tutorial. Sólo para ilustrar, utilizo un ejemplo del 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

También es posible añadir tamaños de punto de muestra utilizando las funciones proporcionadas por el paquete esclero. Por favor, mira la Sección 2.5 en el tutorial.

1

Hay una herramienta para la detección de bordes escrito para J imagen que podría ayudarle a encontrar los agujeros primero y las líneas, y aclararlas. Lo encuentras en

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

Jugando con la configuración de la tresholding y la histéresis puede ayudar con el fin de obtener las líneas y los agujeros que se encuentran. Es difícil decir si esto tiene muchas posibilidades de funcionar sin ver sus fotografías reales, pero un colega mío tuvo buenos resultados al utilizar esta herramienta en imágenes FRAP. Programé una herramienta ImageJ que puede calcular recuperaciones en el análisis FRAP basado en esas imágenes. Puede obtener algunas ideas para usted mismo cuando mira el código (consulte: http://imagejdocu.tudor.lu/doku.php?id=plugin:analysis:frap_normalization:start)

La única manera que conozco de que puede trabajar con imágenes es usando EBImage que está contenido en el sistema de bioconductor. El paquete Rimage está huérfano, por lo que ya no se mantiene.

Para encontrar la distancia más corta: una vez que tenga las coordenadas de las líneas y los agujeros, puede elegir el enfoque de escopeta: calcule las distancias entre todos los puntos y la línea, y luego tome el mínimo. Un ejemplo de ello en 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 
    ) 
) 
} 

continuación:

> calc.distance(a.line,a.hole) 
[1] 95.51649 

que se puede comprobar matemáticamente mediante la derivación de las ecuaciones del círculo y la línea. Esto es lo suficientemente rápido si no tiene millones de puntos que describen miles de líneas y agujeros.

+0

Gracias por una respuesta útil Joris! Reemplacé la ilustración con una fotografía real. Probé tu complemento, pero dudo que pueda separar las líneas, que he marcado con rojo.¿Sabes si es posible definir manualmente los puntos y líneas y luego importarlos a EBImage? – Mikko

+1

@Largh: de hecho, olvídate de encontrar esas líneas en esa fotografía. Puede hacerlo manualmente en ImageJ también y luego exportar las coordenadas de esas líneas en un archivo csv. Ese archivo se puede leer con R. Lo mismo para los círculos (que EdgeDetection debería encontrar fácilmente). No puedo recordar de memoria cómo hacer eso en ImageJ, han pasado unos años desde que trabajé con él, pero está el libro de Burge and Burgers (que es excelente: http: //www.imagingbook .com /) y también tienen un Tutorial de ImageJ en el lateral. Además, hay mucha información sobre esto en la web. –

+0

Gracias de nuevo Joris. Me pregunto cómo transferir información de línea segmentada y puntual desde ImageJ o EBImage a R sin perder la información de píxel (o luego convertir píxeles a μm antes de la transferencia). Bio7 probablemente podría hacer esto, pero es bastante complicado de usar (muchos clics). – Mikko

Cuestiones relacionadas