Шаблоны точек на оригинальных изображениях - PullRequest
0 голосов
/ 25 мая 2019

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

Теперь я хочу нанести точечные рисунки на исходные изображения, мои ожидания должны быть такими: enter image description here

Сначала я пытаюсь использовать R для загрузки исходного изображения, однако загруженное изображение отображается вместе с осями, а линии сетки отсутствуют, как показано на рисунке. Поэтому мне было интересно, как я могу воспроизвести формат, как показано на рисунке. Спасибо! enter image description here Информация о переменной 'fig' для сюжета: enter image description here

Ответы [ 2 ]

2 голосов
/ 25 мая 2019

Вы можете сделать это с OpenCV и Python:

( РЕДАКТИРОВАТЬ: добавлены вертикальные линии)

import numpy as np
import cv2

# Load image
img = cv2.imread('your_image.jpg', cv2.IMREAD_COLOR)

# draw grid
spacing = 200
color = (255,0,255)  # magenta
linewidth = 5

# horizontal lines
ystart = 20
for i in range(3):
    x1, x2 = 0, img.shape[1]
    y = ystart + spacing * i
    cv2.line(img, (x1,y), (x2,y), color, linewidth)

# vertical lines
xstart = 60
for i in range(3):
    y1, y2 = 0, img.shape[0]
    x = xstart + spacing * i
    cv2.line(img, (x,y1), (x,y2), color, linewidth)


# create a bunch of locations for dots
num = 50
xs = np.random.randint(0,img.shape[1],num)
ys = np.random.randint(0,img.shape[0],num) 

# draw the dots on the image (use red so they stand out)
radius = 10
color = (0,0,255)
for i in range(num):
    cv2.circle(img,(xs[i],ys[i]), radius, color, -1)

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Результат: Image result

1 голос
/ 26 мая 2019

Вот предлагаемое решение с использованием R, используя пакет EBImage. Мне это нравится из-за легкости взаимодействия с изображением.

# EBImage is required
  if (!require(EBImage)) {
    source("https://bioconductor.org/biocLite.R")
    biocLite("EBImage")
    library(EBImage)
  }

# Read the image and plot it with no borders, 300 ppi
  fn <- file.choose() # select saved image
  img <- readImage(fn)
  img <- channel(img, "gray") # gray scale for simplicity
  dev.new(width = dim(img)[1]/300, height = dim(img)[2]/300)
  plot(img)

В этом шаге используется простота взаимодействия с графическими элементами в R. Здесь locator используется для размещения метки на пересечении линий сетки и для записи координат x, y. Затем к изображению добавляются линии сетки в предположении, что изображение ориентировано так, чтобы линии сетки проходили вертикально и горизонтально.

# Use locator() to interactively identify convenient intersections
  pp <- locator(type = "p", pch = 3, col = 2) # end with ctrl-click

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

# Little more coding to extract and plot unique grid lines
  breaks <- lapply(pp, function(v) hist(v, plot = FALSE)$breaks)
  groups <- Map(cut, pp, breaks)
  pp <- Map(function(v, g) tapply(v, g, mean), pp, groups)
  pp <- lapply(pp, function(x) x[!is.na(x)]) # to re-use if needed

# Place grid lines on new image
  plot(img)
  abline(v = pp$x, h = pp$y, col = 2)

Линии сетки были добавлены с помощью самой простой базовой функции. При желании можно добавить более сложные линии. Чтобы проиллюстрировать другие возможности, здесь размещены координаты (в пикселях) каждой линии сетки.

  text(min(pp$x), pp$y, round(pp$y), col = 2, adj = c(1, -0.2))
  text(pp$x, max(pp$y), round(pp$x), col = 2, adj = c(0, 1.2))

И результат этого (взаимодействуя через locator().

Grids added to image with EBImage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...