Процесс преобразования точки в изображение класса и снова возврат к процессу той же точки - PullRequest
0 голосов
/ 03 апреля 2020

Я бы хотел переводить между spatstat и raster мирами без какого-либо исходного информационного ущерба.

Я пытаюсь преобразовать точечный процесс (ppp объект), присутствующий в длиннолистном наборе данных в * Пакет 1006 * в классе im и после того, как я попытаюсь преобразовать объект класса im в исходный набор данных longleaf как точечный процесс без успеха.

В моем примере:

#<start> ---
library(spatstat)
library(raster)
library(maptools)

# Compute a gaussian kernel smoothed intensity with longleaf data set
bw <- bw.diggle(longleaf) #First, defined bandwidth sigma 
im_census<-density.ppp(longleaf, sigma=bw,diggle=TRUE)

# Now I'll try to convert im im_census object in original longleaf Point Pattern ppp again
im_census_p<-rasterToPoints(raster(as.SpatialGridDataFrame.im(im_census)))

par(mfrow=c(1,2))
plot(longleaf)
plot(im_census_p)
#<end> ---

Но, очевидно, это не работает? Может ли кто-нибудь помочь мне, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

В spatstat преобразование между классами обычно выполняется функцией с именем, начинающимся с "as". Чтобы преобразовать ppp в im, вы можете использовать as.im. Родовой c as.im отправляет метод as.im.ppp, который вызывает pixellate. Пример:

X <- cells # or any point pattern
Z <- as.im(X)
plot(Z)
plot(X, add=TRUE)

В полученном изображении Z значение в каждом пикселе является количеством точек данных, попадающих в пиксель. Точные координаты точек данных теряются.

Для преобразования im в ppp не существует метода as.ppp.im, поскольку эта операция обычно не имеет смысла. Но если предположить, что изображение Z было получено путем пикселизации точечного шаблона, вы можете сделать

P <- where.max(Z > 0, first=FALSE)

Тогда P является точечным шаблоном. Операция Z > 0 возвращает двоичное пиксельное изображение с записью TRUE для пикселей, содержащих хотя бы одну точку данных. Функция where.max находит центры пикселей, где изображение достигает своего максимума, и в этом случае это означает все TRUE пикселей. Чтобы увидеть эффект дискретизации:

plot(X)
plot(P, add=TRUE, pch=3)

P аналогично X, за исключением того, что точные местоположения точек данных были заменены местоположениями ближайших центров пикселей. Несколько точек данных, попадающих в один пиксель, заменяются одной точкой в ​​центре пикселя.

Для более сложных манипуляций вы можете использовать as.data.frame, чтобы преобразовать объект im во фрейм данных, с одна строка для каждого пикселя, со столбцами x, y, value. Затем манипулируйте этим фреймом данных и, наконец, используйте as.ppp, чтобы создать точечный шаблон из результирующего фрейма данных.

1 голос
/ 04 апреля 2020

Если я правильно понимаю вашу проблему, она некорректна. A ppp - векторный формат, который представляет координаты точек с двойной точностью точности. С другой стороны, растровые форматы, такие как im и объекты из пакета raster, содержат сетку точек с некоторым заданным разрешением. Поэтому, если ваши точки не будут идеально выровнены в сетке, ваша задача преобразования из ppp в растровый формат "без какого-либо исходного информационного ущерба" ​​невозможна.

Если вы хотите, чтобы растровое приближение равнялось ppp, то вы можно использовать pixellate в spatstat, который создает сетку и подсчитывает, сколько точек приходится на каждую ячейку сетки (обычно 0 или 1).

...