Как я могу измерить расстояние двух объектов в изображении в R? - PullRequest
0 голосов
/ 07 ноября 2019

В настоящее время я борюсь с некоторым анализом изображений. У меня есть изображения сосудистой сети эмбрионов рыбок данио, и я хочу измерить расстояние между определенными элементами (от самой высокой точки до самой низкой и т. Д.).
Я обработал изображения, чтобы сделать их более заметными (более контрастными) с помощью EBImage
as shown in image.

Буду признателен за любые рекомендации.

1 Ответ

0 голосов
/ 09 ноября 2019

Поскольку вы используете R и EBImage, я бы предположил, что для анализа требуется больше, чем просто извлечение измерений из изображения. Если является всем, что вы намереваетесь, другое программное обеспечение, такое как Фиджи или более рациональный предшественник, ImageJ , может быть более удобным для пользователя.

Чтобы ответить на вопрос, не используйте display() для изображения, показанного здесь. Вместо этого используйте метод plot(), который по умолчанию использует опцию method = raster. С изображением, нанесенным в графическом окне, вы можете использовать все инструменты R для взаимодействия с графиком. Разрешение у вас определяется размером вашего изображения и дисплея. Все значения возвращаются в пикселях и, очевидно, должны быть соответствующим образом масштабированы.

В этом примере locator() используется в небольшой вспомогательной функции для измерения диагональных расстояний между сосудистыми соединениями (?) На изображении.

Эта простая вспомогательная функция отмечает две точки и измеряет расстояние между точками. Завершите вызов на locator() щелчком правой кнопки мыши или клавишей ESC. В RStudio вам, возможно, придется явно нажимать другую кнопку в окне, и точки / линии могут не отображаться, пока все вызовы locator() не будут завершены.

  p2p <- function(n = 512) # end with ctrl-click or Esc
  {
    ans <- numeric()
    while (n > 0) {
    # this call to locator places 2 points as crosses
    # and connects them with a line
      p <- locator(2, type = "o", pch = 3, col = "magenta")
      if (is.null(p)) break
      ans <- c(ans, sqrt(sum(sapply(p, diff)^2)))
      n <- n - 1
    }
    return(ans) # return the vector of point-to-point distances
  }

Теперь заново разместите изображение в вопросе (без элементов из дисплея браузера) и затем взаимодействуйте с изображением.

original image

  plot(img) # not 'display(img)'
  d <- p2p() # interact with the image, collecting distances

Вот изображение после выбора шести пар точек с расстояниями, измеренными между каждой парой точек.

marked up fish

  round(d, 1)
> [1] 113.4  99.2 109.4 110.8 120.6 122.7
  mean(d)
> 112.6736

Естьвесело!

...