Наложение данных на фоновое изображение - PullRequest
15 голосов
/ 14 февраля 2011

Недавно я выяснил, как легко использовать фоновое изображение и наносить на карту данные поверх него с помощью Tableau Public.Вот процесс с их веб-сайта .Как видите, это довольно просто, и вы просто указываете программному обеспечению, какое изображение вы хотите использовать и как определять координаты.

Является ли процесс настолько простым в R?Какой будет лучший подход?

Ответы [ 3 ]

22 голосов
/ 14 февраля 2011

JPEG

Для изображений в формате JPEG вы можете использовать read.jpeg() из пакета rimage.

Например:

anImage <- read.jpeg("anImage.jpeg")
plot(anImage)
points(my.x,my.y,col="red")
...

Установив par (new = T) перед следующей командой заговора, вы можете построить полные графики поверх фонового изображения. (см. ?par и далее вниз)

PNG

PNG-изображения, которые вы можете загрузить с помощью readPNG из пакета png. Для readPNG вам нужна команда rasterImage для построения графика (см. Также файлы справки). В Windows нужно избавиться от альфа-канала, поскольку до сих пор Windows не справлялась с альфа-разрешением на пиксель. Саймон Урбанек был так любезен, что указал на это решение:

img <- readPNG(system.file("img", "Rlogo.png", package="png"))
r = as.raster(img[,,1:3])
r[img[,,4] == 0] = "white"

plot(1:2,type="n")
rasterImage(r,1,1,2,2)

GIF

Для файлов GIF вы можете использовать read.gif из caTools. Проблема в том, что это вращение матрицы, поэтому вы должны отрегулировать ее:

Gif <- read.gif("http://www.openbsd.org/art/puffy/ppuf600X544.gif")

n <- dim(Gif$image)
image(t(Gif$image)[n[2]:1,n[1]:1],col=Gif$col,axes=F)

Чтобы нанести изображение поверх этого изображения, вы должны правильно установить номинал, например:

image(t(Gif$image)[n[2]:1,n[1]:1],col=Gif$col,axes=F)
op <- par(new=T)
plot(1:100,new=T)
par(op)
5 голосов
/ 14 февраля 2011

Я не уверен, что часть того, что вы хотите сделать, это то, что называется «географической привязкой» - актом съемки изображения без координатной информации и точного определения того, как оно отображается в реальном мире.

Для этого я бы использовал Quantum GIS, бесплатный ГИС-пакет с открытым исходным кодом. Загрузите изображение как растровый слой, затем запустите плагин с геопривязкой. Нажмите на некоторые известные точки на вашем изображении и введите координаты этих точек в реальном времени. Как только вы достанете их, геореферент придумает, как растянуть и переместить ваше изображение в его реальное место на планете, и напишет «мировой файл».

Затем этот R сможет прочитать его, используя readGDAL из пакета rgdal и, возможно, также растровый пакет.

3 голосов
/ 05 марта 2017

Для изображения JPEG вы можете использовать библиотеку jpeg и библиотека ggplot2 .

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

Мой код основан на коде Крестителя , найденного по адресу https://stackoverflow.com/a/16418186/15485

library(ggplot2)
library(jpeg)

img <- readJPEG("bersaglio.jpg") # http://www.tiropratico.com/bersagli/forme/avancarica.jpg

h<-dim(img)[1] # image height
w<-dim(img)[2] # image width

df<-data.frame(x=rnorm(100000,w/1.99,w/100),y=rnorm(100000,h/2.01,h/97))
plot(ggplot(df, aes(x,y)) + 
       annotation_custom(grid::rasterGrob(img, width=unit(1,"npc"), height=unit(1,"npc")), 0, w, 0, -h) + # The minus is needed to get the y scale reversed
       scale_x_continuous(expand=c(0,0),limits=c(0,w)) +
       scale_y_reverse(expand=c(0,0),limits=c(h,0)) + # The y scale is reversed because in image the vertical positive direction is typically downward
                                                      # Also note the limits where h>0 is the first parameter.
       coord_equal() + # To keep the aspect ratio of the image.

       stat_bin2d(binwidth=2,aes(fill = ..density..)) +
       scale_fill_gradient(low = "dark red", high = "red")
     )

enter image description here

df<-data.frame(x=rnorm(100000,100,w/70),y=rnorm(100000,400,h/100))
plot(ggplot(df, aes(x,y)) + 
       annotation_custom(grid::rasterGrob(img, width=unit(1,"npc"), height=unit(1,"npc")), 0, w, 0, -h) + # The minus is needed to get the y scale reversed
       scale_x_continuous(expand=c(0,0),limits=c(0,w)) +
       scale_y_reverse(expand=c(0,0),limits=c(h,0)) + # The y scale is reversed because in image the vertical positive direction is typically downward
       # Also note the limits where h>0 is the first parameter.
       coord_equal() + # To keep the aspect ratio of the image.

       stat_bin2d(binwidth=2,aes(fill = ..density..)) +
       scale_fill_gradient(low = "dark red", high = "red")
)

enter image description here

...