Извлечение цвета, количественная оценка и анализ из изображения в 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

Эта версия на самом деле не дает количественного определения цвета, но скоро появится в следующей версии.

Другие вопросы по тегам