Анализатор R пакет png
предлагает функцию readPNG()
, которая может читать растровую графику (состоящая из «пиксельных матриц») в формате PNG в R. Она возвращает либо одну матрицы с серыми значениями в [0, 1] или три матрицах с значения RGB в [0, 1].
Для преобразования между [0, 1] и {0, ..., 255} просто умножьте или разделите на 255 и округлить, если это необходимо.
Для преобразования между RGB и оттенками серого вы можете использовать, например, функцию desaturate()
из пакета colorspace
.
В качестве примера, давайте загрузим изображение вы предложили:
download.file("http://www.greenmountaindiapers.com/skin/common_files/modules/Socialize/images/twitter.png",
destfile = "twitter.png")
Затем мы загружаем пакеты, упомянутые выше:
library("png")
library("colorspace")
Во-первых, мы читаем изображение PNG в массив x
с размерностью 28 x 28 x 4. Таким образом, изображение имеет 28 x 28 пикселей и четыре канала: красный, зеленый, синий и альфа (для полупрозрачности).
x <- readPNG("twitter.png")
dim(x)
## [1] 28 28 4
Теперь мы можем превратить это в различные другие форматы: y
представляет собой вектор строки шестнадцатеричных символов, с указанием цвета в R. yg
является соответствующим ненасыщенным цвет (опять же, как шестнадцатеричный символ) только с оттенками серого. yn
- число количество серый. Все три объекта расположены в 28 х 28 матриц в конце
y <- rgb(x[,,1], x[,,2], x[,,3], alpha = x[,,4])
yg <- desaturate(y)
yn <- col2rgb(yg)[1, ]/255
dim(y) <- dim(yg) <- dim(yn) <- dim(x)[1:2]
Я надеюсь, что по крайней мере одна из этих версий является то, что вы ищете. Для проверки матрицы пиксельного я написал небольшую удобную функцию для визуализации:
pixmatplot <- function (x, ...) {
d <- dim(x)
xcoord <- t(expand.grid(1:d[1], 1:d[2]))
xcoord <- t(xcoord/d)
par(mar = rep(1, 4))
plot(0, 0, type = "n", xlab = "", ylab = "", axes = FALSE,
xlim = c(0, 1), ylim = c(0, 1), ...)
rect(xcoord[, 2L] - 1/d[2L], 1 - (xcoord[, 1L] - 1/d[1L]),
xcoord[, 2L], 1 - xcoord[, 1L], col = x, border = "transparent")
}
Для иллюстрации давайте посмотрим на:
pixmatplot(y)
pixmatplot(yg)
Если у вас есть большие изображения и хотят принести до 28 х 28, я бы усреднил серые значения из соответствующих строк/столбцов и ввел результаты в матрицу нужного размера.
Заключительное примечание. Хотя это возможно сделать все это в R, было бы удобнее использовать программное обеспечение для обработки изображений. В зависимости от того, что вы нацелены на, возможно, было бы проще просто использовать ImageMagick-х mogrify
, например:
mogrify -resize 28 -type grayscale twitter.png
Спасибо за ваш ответ. Можете ли вы сказать мне, если у меня есть изображение с именем «image.png», то как использовать команду desaturate(), чтобы получить изображение в градациях серого? А также о том, как изменить размер изображения в предпочтительном измерении в R (скажем, 28 на 28 пикселей)? –
Если я прочитал изображение (http://www.greenmountaindiapers.com/skin/common_files/modules/Socialize/images/twitter.png), то почему он дает мне матрицу размерности 28 на 28 на 4? Не могли бы вы объяснить мне? Еще раз спасибо. –
Я добавил пример с пояснениями к моему ответу. –