R I1I2I3 - eiichiromomma/CVMLAB GitHub Wiki
R) I1I2I3 color space
(画像処理に適した色空間
原典
Y.Ohta, T. Kanade, T. Sakai: Computer Graphics and Image Processing, Vol.13, 222 (1980).
残念ながらElsevierでは契約していないと論文は読めない。 Abstract は読める。
特徴
RGB表色系はRGBの3値が互いに相関を持っているため情報の重複があると考えられる。 このRGBを無相関な3値に変換しようというのが(I1,I2,I3)の表色系である。
で、一般的な色彩画像のRGBについて固有値を求めていくと(1/3,1/3,1/3), (1/2,0,-1/2), (-1/4, 1/2, -1/4)に近い値になることが多いので、(引用は某書籍によるが2番目が(-1/2,0,1/2)の間違いかも)
I1=(R+G+B)/3
I2=(R-B)/2
I3=(2G-R-B)/4
と定義するものである。
確認
本当になるかそこら辺の画像で試してみた。
> library(rimage)
> imagedata <- read.jpeg("testimage.jpg)")
> rgbframe <- data.frame(Red=as.vector(imagedata[,,1]),
Green=as.vector(imagedata[,,2]),
Blue=as.vector(imagedata[,,3]))
> prcomp(rgbframe)
Standard deviations:
[1] 0.288118793 0.021435546 0.006447903
Rotation:
PC1 PC2 PC3
Red 0.5964909 -0.6931447 -0.4046593
Green 0.5803632 0.0242226 0.8139974
Blue 0.5544161 0.7203914 -0.4167242
本当だ。
別の画像でも
Standard deviations:
[1] 0.306588901 0.022432385 0.008002974
Rotation:
PC1 PC2 PC3
Red 0.6003991 -0.62905071 -0.4937774
Green 0.5822819 -0.07935186 0.8091051
Blue 0.5481503 0.77330362 -0.3186420
ほぼ近い値になった。
プロットしてみる
rglを使ってRed,Green,Blueの軸とI1,I2,I3の軸を表示してみた。 rock.rgb2i123は自前の変換関数。
library(rgl)
rgl.clear()
rgl.bbox(color="#333377")
rgl.bg(color=c("white","black"))
r <- seq(0,255,by=10)
g <- numeric(26)
b <- numeric(26)
i123 <- rock.rgb2i123(r,g,b)
rgl.spheres(r,g,b,radius=3,color="red")
rgl.spheres(i123$I1,i123$I2,i123$I3,radius=3,color="purple")
r <- numeric(26)
g <- seq(0,255,by=10)
b <- numeric(26)
i123 <- rock.rgb2i123(r,g,b)
rgl.spheres(r,g,b,radius=3,color="green")
rgl.spheres(i123$I1,i123$I2,i123$I3,radius=3,color="yellow")
r <- numeric(26)
g <- numeric(26)
b <- seq(0,255,by=10)
i123 <- rock.rgb2i123(r,g,b)
rgl.spheres(r,g,b,radius=3,color="blue")
rgl.spheres(i123$I1,i123$I2,i123$I3,radius=3,color="skyblue")