Создание растровых изображений с использованием 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 выход

Пиксели в углах должны быть черными, что предполагает некоторую интерполяцию.


Результат, который я ожидаю увидеть:

Ожидаемый результат

Любые предложения о том, почему мой код не может точно создать растровое изображение из матрицы?


Использование по назначению

Это для пакета, над которым я работаю, поэтому я хотел бы остаться в базовых пакетах 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 генерируется следующий вывод:

Выход 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()
Другие вопросы по тегам