Извлечение цвета, количественная оценка и анализ из изображения в R
Я бы хотел quantifying colors in an image
, Я работаю над переливом перламутра (перламутром) и хочу определить три цвета (красный, желтый и зеленый) для этой оболочки (например, справа на картинке по ссылке выше).
Итак, я проверил несколько пакетов (imager
, ImageMagick
, EBImage
...), но я не могу найти то, что мне поможет.
Ну, я хотел бы сделать количественную оценку цвета на R
с кругами. Площадь примитива в пикселях может быть выражена как площадь круга эквивалентной площади поверхности. Примитив представляет собой непрерывную область соседних пикселей аналогичного цвета. Центром круга может быть якорный пиксель. Итак, есть уравнение, которое я думаю, что это нормально, чтобы сделать это:
DeltaI = квадратный корень [(Ranchor - Ri)² - (Ganchor - Gi)² - (Banchor - Bi)²]
Где R,G и B - это цветовые компоненты пикселя в диапазоне от 0 до 255, якорь - это пиксель привязки, а i - любой пиксель вокруг пикселя привязки, которые имеют одинаковый эквивалентный цвет.
Существует ссылка на изображение с результатами ожидания (из Alçiçek & Balaban 2012):
Креветки в результате эквивалентных кругов
Итак, есть мой (загружаемый работающий) код, но я действительно не знаю, как продолжить. Может быть, попытаться создать пакет?
library(png)
nacre <- readPNG("test.png")
nacre
dim(nacre)
# show the full RGB image
grid.raster(nacre)
# show the 3 channels in separate images
nacre.R = nacre
nacre.G = nacre
nacre.B = nacre
# zero out the non-contributing channels for each image copy
nacre.R[,,2:3] = 0
nacre.G[,,1]=0
nacre.G[,,3]=0
nacre.B[,,1:2]=0
# build the image grid
img1 = rasterGrob(nacre.R)
img2 = rasterGrob(nacre.G)
img3 = rasterGrob(nacre.B)
grid.arrange(img1, img2, img3, nrow=1)
# Now let’s segment this image. First, we need to reshape the array into a data frame with one row for each pixel and three columns for the RGB channels:
# reshape image into a data frame
df = data.frame(
red = matrix(nacre[,,1], ncol=1),
green = matrix(nacre[,,2], ncol=1),
blue = matrix(nacre[,,3], ncol=1)
)
### compute the k-means clustering
K = kmeans(df,4)
df$label = K$cluster
### Replace the color of each pixel in the image with the mean
### R,G, and B values of the cluster in which the pixel resides:
# get the coloring
colors = data.frame(
label = 1:nrow(K$centers),
R = K$centers[,"red"],
G = K$centers[,"green"],
B = K$centers[,"blue"]
)
# merge color codes on to df
df$order = 1:nrow(df)
df = merge(df, colors)
df = df[order(df$order),]
df$order = NULL
# get mean color channel values for each row of the df.
R = matrix(df$R, nrow=dim(nacre)[1])
G = matrix(df$G, nrow=dim(nacre)[1])
B = matrix(df$B, nrow=dim(nacre)[1])
# reconstitute the segmented image in the same shape as the input image
nacre.segmented = array(dim=dim(nacre))
nacre.segmented[,,1] = R
nacre.segmented[,,2] = G
nacre.segmented[,,3] = B
# View the result
grid.raster(nacre.segmented)
У кого-то есть трек или есть идеи? Спасибо за любую помощь..
1 ответ
Ну, я нашел другой способ ответить на мой вопрос:
- Я загружаю свое изображение с
load.image
отimager
пакет. Я извлекаю каналы RGB с этим кодом:
# Assign RGB channels to data frame nacreRGB <- data.frame( x = rep(1:nacreDm[2], each = nacreDm[1]), y = rep(nacreDm[1]:1, nacreDm[2]), R = as.vector(nacre[,,1]), G = as.vector(nacre[,,2]), B = as.vector(nacre[,,3]) ) # head(nacreRGB) # Assign RGB channels to data frame without pixel coordinates nacreRGB2 <- data.frame( R = as.vector(nacre[,,1]), G = as.vector(nacre[,,2]), B = as.vector(nacre[,,3])
После того, как я преобразовал это в HEX код с
rgbSVG2rgbCSS
fonction.- Я положил это в матрицу, которую я называю
RGB0
создавать гистограммы и показывать разные цвета с частотой пикселей. После того, как я выполню PCA, чтобы показать распределение этих цветов:
require("ggplot2") RGB0 <- as.data.frame(RGB0) # perform PCA on the nacre data and add the uv coordinates to the dataframe PCA = prcomp(RGB0[,c("R","G","B")], center=TRUE, scale=TRUE) RGB0$u = PCA$x[,1] RGB0$v = PCA$x[,2]
- Я показываю этот PCA с
ggplot2
, - После этого я перевожу код RGB в код HSV с помощью
rgb2hsv
и у меня может быть значение для оттенка, для насыщенности (оттенок к белому) и значение (оттенок к темноте), чтобы я мог получить качественные и количественные данные о цветах.
Изменить: все коды теперь публикуются в CRAN в пакете ImaginR: https://cran.r-project.org/web/packages/ImaginR/ImaginR.pdf
Или на GitHub: https://github.com/PLStenger/ImaginR
Эта версия на самом деле не дает количественного определения цвета, но скоро появится в следующей версии.