R / ImageJ: измерение кратчайшего расстояния между точками и кривыми - PullRequest
5 голосов
/ 12 января 2012

У меня есть некоторый опыт работы с R в качестве платформы статистики, но я неопытен в математике, основанной на изображениях. У меня есть серия фотографий (формат TIFF, известен px / µm) с дырками и неправильными кривыми. Я хотел бы измерить кратчайшее расстояние между отверстием и ближайшей кривой для этого конкретного отверстия. Я хотел бы сделать это для каждой дыры в фотографии. Отверстия также не являются регулярными, поэтому, возможно, мне нужно будет сообщить программе, что такое отверстия и что такое кривые (ImageJ имеет функции точек и сегментированных линий).

Есть идеи, как это сделать? Какой пакет я должен использовать в R? Вы бы порекомендовали другую программу для такого рода задач?

Example image

Ответы [ 2 ]

2 голосов
/ 23 апреля 2012

РЕДАКТИРОВАТЬ: Теперь это можно сделать с помощью пакета sclero. Пакет в настоящее время доступен на GitHub , и процедура подробно описана в учебном пособии . Просто чтобы проиллюстрировать, я использую пример из учебника:

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

Также возможно добавить размеры пятна образца, используя функции, предоставляемые пакетом sclero. Пожалуйста, смотрите раздел 2.5 в руководстве.

1 голос
/ 12 января 2012

Для Image J написан инструмент для обнаружения краев, который может помочь вам сначала найти отверстия и линии и прояснить их.Вы найдете его в

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

Игра с настройками трешолдинга и гистерезисом может помочь найти линии и отверстия.Трудно сказать, есть ли у этого много шансов на работу, не видя ваших реальных фотографий, но мой коллега добился хороших результатов, используя этот инструмент на изображениях FRAP.Я запрограммировал инструмент ImageJ, который может рассчитывать восстановления в анализе FRAP на основе этих изображений.Вы можете получить некоторые идеи для себя, глядя на код (см .: http://imagejdocu.tudor.lu/doku.php?id=plugin:analysis:frap_normalization:start)

Единственный способ, которым я знаю, что вы можете работать с изображениями, - это использовать EBImage, который содержится в биокондукторесистема.Пакет Rimage является осиротевшим, поэтому больше не поддерживается.

Чтобы найти кратчайшее расстояние: получив координаты линий и отверстий, вы можете перейти к подходу с дробовиком: рассчитайте расстояния между всемиточки и линии, а затем взять минимум.Иллюстрация об этом в 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
    )
  )
}

Тогда:

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

Что вы можете проверить математически, выведя уравнения из круга и линии.Это происходит достаточно быстро, если у вас нет миллионов точек, описывающих тысячи линий и дырок.

...