我正在尝试使用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基本软件包中,以免引入其他依赖项。该软件包实现了一个图形设备,所以如果有人有一个C级解决方案从GERaster()
中src/main/engine.c
传递的信息中选择并仅使用R库创建一个PNG,我愿意给它也是一枪。
正如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上生成以下输出:
根据Paul Murrell(R图形的仁慈独裁者)给出的an answer R-help邮件列表上的设备):
这是一个舍入(截断)问题。正在修复。
除非光栅图像包含非常少量的像素,否则Windows上的此行为不应引人注意。
答案 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()