Вот предлагаемое решение с использованием 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()
.
