画像の圧縮アルゴリズムについて - 一回目

2007年10月29日無駄知識

よ、ようやく、おわり、そう、だ…/,'3`ヽっ

画像の圧縮アルゴリズムについて - 一回目

/**
 * ・画像の圧縮アルゴリズム - 効率の良い圧縮
 * ・波って現象 波動と光波・光子・量子
 * ・サンゴ礁の生産能力は熱帯雨林並!
 * ・現実のテレポーテーション - 量子テレポーテーション
 * ・リアル沖縄植物相
 * ・宇宙の終焉 - 諸説入り乱れ
 */

 さて、一回休み入れたし、画像の圧縮アルゴリズムに入るとしましょうか
…うーむ、休み入れるとどうも感覚思い出せなくなるな
まぁ、ともかく、これはちょっと詳しくやろうかと思いますので最低2回分だとは思います

 ハイ、実は前回…いや、前々回と言うべきか?
ともかく、前の題で「二進数」を持ってきたのはこのネタのための前準備であります
割と画像とかはバイナリレベルで話す必要があるので、二進数を理解していないとかなり面倒
…とは言え、私の稚拙な文章ではどれだけ理解が得られるかも分かりませんが

 まず、画像と言うのがどのように表示されているのか、というところから説明しましょう
基本的にPCのディスプレイはその種類に関わらず、RGBの加色混法で表現されます

これがどう言う事かと言えば…
全ての光からR(赤)・G(緑)・B(青)の三色に分解し
それぞれの強度を変えることにより色を作り出す、と言う手法です
太陽光や蛍光灯などの光も、「人間に対しては」ほぼ同様の処理を行うことが可能です
この場合、RGB全てを最大にした状態が真っ白となりますので
蛍光灯や太陽の光はかなり強い光だと言えますね

実際のところは強い光と言うのはやや語弊があるのだけど
ここでは話がややこしくなるので放置します

閑話休題、つまりディスプレイはこのRGBの割合を操作した光を放ち、人の目に見せているわけです
ソレ即ち、画像もRGBで表現してやれば良い、ということになりますね

更に細かく言えば、液晶には透過型と反射型が存在します
バックライトから通過する光の種類を制限するのが透過型
直に当たる光を一定の種類のみ反射するようにするのが反射型というわけですね
この液晶の原理と言うのも調べると実に興味深いのですが、その話はまた今度の機会に

ディスプレイでは基本的に「ドット」とか「ピクセル」と呼ばれる最小の表示単位が存在します
ソレに合わせて、画像のRGBのデータを配置していけば良いことになりますので
全体が白で5px*5pxの画像だったりすると…

RGB,RGB,RGB,RGB,RGB
RGB,RGB,RGB,RGB,RGB
RGB,RGB,RGB,RGB,RGB
RGB,RGB,RGB,RGB,RGB
RGB,RGB,RGB,RGB,RGB

と言うようなデータがあれば、表示ができると言うことになります
さて、ここで前にやった二進数の出番となります
R/G/Bのそれぞれを、コンピュータが処理を得意とする二進数で有無表現してみましょう
ここでは3桁で1pxを、横幅は5px…つまり3*5=15桁で一行を表すことにしておきます
すると…

111111111111111111111111111111111111111111111111111111111111111111111111111

凄く…分かりづらいです…
まぁ、ともかく、画像のデータと言うのはこのようにして保存されています
これを画像に戻す時は、先ほど決めた通りに
「3桁を1px、1桁ごとにR/G/Bを有・無で表現し、15桁に達したら改行する」
と読めば良いわけです

これで単純な画像のデータを作成することができました
実際にディスプレイが解釈できる形へ加工して、渡すことができれば表示もできると思いますよ
ですが、この状態では1pxにつき

111:白
110:黄
101:紫
011:水
001:青
010:緑
100:赤
000:黒

で合計8色しか使えないことになります
これを色の数を増やそうと思った場合、R/G/Bそれぞれの段階の数を増やしてやれば良いので…
それぞれに二桁ずつ、1pxで計6桁使用するようにしてみましょう、すると…

111111
111110
111101
111011
110111
101111
011111...

なんて全部書くと偉いことになるので計算します
えーと、単純に、2の6乗ですので64通りですか
ハイ、これで1px辺りに必要な桁数は2倍になりましたが、色の数は8倍になりました
しかしこれでもまだまだ少ない感はありますね、写真なんかにはとても無理です

…じゃあ写真などではどこまで行けば良いのか、と言う話になりますが
現時点で主流は24桁、或いは32桁と言ったところです
この形式のことをトゥルーカラーとかフルカラーと呼びます
1pxに24桁ですから

000000000000000000000000

↑これで1pxの黒い点になります
うん、なんとなく画像が重い理由は分かってもらえたかな
ちなみに、「あ」と言う日本語文字は二進数で表すと
[ 1000001010100000 ] *Shift_JISの場合
えーと、16桁ですか8桁ほどトゥルーカラーより多いですね
この桁数=bitなので、「あ」一文字は16bit、トゥルーカラーの黒い1pxは24bitとなります

つまり、トゥルーカラーの10*10サイズ画像があった場合
10*10*24=2400bit
この分量を文字で埋め尽くそうとすると…
2400/16=150文字
えぇ、高々10*10の画像が原稿用紙の2/5ぐらいの文字と同様の量なのです

流石にコレではマトモに扱うことができない…
何しろ、偽島でお馴染みのプロフ絵サイズ250*~…300にしておきましょうか
250*300だったりすると1800000bit、219KB程となります…あ、1byte=8bitね、1KB=1024byteで

えーと、219KBとなると…112640文字
…じゅういちまん?

ま、まぁ、ともかく、これでは洒落になっていませんので
どうにかしてこのデータのサイズを落とす必要が出てきます
それが今回・次回の題である「画像圧縮」

皆さんが日頃目にしている「.jpg」や「.gif」「.png」などのことですね
ではそれぞれの特徴を…と言いたいところですが、とりあえず今日はここまで!


 今日はちと散逸と言うか、まとまりの無い話だったので纏めておきましょうか


・ディスプレイはRGB加色混法式表示

・RGBでは赤色光・緑色光・青色光の3種に光を分解する

・二進数の1桁=1bit

・RGBそれぞれに1bitずつ割り振ると、計3bitで8色まで出せる

・RGBそれぞれに8bit、合計24bitで色を表す形式をトゥルーカラー、またはフルカラーと呼ぶ
 なお、この状態では色の数は2^24=16777216
 一千六百七十七万七千二百十六通りである

・しかしデータサイズが大きすぎてマトモには扱えない

・試しに100*100サイズなら100*100*24=240000bit
 30000byte≒29KB である、文字に換算して15000字程

・1byte=8bit
 1KB=1024byte

・普段Web上で見る画像は大抵圧縮画像


 ま、こんなものですか
今回の部分までは準備運動ですので
言われたら「あー、そうだったね」ぐらいまで行くと良いかもしれません

では、それぞれの圧縮法や特徴、巧い扱い方などに関してはまた次回…


また急に休むかも知れんがな!



同じカテゴリー(無駄知識)の記事

この記事へのトラックバックURL

<%PingExcerpt%> <%PingTitle%> - <%PingBlogName%> at <%PingDateTime%>

上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。