nicolish!
色空間
最終更新:
Bot(ページ名リンク)
-
view
色空間
ソフトウェア内部での扱いが良く分からなかったのと、実用的でないだろうという判断からお蔵入りした原稿。だから未完。
01.RGBとピクセル
コンピュータで色をどう扱うか?の話
光の三原色は知ってるかな…
(人間にとっての)この世の全ての色は
赤、緑、青の3色の光の合成で表現できます
(人間にとっての)この世の全ての色は
赤、緑、青の3色の光の合成で表現できます
コンピュータの中では、色はこの3つの光の強さで表現します
赤と青があれば紫。
赤が強けりゃ赤紫。
青が強けりゃ青紫。
赤と青があれば紫。
赤が強けりゃ赤紫。
青が強けりゃ青紫。
で、コンピュータなので、光の強さは数字で表現します。
普通は1色あたり256段階、8ビット。
3色なので8*3=24ビット。
これで1つの色を表現できます。
普通は1色あたり256段階、8ビット。
3色なので8*3=24ビット。
これで1つの色を表現できます。
3つの値はR,G,B (Red, Green, Blue)と略される事が多いです。
R=255、G=255、B=0で明るい黄色、みたいな。
(255, 255, 0)みたいな書き方もよくする。
R=255、G=255、B=0で明るい黄色、みたいな。
(255, 255, 0)みたいな書き方もよくする。
コンピュータ上では、絵は点の連続として扱われます。
画素、ピクセル、ドット等と呼ばれます。
24bitで1ピクセルの色を再現し
それを沢山集めることで画像ができます
画素、ピクセル、ドット等と呼ばれます。
24bitで1ピクセルの色を再現し
それを沢山集めることで画像ができます
ここまでのまとめ
- 色は赤、緑、青の足し合わせで表現できる
- 各色8ビット、計24ビットで色を表す事が多い
- 画像はピクセルの集合
02.RGBとYUV
色を表現する方法は一通りではない話
えっと、話はちょっとすっ飛ぶよ。
連立方程式、って覚えてますか?
概念は中学で習うみたい。
今回やるのは高校の範囲のようだけど。
連立方程式、って覚えてますか?
概念は中学で習うみたい。
今回やるのは高校の範囲のようだけど。
たとえば3元連立方程式だと
x + 2y + z = 8
2x + y = 4
3x + 2y + 2z = 13
みたいな式を組み合わせ
x = 1, y = 2, z = 3
という解を求める。懐かしい。
3x + 2y + 2z = 13
みたいな式を組み合わせ
x = 1, y = 2, z = 3
という解を求める。懐かしい。
さて、逆に考えてみましょう
x=1,y=2,z=3の値が与えられてて
x=1,y=2,z=3の値が与えられてて
x + 2y + z = A
2x + y = B
3x + 2y + 2z = C
の時、A,B,Cの値は?
と言われても答えられますね。
3x + 2y + 2z = C
の時、A,B,Cの値は?
と言われても答えられますね。
「3変数が分かる」
ことと
「3変数で作った3つの式の値がわかる」
事はイコールなわけです。
ことと
「3変数で作った3つの式の値がわかる」
事はイコールなわけです。
だから、RGBについても同じ。
決まった式でR,G,Bの3つの変数を
別の数字に置き換える事が出来ます
決まった式でR,G,Bの3つの変数を
別の数字に置き換える事が出来ます
この置き換え方法のひとつに、YUVというのがあります
変換式は
Y = 0.29891*R + 0.58661*G + 0.11448*B
U = -0.16874*R - 0.33126*G + 0.50000*B
V = 0.50000*R - 0.41869*G - 0.08131*B
覚えなくてもいいお
変換式は
Y = 0.29891*R + 0.58661*G + 0.11448*B
U = -0.16874*R - 0.33126*G + 0.50000*B
V = 0.50000*R - 0.41869*G - 0.08131*B
覚えなくてもいいお
大雑把に言うと、Yは色の明るさ
UとVは色合いの違い。色度と呼ぶ。
(Y,U,V) = (255, 0, 0)だと明るい黄色で
Uが大きくなると青っぽく
Vが大きくなると赤っぽくなります
UとVは色合いの違い。色度と呼ぶ。
(Y,U,V) = (255, 0, 0)だと明るい黄色で
Uが大きくなると青っぽく
Vが大きくなると赤っぽくなります
なんでこんな変換をするのか?
その辺は次の項で。
とりあえず変換できる、ってとこまでで1回区切ります。
その辺は次の項で。
とりあえず変換できる、ってとこまでで1回区切ります。
あ、ちなみに、この置き換えをするのはあくまでデータ保存の時だけ。
結局ディスプレイはRGBの光点で出来ているわけで
最終的にはR,G,Bに再度戻してディスプレイに表示する事になります
結局ディスプレイはRGBの光点で出来ているわけで
最終的にはR,G,Bに再度戻してディスプレイに表示する事になります
ここまでのまとめ
- R,G,Bは、決まった式で他の3変数に変換できる。この変換は逆に元に戻す事もできる
- Y,U,Vの3つの数字で色を表現する事が出来る。Yは明るさ、UとVは色合いを示す。
3.YUVフォーマット
圧縮に話が進んでいきます
まずはYUVにする意味。
まずはYUVにする意味。
さて、なんでYUVにするのか?
結論から言うと、YUVにすると圧縮がしやすくなるのです
結論から言うと、YUVにすると圧縮がしやすくなるのです
ここで人間の目の話が出てきます
人間の目というのは、明るさの変化には敏感ですが
色合いの変化には割と鈍感だという事が分かっています
人間の目というのは、明るさの変化には敏感ですが
色合いの変化には割と鈍感だという事が分かっています
だから、画像を表現する時に
明るさの部分で手を抜くと手抜きがバレちゃう
画質が落ちている事を見抜かれるわけだ
明るさの部分で手を抜くと手抜きがバレちゃう
画質が落ちている事を見抜かれるわけだ
でも、色合いの部分で手を抜くと?
少なくともパッと見は手抜きしてるようには見えなくなる
元の画像と、色合いが適当な画像の違いはなかなか見抜けない
少なくともパッと見は手抜きしてるようには見えなくなる
元の画像と、色合いが適当な画像の違いはなかなか見抜けない
まして動画の絵は数十分の一秒パッと見せるだけ
ここで多少手を抜いたところで、人間には見分けがつかない
というわけで、この部分で手を抜いて画像を圧縮しよう、という発想になる
ここで多少手を抜いたところで、人間には見分けがつかない
というわけで、この部分で手を抜いて画像を圧縮しよう、という発想になる
そう、これがやりたいがためにYUVに変換したのだ
YUVだと、UとVをいじくっても明るさは変わらない
だから、UとVを適当に手抜きで表現してしまおう
YUVだと、UとVをいじくっても明るさは変わらない
だから、UとVを適当に手抜きで表現してしまおう
どう手を抜くか?
まず、UとVを2ピクセルごとにまとめてしまう
隣どおしのピクセルは同じ色合い、って事にしちまうわけだ
Vはいじるとバレるのでそのままで
まず、UとVを2ピクセルごとにまとめてしまう
隣どおしのピクセルは同じ色合い、って事にしちまうわけだ
Vはいじるとバレるのでそのままで
2ピクセルで8ビット*3色*2ピクセル=48ビットだったのが
Y : 8ビット*2
U : 8ビット
V : 8ビット で、32ビットになる。2/3だ!
Y : 8ビット*2
U : 8ビット
V : 8ビット で、32ビットになる。2/3だ!
もう少し手を抜いてみよう。
UとVを、2*2ピクセルの四角でまとめてしまう。
UとVを、2*2ピクセルの四角でまとめてしまう。
元々は8ビット*3色*4ピクセル=96ビット
それが、
Y : 8ビット * 4ピクセル
U : 8ビット
V : 8ビット
で48ビット。なんと半分に!
それが、
Y : 8ビット * 4ピクセル
U : 8ビット
V : 8ビット
で48ビット。なんと半分に!
ってとこで一旦まとめ。
ま、理屈はコレでおしまいなんだけど。
あとは細かい補足と実用例。
ま、理屈はコレでおしまいなんだけど。
あとは細かい補足と実用例。
ここまでのまとめ
- 人間の目は、明るさには敏感、色合いの変化には鈍感
- 明るさ情報を維持したまま色合いの情報を間引く事で、見た目上の画質劣化を抑えたままデータ量を小さく出来る。
- YUVでは、UとVを隣接ピクセルとまとめる事で情報量を小さくする事が出来る
4.関連情報
後は物の名前とか実用例とか
そんなごちゃごちゃした話
そんなごちゃごちゃした話
まず、色空間という単語。
RGBで表現するか、YUVで表現するか
(あるいは他で表現するか)
こういうのを色空間と呼ぶ
RGBで表現するか、YUVで表現するか
(あるいは他で表現するか)
こういうのを色空間と呼ぶ
なんで「空間」なのかは大学数学レベルの話なのでパス。
名前だけ知ってりゃいい。
大学で数学をやった人なら
RGBもYUVも(3次元)ベクトルだから、と言えば何となく分かるか
名前だけ知ってりゃいい。
大学で数学をやった人なら
RGBもYUVも(3次元)ベクトルだから、と言えば何となく分かるか
で、YUVで色を間引く方法にも名前がついている
YUVのそれぞれに対し、4ピクセルごとに何ビット割くか?の数字が後ろにつく
何もしないのがYUV444
2ピクセルごとに色度をまとめる方法はYUV422
4ピクセルごとにまとめるのはYUV411、もしくは420
YUVのそれぞれに対し、4ピクセルごとに何ビット割くか?の数字が後ろにつく
何もしないのがYUV444
2ピクセルごとに色度をまとめる方法はYUV422
4ピクセルごとにまとめるのはYUV411、もしくは420
411と420の違いは、どうやって四角を重ね合わせるかの話
ストレートにやるのが411
ちょっと凝った方法が420、基本は同じなので詳細はパス
ストレートにやるのが411
ちょっと凝った方法が420、基本は同じなので詳細はパス
で、ここからだ
まず、VP6で採用されているのは、YUV4:2:0(YV12)
ま、この辺は勝手にソフトがやってくれるけどね
動画圧縮フォーマットは4:2:0でやるのが最近のトレンド
まず、VP6で採用されているのは、YUV4:2:0(YV12)
ま、この辺は勝手にソフトがやってくれるけどね
動画圧縮フォーマットは4:2:0でやるのが最近のトレンド
何も言わなきゃRGBで計算するわけだけど
RGBでやった結果と
RGBでやった結果と