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")