一口にデジタル画像って言ってもいろいろあるよ!というお話です。
その前にパソコンで色はどう扱うの?
実はこの話ものすごく闇が深いんですが、そういう怖い闇は触れずに話をします(ITU-R BT.709-3
とかITU-R ITU-R BT.601
言われてもわからんでしょ、俺も正確にはわからん)。
光の三原則とか聞いたことがあると思います。
いわゆるR(Red)G(Green)B(Blue)ですね。言い換えると3つの色からすべての色が作れるよ、ということです(だいぶ語弊ありますが)。
私が大嫌いで仕方がない数学的にいうと、単位ベクトルが3つ存在する世界だということです。
RGB以外にも動画でお馴染みYCbCrやYPbPr、HSBやHSV、xyzなどいろいろ表し方はありますが、とりあえずRGBだけわかっていればいいと思います。
まずデジタル画像を2つに分けるよ
デジタル画像と言ってもラスター形式とベクター形式の2つがあります。なにそれ美味しいの?
ラスター形式
多分もっとも一般的なデジタル画像形式です。.jpg
とか.png
とか.gif
とか.bmp
とかみたことあるんじゃ無いでしょうか?あれです。
パソコンのモニターで表示する以上、後述するベクター形式も内部的にこれに変換されます。
イメージとしては、表をイメージしてください。
こんな画像があった時、
(R, G, B) (0 <= R <= 255, 0 <= G <= 255, 0 <= B <= 255)
(255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (200,179,216) | (172,140,197) | (247,245,250) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) |
(255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (204,185,219) | (130,82,167) | (106,50,151) | (105,48,150) | (119,67,159) | (200,179,216) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) |
(255,255,255) | (237,232,243) | (147,107,180) | (109,54,153) | (103,46,149) | (124,74,163) | (233,225,240) | (238,231,243) | (224,212,233) | (119,68,160) | (172,140,197) | (123,73,162) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) |
(252,251,253) | (103,45,149) | (112,57,155) | (169,136,195) | (238,231,243) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (240,235,245) | (141,97,175) | (118,66,159) | (150,111,182) | (255,255,255) | (255,255,255) | (255,255,255) |
(255,255,255) | (103,45,149) | (103,45,149) | (219,205,230) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (252,251,253) | (168,135,194) | (106,49,151) | (173,142,197) | (255,255,255) | (255,255,255) |
(255,255,255) | (103,45,149) | (147,107,180) | (103,45,149) | (133,87,169) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (233,225,240) | (137,93,173) | (103,45,149) | (245,241,248) | (255,255,255) |
(255,255,255) | (103,45,149) | (255,255,255) | (167,134,193) | (103,45,149) | (146,105,179) | (255,255,255) | (255,255,255) | (255,255,255) | (209,192,223) | (145,104,178) | (114,61,157) | (174,143,198) | (103,45,149) | (255,255,255) | (255,255,255) |
(255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) | (164,129,191) | (103,45,149) | (158,120,187) | (188,162,208) | (124,74,163) | (131,84,168) | (195,172,213) | (250,248,251) | (255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) |
(255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) | (255,255,255) | (154,116,184) | (103,45,149) | (147,107,179) | (221,208,231) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) |
(255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) |
(245,241,248) | (103,45,149) | (219,205,230) | (255,255,255) | (255,255,255) | (255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) |
(255,255,255) | (147,107,180) | (103,45,149) | (170,138,195) | (255,255,255) | (255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) |
(255,255,255) | (255,255,255) | (204,185,220) | (103,45,149) | (170,138,195) | (255,255,255) | (103,45,149) | (255,255,255) | (255,255,255) | (255,255,255) | (238,231,243) | (195,172,213) | (153,114,183) | (103,45,149) | (255,255,255) | (255,255,255) |
(255,255,255) | (255,255,255) | (255,255,255) | (147,107,180) | (103,45,149) | (170,138,195) | (103,45,149) | (216,202,228) | (174,143,198) | (129,81,167) | (117,64,158) | (160,124,188) | (202,182,218) | (245,241,248) | (255,255,255) | (255,255,255) |
(255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (147,107,180) | (103,45,149) | (103,45,149) | (129,81,167) | (129,81,167) | (228,218,236) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) |
(255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (200,179,216) | (129,81,167) | (238,231,243) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) | (255,255,255) |
こんな感じに(実際にはもっとデータを小さくするためにいろいろしますが)保存されています。ようはドット絵ですね。
ちなみにこの表1マスのことをピクセル(Pixcel)といい、横一列を走査線と呼んだりします。
ベクター形式
ベクターというとピンと来ない人はベクトルといえばピンときますかね?そうです、高校の数Bで習うあれです。
まあ実際には単に向きと方向だけでは無いですが、こんな図形をここからここに、と言った命令が羅列されているものになります。.odg
,.svg
,.ai
やどっちかというと画像ではなくCADのデータになりますが.dxf
や.jww
なんかがこれに該当します。
<g class="com.sun.star.drawing.CustomShape">
<g id="id9">
<rect class="BoundingBox" stroke="none" fill="none" x="21771" y="7676" width="716" height="1486"/>
<path fill="rgb(0,123,67)" stroke="none" d="M 22128,7677 C 21950,7677 21772,7855 21772,8033 L 21772,8803 C 21772,8981 21950,9160 22128,9160 L 22128,9160 C 22306,9160 22485,8981 22485,8803 L 22485,8033 C 22485,7855 22306,7677 22128,7677 L 22128,7677 Z M 21772,7677 L 21772,7677 Z M 22485,9160 L 22485,9160 Z"/>
<path fill="none" stroke="rgb(0,123,67)" d="M 22128,7677 C 21950,7677 21772,7855 21772,8033 L 21772,8803 C 21772,8981 21950,9160 22128,9160 L 22128,9160 C 22306,9160 22485,8981 22485,8803 L 22485,8033 C 22485,7855 22306,7677 22128,7677 Z"/>
<path fill="none" stroke="rgb(0,123,67)" d="M 21772,7677 L 21772,7677 Z"/>
<path fill="none" stroke="rgb(0,123,67)" d="M 22485,9160 L 22485,9160 Z"/>
</g>
</g>
で、どう使い分けるのさ
メリット | デメリット | |
---|---|---|
ラスター |
|
|
ベクター |
|
|
ラスター画像を3つに分けるよ
無圧縮
.bmp
とか.ppm
とか。色をRGBではなくカラーテーブルを作ってたりするけど(色に名前をつけてそれで管理する)基本RGBがそのまま羅列されている
P3
16 16
255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 200 179 216 172 140 197 247 245 250 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 204 185 219 130 82 167 106 50 151 105 48 150 119 67 159 200 179 216 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 237 232 243 147 107 180 109 54 153 103 46 149 124 74 163 233 225 240 238 231 243 224 212 233 119 68 160 172 140 197 123 73 162 255 255 255 255 255 255 255 255 255 255 255 255
252 251 253 103 45 149 112 57 155 169 136 195 238 231 243 255 255 255 255 255 255 255 255 255 255 255 255 240 235 245 141 97 175 118 66 159 150 111 182 255 255 255 255 255 255 255 255 255
255 255 255 103 45 149 103 45 149 219 205 230 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 252 251 253 168 135 194 106 49 151 173 142 197 255 255 255 255 255 255
255 255 255 103 45 149 147 107 180 103 45 149 133 87 169 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 233 225 240 137 93 173 103 45 149 245 241 248 255 255 255
255 255 255 103 45 149 255 255 255 167 134 193 103 45 149 146 105 179 255 255 255 255 255 255 255 255 255 209 192 223 145 104 178 114 61 157 174 143 198 103 45 149 255 255 255 255 255 255
255 255 255 103 45 149 255 255 255 255 255 255 164 129 191 103 45 149 158 120 187 188 162 208 124 74 163 131 84 168 195 172 213 250 248 251 255 255 255 103 45 149 255 255 255 255 255 255
255 255 255 103 45 149 255 255 255 255 255 255 255 255 255 154 116 184 103 45 149 147 107 179 221 208 231 255 255 255 255 255 255 255 255 255 255 255 255 103 45 149 255 255 255 255 255 255
255 255 255 103 45 149 255 255 255 255 255 255 255 255 255 255 255 255 103 45 149 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 103 45 149 255 255 255 255 255 255
245 241 248 103 45 149 219 205 230 255 255 255 255 255 255 255 255 255 103 45 149 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 103 45 149 255 255 255 255 255 255
255 255 255 147 107 180 103 45 149 170 138 195 255 255 255 255 255 255 103 45 149 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 103 45 149 255 255 255 255 255 255
255 255 255 255 255 255 204 185 220 103 45 149 170 138 195 255 255 255 103 45 149 255 255 255 255 255 255 255 255 255 238 231 243 195 172 213 153 114 183 103 45 149 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 147 107 180 103 45 149 170 138 195 103 45 149 216 202 228 174 143 198 129 81 167 117 64 158 160 124 188 202 182 218 245 241 248 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 147 107 180 103 45 149 103 45 149 129 81 167 129 81 167 228 218 236 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 200 179 216 129 81 167 238 231 243 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
可逆圧縮
そのままRGBを羅列しているわけではないけど、圧縮しているもののうち、可逆圧縮のもの。.png
とか.gif
とか。
例えば
555555514444444111
というデータが有ったとすると、数字が何回連続で現れたかに注目して
5_8,1_1,4_7,1_3
と書けば短く表せる。でこれはちゃんと元の数字列に戻せるよね?こういうのを可逆圧縮というわけです。
非(不)可逆圧縮
可逆圧縮があるならその逆もあります。.jpg/.jpeg
が多分いちばん有名です
もとに戻せない圧縮ってどういうこと?と思うかもしれませんが説明すると専門的になりすぎるので割愛します。
データを破壊的に圧縮することで可逆圧縮よりもさらに小さくできます。
で、どう使い分ければいいんだ
基本的には可逆圧縮なPNGとか使っていればいいと思います。ただし、通信速度を基にしないといけないWebとかだと、劣化してもいいものはjpgが使われます。
ラスター画像に於いて、色をそのまま扱うか否かで分ける
そのまま扱う
png
とかppm
とかjpg
なんかが該当します(RGBで扱っているとは言っていない)
カラーテーブルを作って、色数に制約がある
bmp
の一部や.gif
などが該当します。例えば256(=0~2^8)色しか使えなかったり。
つまり減色という作業が発生します。例えば.gif
は可逆圧縮ですが、それは減色後(色数制限をクリアした後)のデータからみて可逆圧縮だということで、減色の仮定でデータは失われます
なぜ安易にJPEGをつかってはいけないか
単純明快で、非可逆圧縮だからです。非可逆圧縮ということは、破壊的圧縮ですから、圧縮したその瞬間、データが失われているということになります。一度失ったデータは取り戻せません。言い換えると、そのデータ、本当に劣化しても大丈夫ですか?ということです。
JPEGの場合、その圧縮アルゴリズムの関係で圧縮することによりノイズが発生しやすいです。
もちろん圧倒的にファイルサイズは小さくなるのでケースバイケースですが、用量用法は守って使いましょう
私が思うに、ほとんどの場面ではPNGにするべきです。
なぜ色空間についての話を避けるか
ちょっと前に
RGBで扱っているとは言っていない
と書きましたがどういうことでしょう?これが序盤に書いた闇の一つです。
コンピューターでは実数を扱えず、有限桁の小数がせいぜいです。また、小数は内部で指数を使って管理しています。
日経PC21 / 演算誤差の正体 - IEEE 754 浮動小数点数の仕組み
で何が言いたいかというと、つまり、0.01を100回足しあわせても1にはならないということです。
これがどう影響するかというと、数学的に例えばRGBとYCbCrの変換は可逆なのにコンピューター上では可逆にならないということです。
で、だから何?となりますが以下は
Aviutl の内部形式と x264guiEx の色空間変換について
にまるなげします
最後に
偉そうに書いていますが、書いている私自身全然詳しくなかったりするのでどこか間違っていたら、優しく指摘or編集リクエストしていただければ幸いです。