2015-08-04 4 views
2

Когда полутоновые изображения представлены матрицами, каждый элемент матрицы определяет интенсивность соответствующего пикселя. Для удобства большинство современных цифровых файлов используют целочисленные числа от 0 (для обозначения черного, цвет минимальной интенсивности) и 255 (для обозначения белого, максимальная интенсивность), что дает в целом 256 = 2^8 разных уровней серого.Как получить матрицу пикселей из изображения в оттенках серого в R?

Есть ли способ получить пиксельную матрицу изображений graysale в R, значения пикселей которой будут варьироваться от 0 до 255?

Также будет полезно узнать, могу ли я изменить размеры изображений в предпочтительном измерении (скажем, $ 28 \ times 28 $) в R и затем преобразовать их в матрицу пикселей, элементы которой варьируются от 0 до 255?

Что произойдет, если исходное изображение RGB, но мне нужна матрица для оттенков серого?

ответ

7

Анализатор 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) 

colored and desaturated picture

Если у вас есть большие изображения и хотят принести до 28 х 28, я бы усреднил серые значения из соответствующих строк/столбцов и ввел результаты в матрицу нужного размера.

Заключительное примечание. Хотя это возможно сделать все это в R, было бы удобнее использовать программное обеспечение для обработки изображений. В зависимости от того, что вы нацелены на, возможно, было бы проще просто использовать ImageMagick-х mogrify, например:

mogrify -resize 28 -type grayscale twitter.png 
+0

Спасибо за ваш ответ. Можете ли вы сказать мне, если у меня есть изображение с именем «image.png», то как использовать команду desaturate(), чтобы получить изображение в градациях серого? А также о том, как изменить размер изображения в предпочтительном измерении в R (скажем, 28 на 28 пикселей)? –

+0

Если я прочитал изображение (http://www.greenmountaindiapers.com/skin/common_files/modules/Socialize/images/twitter.png), то почему он дает мне матрицу размерности 28 на 28 на 4? Не могли бы вы объяснить мне? Еще раз спасибо. –

+0

Я добавил пример с пояснениями к моему ответу. –

Смежные вопросы