Создание растровых изображений с использованием R
Я пытаюсь использовать 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()
Это было выполнено в R 2.12.0 на OS X, но я получаю тот же вывод от R 2.11.0.
Вывод, который я получаю, следующий (масштабируется от 5x3 до 150x90)
Пиксели в углах должны быть черными, что предполагает некоторую интерполяцию.
Результат, который я ожидаю увидеть:
Любые предложения о том, почему мой код не может точно создать растровое изображение из матрицы?
Использование по назначению
Это для пакета, над которым я работаю, поэтому я хотел бы остаться в базовых пакетах R, если это возможно, чтобы не вводить дополнительные зависимости. Пакет реализует графическое устройство, поэтому, если у кого-то есть решение уровня C, оно получает информацию, переданную GERaster()
в src/main/engine.c
и создает PNG, используя только библиотеки R, я бы тоже хотел это сделать.
Решения для OS X
Как указывает Нико, ошибочное поведение является результатом сглаживания. Сюжет ведет себя как ожидалось, если png()
сказано использовать метод вывода, для которого можно отключить сглаживание, например графику Cairo:
png('test.png', width=5, height=3, units='px', type='cairo', antialias=NULL)
На OS X бэкэнд по умолчанию для png()
Кварц, однако png(..., type='quartz')
в настоящее время игнорирует директивы, установленные quartz.options()
, Верный вывод может быть произведен непосредственно на OS X, если устройство запускается путем вызова quartz()
непосредственно вместо использования png()
:
quartz(file='test.png', type='png', width=5, height=3, dpi=1, antialias=FALSE)
Windows думает иначе
В Windows генерируется следующий вывод:
Согласно ответу, данным Полом Мурреллом (доброжелательным диктатором графических устройств R) в списке рассылки R-help:
Это проблема округления (усечения). Работаем над исправлением.
Такое поведение в Windows не должно быть заметным, если только растровое изображение не содержит очень небольшое количество пикселей.
2 ответа
Ваш код работает так, как мне предназначено... (R 2.11.1 работает под Fedora Core 13). Похоже, что проблема с противовоспалительным
Этот код делает свое дело
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")’.
Вы слышали о 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()