Наложение данных на фоновое изображение
Недавно я выяснил, как легко было использовать фоновое изображение и данные карты поверх него с помощью Tableau Public. Вот процесс с сайта . Как вы можете видеть, это довольно просто, и вы просто скажете программному обеспечению, какой образ вы хотите использовать и как определить координаты.
Является ли процесс таким же простым в R? Какой был бы лучший подход?
Ответы
Ответ 1
JPEG
Для изображений jpeg вы можете использовать read.jpeg()
из пакета rimage
.
например:
anImage <- read.jpeg("anImage.jpeg")
plot(anImage)
points(my.x,my.y,col="red")
...
Установив параметр par (new = T) перед следующей командой plot, вы можете построить полные графики над фоновым изображением. (см. ?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)
Ответ 2
Я не уверен, что часть того, что вы хотите сделать, это то, что называется "геореференция" - акт принятия изображения без координатной информации и точное определение того, как он отображается в реальном мире.
Для этого я бы использовал Quantum GIS, бесплатный и открытый исходный GIS-пакет. Загрузите изображение как растровый слой, затем запустите плагин геопривязки. Нажмите на некоторые известные точки на вашем изображении и введите полные координаты реального мира этих точек. Как только у вас их будет достаточно, геореферензер разработает, как растянуть и перенести свой образ на реальное место на планете, и написать "мировой файл".
Затем с тем, что R должен иметь возможность читать его с помощью readGDAL из пакета rgdal и, возможно, с растровым пакетом.
Ответ 3
Для изображения JPEG вы можете использовать jpeg library и ggplot2 library.
Обычно мне было полезно, чтобы ось градуировалась в пикселях, а вертикальная ось была позитивной в направлении вниз, а изображение сохраняло исходное соотношение сторон. Таким образом, я могу напрямую подавать R на выходе, создаваемом алгоритмом компьютерного зрения, например, алгоритм может обнаруживать отверстие в пуле и извлекать координаты дыр с целевого изображения съемки, а затем R может нарисовать двумерную гистограмму с использованием целевого изображения в качестве фона.
Мой код основан на коде baptiste, найденном в fooobar.com/info/146187/...
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]()