使用R创建光栅图像

时间:2010-10-17 20:16:10

标签: r raster-graphics

我正在尝试使用R从数据矩阵创建光栅图像。但是,我在图像边缘得到了一些奇怪的文物。

我使用的代码如下:

# From the example for rasterImage(). A 3 pixel by 5 pixel b/w checkerboard.
testImage <- as.raster(0:1, nrow=3, ncol=5)

testImage
     [,1]      [,2]      [,3]      [,4]      [,5]     
[1,] "#000000" "#FFFFFF" "#000000" "#FFFFFF" "#000000"
[2,] "#FFFFFF" "#000000" "#FFFFFF" "#000000" "#FFFFFF"
[3,] "#000000" "#FFFFFF" "#000000" "#FFFFFF" "#000000"

png('test.png', width=5, height=3, units='px')

# Just want the image, no margins, boarders or other fancy stuff.
par(mar = c(0,0,0,0) )
plot.new()
plotArea = par('fig')

rasterImage(testImage, plotArea[1], plotArea[3],
  plotArea[2], plotArea[4], interpolate = FALSE )

dev.off()

这是在OS X的R 2.12.0中执行的,但我从R 2.11.0得到了相同的输出。


我得到的输出如下(从5x3到150x90缩放)

R output

角落中的像素应为黑色,这表明正在进行某种形式的插值。


我期待看到的输出是:

Expected output

有关为什么我的代码无法忠实地从矩阵生成光栅图像的任何建议?


预期用途

这是我正在处理的软件包,所以我希望尽可能保留在R基本软件包中,以免引入其他依赖项。该软件包实现了一个图形设备,所以如果有人有一个C级解决方案从GERaster()src/main/engine.c传递的信息中选择并仅使用R库创建一个PNG,我愿意给它也是一枪。


OS X的解决方案

正如nico所指出的,错误的行为是抗锯齿的结果。如果告诉png()使用可以禁用抗锯齿的输出方法,例如Cairo图形:

,则绘图的行为符合预期
png('test.png', width=5, height=3, units='px', type='cairo', antialias=NULL)

在OS X上,png()的默认后端是Quartz,但png(..., type='quartz')当前忽略quartz.options()设置的指令。如果通过直接调用quartz()而不是使用png()来启动设备,则可以在OS X上本地生成忠实输出:

quartz(file='test.png', type='png', width=5, height=3, dpi=1, antialias=FALSE)

Windows认为不同

在Windows上生成以下输出:

Windows output

根据Paul Murrell(R图形的仁慈独裁者)给出的an answer R-help邮件列表上的设备):

  

这是一个舍入(截断)问题。正在修复。

除非光栅图像包含非常少量的像素,否则Windows上的此行为不应引人注意。

2 个答案:

答案 0 :(得分:1)

您的代码按我的意图运行...(在Fedora Core 13下运行的R 2.11.1)。 这似乎是一个抗锯齿问题

此代码可以解决问题

png('test.png', width=5, height=3, units='px', type='cairo', antialias=NULL)

可以在X11.options

中设置默认抗锯齿选项

来自?X11.options

antialias: for cairo types, the type of anti-aliasing (if any) to be
      used.  One of ‘c("default", "none", "gray", "subpixel")’.

答案 1 :(得分:1)

您是否听说过raster包裹?也许它可能是一些服务。

library(raster)
test.image <- matrix(c(1, 0, 1, 0, 0, 1, 0, 1), ncol = 4, byrow = TRUE)
plot(raster(test.image))

png("test.png")
image(test.image, axes = FALSE)
dev.off()