我想将2000x2000像素RGB图像(具有三个独立通道的阵列)中的颜色转换为单个通道,对应于十六进制颜色。我还想同时保持图像的尺寸,以便找到每个像素的确切十六进制颜色。然后目的是找到包含特定颜色的所有像素的位置。
让我们来看看这个可再现的例子:
# A 3x3 pixels image
img <- array(runif(3,0,1), dim = c(3L, 3L, 3L))
# The result I would expect (a unique matrix of hexadecimal values,
# corresponding to the conversion and the merging of the RGB values)
img_output <-matrix(c("#B1F5E1","#95E4EE","#A5EDD8","#517760",
"#A1E2C7","#00FFFF","#A9EFDB","#A9EFC4","#73CEE6"),nrow=3,ncol=3)
# In order then to find the position of specific color pixels in
# my image
which(img_output=="#95E4EE", arr.ind=TRUE)
目前,我已经有了将RGB颜色转换为十六进制的功能,但它返回了一个字符向量:
library(colorspace)
img_output <- hex(RGB(c(img[,,1]),c(img[,,2]),c(img[,,3])))
我该怎么做?
答案 0 :(得分:1)
为了让我更容易看到我使用数据框而不是数组来使发生的事情变得更加明显。
#Creating Data Frame of red, green and blue values 0-1 labeled
img <- data.frame(R= runif(100,0,1),G = runif(100,0,1), B = runif(100,0,1))
#you can use apply also, but wanted to show how it is dropping each
# row into the 'rgb' command.
for (ro in 1:nrow(img)){
img$hex[ro] <-rgb(img[ro,'R'], img[ro, 'G'], img[ro, 'B'], max=1)
}
我们的输出:
R G B hex
0.23948334 0.4673375 0.479445200 #3D777A
0.03930279 0.4029776 0.092679483 #0A6718
0.93748689 0.6637624 0.900167870 #EFA9E6
0.46137007 0.9688970 0.001738671 #76F700
0.31737616 0.3566998 0.675646818 #515BAC
0.62523116 0.3513590 0.035781224 #9F5A09
你也可以用0到255之间的值做同样的事情:
img <- data.frame(R= as.numeric(sample(0:255, 100)),G = as.numeric(sample(0:255, 100)), B = as.numeric(sample(0:255, 100)))
for (ro in 1:nrow(img)){
img$hex[ro] <-rgb(img[ro,'R'], img[ro, 'G'], img[ro, 'B'], max=255)
}
输出:
R G B hex
175 147 202 #AF93CA
124 90 183 #7C5AB7
221 149 110 #DD956E
0 186 23 #00BA17
42 37 227 #2A25E3
31 8 101 #1F0865
您可以通过将max=
设置为适合原始数据中r,g,b值的显示来控制各个颜色空间的参数。