2012-01-12 21 views
5

R platformunda bir istatistik olarak deneyimim var, ancak görüntü tabanlı matematikte deneyimsizim. Delikler ve düzensiz eğrilerle bir dizi fotoğrafım (tiff formatı, px/µm biliniyor) var. Bir delik ile bu delik için en yakın eğri arasındaki en kısa mesafeyi ölçmek istiyorum. Bir fotoğraftaki her delik için bunu yapmak isterim. Delikler de düzenli değildir, bu yüzden programın delikler ve eğrilerin neler olduğunu söylemem gerekir (ImageJ'nin bir nokta ve parçalanmış çizgi fonksiyonları vardır).R/ImageJ: Noktalar ve eğriler arasındaki en kısa mesafeyi ölçme

Nasıl yapılacağı hakkında herhangi bir fikrin var mı? R'de hangi paketi kullanmalıyım? Bu tür bir görev için başka bir program önerir misiniz?

Example image

+2

Başımın üstünden, önce ImageJ ile giderdim. Bu araçla ilgili bir uzman değilim, ancak noktalar bulmakta ve onlarla bir şeyler yapmakta iyi görünüyor. –

+0

Bu görev için Bio7'nin iyi olması olabilir. Orada herhangi bir Bio7 gurusu mu var? Program o kadar çok şey yapar ki, aslında ne yaptığını anlamak zor =) – Mikko

cevap

2

DÜZENLEME: Bunu yapmak artık sklero paketi kullanarak mümkündür. Paket şu anda GitHub üzerinde kullanılabilir ve prosedür the tutorial içinde ayrıntılı olarak açıklanmıştır. Sadece ben öğretici bir örnek kullanın göstermek için: sklerokoroidal paket tarafından sağlanan işlevleri kullanarak örnek nokta boyutlarını eklemek de mümkündür

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

. Öğreticideki Bölüm 2.5'e bakınız.

1

ilk delik ve satırları bulmalarına yardımcı olun ve onları açıklamak olabilir Görüntü J için yazılmış kenar tespiti için bir araç var. Sen tresholding ve bulunan çizgiler ve delikleri almak için yardımcı olabilir histerezisi için ayarlarla etrafında oynamak

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

adresinde bulabilirsiniz. Gerçek fotoğraflarınızı görmeden çalışma şansının olup olmadığını söylemek zor, ancak bir meslektaşımın bu aracı FRAP görüntülerinde kullanarak iyi sonuçları oldu. Bu görüntülere dayanarak FRAP analizinde geri kazanımları hesaplayabilen bir ImageJ aracı programladım. Kod bakarken kendiniz için bazı fikirler alabilirsiniz (bkz: http://imagejdocu.tudor.lu/doku.php?id=plugin:analysis:frap_normalization:start)

Görüntülerle çalışabileceğinizi bildiğim tek yol, biyoiletken sistemde bulunan EBImage kullanarakdır. Rimage paketi artık yok, yani artık korunmuyor.

En kısa mesafeyi bulmak için: Çizgiler ve deliklerin koordinatlarına sahip olduktan sonra, av tüfeği yaklaşımına gidebilirsiniz: tüm noktalar ve çizgi arasındaki mesafeleri hesaplayın ve sonra en azını alın. R olduğu hakkında bir resim: Daha sonra

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 

çemberin ve hattan denklemleri türetmek matematiksel kontrol edebilir. Binlerce çizgi ve delik açıklayan milyonlarca noktanız yoksa, bu işlem yeterince hızlı gerçekleşir.

+0

Yardımcı yardımlar için teşekkürler Joris! Ben illüstrasyonu gerçek bir fotoğrafla değiştirdim. Eklentinizi denedim, ancak kırmızıyla işaretlediğim çizgileri ayırabileceğinden şüpheliyim.Eğer noktaları ve çizgileri manuel olarak tanımlamak ve bunları EBImage'a aktarmak mümkün olursa, biliyor musunuz? – Mikko

+1

@Largh: Gerçekten, o fotoğraftaki çizgileri bulmayı unutun. Bunu elle de ImageJ'de yapabilir ve sonra bu satırların koordinatlarını bir csv dosyasında dışa aktarabilirsiniz. R ile okuyabileceğiniz bu dosya Daireler için de aynıdır (EdgeDetection kolayca bulmalıdır). Kafamın tepesinden hatırlayamıyorum, bunu ImageJ'de yapmam, birkaç yıldan beri çalışıyorum, ama Burge ve Burgers kitabı var (mükemmel: http: //www.imagingbook .com /) ve ayrıca yanında bir ImageJ Eğitimi var. Ayrıca, bu konuda internette birçok bilgi var. –

+0

Tekrar teşekkürler Joris. Piksel bilgisini kaybetmeden (veya transferden önce µm'ye pikselleri dönüştürmeden) nokta ve parçalara ayrılmış çizgi bilgilerini ImageJ veya EBImage'dan R'ye aktarmayı merak ediyorum. Bio7 muhtemelen bunu yapabilir, ancak kullanımı oldukça karmaşıktır (birçok tıklama). – Mikko

İlgili konular