LoginSignup
3
5

More than 5 years have passed since last update.

非プログラマーのためのデジタル画像入門講座

Last updated at Posted at 2016-03-30

一口にデジタル画像って言ってもいろいろあるよ!というお話です。

その前にパソコンで色はどう扱うの?

実はこの話ものすごく闇が深いんですが、そういう怖い闇は触れずに話をします(ITU-R BT.709-3とかITU-R ITU-R BT.601言われてもわからんでしょ、俺も正確にはわからん)。

光の三原則とか聞いたことがあると思います。
RGB加法三原色

いわゆるR(Red)G(Green)B(Blue)ですね。言い換えると3つの色からすべての色が作れるよ、ということです(だいぶ語弊ありますが)。

私が大嫌いで仕方がない数学的にいうと、単位ベクトルが3つ存在する世界だということです。

RGB以外にも動画でお馴染みYCbCrやYPbPr、HSBやHSV、xyzなどいろいろ表し方はありますが、とりあえずRGBだけわかっていればいいと思います。

まずデジタル画像を2つに分けるよ

デジタル画像と言ってもラスター形式とベクター形式の2つがあります。なにそれ美味しいの?

ラスター形式

多分もっとも一般的なデジタル画像形式です。.jpgとか.pngとか.gifとか.bmpとかみたことあるんじゃ無いでしょうか?あれです。

パソコンのモニターで表示する以上、後述するベクター形式も内部的にこれに変換されます。

イメージとしては、表をイメージしてください。

box.png

こんな画像があった時、

(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なんかがこれに該当します。

svgの例(抜粋)
     <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>

で、どう使い分けるのさ

メリット デメリット
ラスター
  • 一般的にお絵書きならこっち
  • 複雑な図形でもデータが小さい
  • その気になれば圧縮しやすい
  • 拡大縮小すると画質が下がる、とくに拡大時(waifu2xという機械学習を利用したものである程度ましになるが)
  • 容量を小さくするには画質が犠牲になる
ベクター
  • 劣化の余地が無い
  • 拡大縮小によって画質が変化しない
  • シンプルな図形なら容量が小さい
  • 複雑な図形ほど容量が大きくなる
  • プログラム的に扱いがやや面倒

ラスター画像を3つに分けるよ

無圧縮

.bmpとか.ppmとか。色をRGBではなくカラーテーブルを作ってたりするけど(色に名前をつけてそれで管理する)基本RGBがそのまま羅列されている

ppm/P3
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編集リクエストしていただければ幸いです。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5