2012-01-12 18 views
5

Ho una certa esperienza con R come piattaforma di statistiche, ma sono inesperto in matematica basata sull'immagine. Ho una serie di fotografie (formato tiff, px/μm è noto) con buchi e curve irregolari. Mi piacerebbe misurare la distanza più breve tra un buco e la curva più vicina per quella particolare buca. Mi piacerebbe farlo per ogni buca in una fotografia. Anche i buchi non sono regolari, quindi forse dovrei dire al programma quali sono i buchi e quali sono le curve (ImageJ ha un punto e le funzioni di una linea segmentata).R/ImageJ: misurazione della distanza più breve tra punti e curve

Qualche idea su come procedere? Quale pacchetto dovrei usare in R? Consiglieresti un altro programma per questo tipo di attività?

Example image

+2

In cima alla mia testa, prima andavo con ImageJ. Non sono un esperto di questo strumento, ma sembra che sia bravo a trovare posti e fare cose con loro. –

+0

Potrebbe essere che Bio7 potrebbe essere buono per questo compito. Qualche guru Bio7 là fuori? Il programma fa così tanto, che è difficile capire cosa fa in realtà =) – Mikko

risposta

2

MODIFICA: Questa operazione è ora possibile utilizzando il pacchetto sclero. Il pacchetto è attualmente disponibile su GitHub e la procedura è descritta in dettaglio in the tutorial. Proprio per illustrare, io uso un esempio dal 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

E 'anche possibile aggiungere formati di punto di esempio utilizzando le funzioni previste dal pacchetto sclero. Si prega di consultare la sezione 2.5 nel tutorial.

1

C'è uno strumento per il rilevamento dei bordi scritto per J Immagine che potrebbe aiutare in primo luogo trovare i fori e le linee, e chiarire. Lo trovate in

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

Giocando intorno con le impostazioni per la tresholding e l'isteresi può contribuire al fine di ottenere le linee e buchi trovati. È difficile dire se questo ha molte possibilità di lavorare senza vedere le tue foto reali, ma un mio collega ha avuto buoni risultati usando questo strumento sulle immagini FRAP. Ho programmato uno strumento ImageJ in grado di calcolare i recuperi nell'analisi FRAP basata su quelle immagini. È possibile ottenere alcune idee da soli quando si guarda il codice (vedi: http://imagejdocu.tudor.lu/doku.php?id=plugin:analysis:frap_normalization:start)

L'unico modo in cui so che è possibile lavorare con le immagini, è utilizzando EBImage contenuto nel sistema di bioconduttori. Il pacchetto Rimage è orfano, quindi non è più gestito.

Per trovare la distanza più breve: una volta che hai le coordinate delle linee e dei fori, puoi scegliere l'approccio del fucile: calcola le distanze tra tutti i punti e la linea, quindi prendi il minimo. Un esempio a tale proposito 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 
    ) 
) 
} 

Poi:

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

quale è possibile controllare matematicamente derivando le equazioni dal cerchio e la linea. Questo va abbastanza veloce se non hai milioni di punti che descrivono migliaia di linee e buchi.

+0

Grazie per la risposta utile Joris! Ho sostituito l'illustrazione con una fotografia reale. Ho provato il tuo plugin, ma dubito che possa separare le linee, che ho segnato con il rosso.Sai, se è possibile definire manualmente i punti e le linee e quindi importarli in EBImage? – Mikko

+1

@Largh: in effetti, dimentica di trovare quelle linee in quella fotografia. Puoi farlo manualmente anche in ImageJ e poi esportare le coordinate di quelle linee in un file CSV. Quel file che puoi leggere con R. Lo stesso vale per i cerchi (che EdgeDetection dovrebbe trovare facilmente). Non riesco a ricordarmi da capo come farlo in ImageJ, sono passati alcuni anni da quando ci ho lavorato, ma c'è il libro di Burge and Burgers (che è eccellente: http: //www.imagingbook .com /) e hanno anche un tutorial di ImageJ sul lato. Inoltre, ci sono molte informazioni su questo sul web. –

+0

Grazie ancora Joris. Mi chiedo come trasferire il punto e le informazioni sulla linea segmentata da ImageJ o EBImage a R senza perdere le informazioni sui pixel (o convertendo i pixel in μm prima del trasferimento). Bio7 potrebbe probabilmente farlo, ma è piuttosto complicato da usare (molto clic). – Mikko

Problemi correlati