今回は「コンピュータと戯れて」と題して、画像と戯れることにしました。
だからと言って、ここで JEPG などの圧縮方式などと戯れるつもりはありません。ですからベクター量子化(Vector Quantization)や DCT(離散余弦変換 Discrete Cosine Transform)などとは戯れません。

今回はもっとレベルの低いところで、殆ど素に近いレベルから画像について戯れた結果を纏めました。
ために よりよく こんぴーたー について理解を深めるために纏めた内容を列挙しているに過ぎません ・・・ だから基本的に興味のあるものしか扱わないのであしからず



画像について調べてみると ・・・ なんとこれが奥深く、深海6000でも辿り着くのが困難なぐらい興味深い世界です。一介のド素人が迂闊に踏み入れようもんなら、たちまち情報の洪水に飲み込まれて、「ここは誰?私は何処?」と、現実逃避の末、「すべてなかったことにしよう」と、のたまわってしまうぐらいの世界でした・・ちょっと大袈裟か?いや〜、でも最後には光の波長がドッタラコウシタ、CRT の出力パルスがドッタラコウシタな話しに行ってしまい、わたくし逝ってしまいました。
う〜ん、奥が深い、っと納得していても話しが進まないので、まずは画像出力データの形式について見てみます。

一般的には二つの形式があるようです。

一つが Vector Graphics Representation で、一方が Raster Graphics Representation だそうです。しかしまぁ、コンピュータの世界って横文字が多いよな ・・・・

まずはこの Vector Graphics Representation ですが、辞書を調べて各々の単語の意味を調べてみませう。
Vector は言わずと知れたベクトルですよね ・・、さらに Graphics には製図法、図学、グラフ、図などの意味があります。最後に Representation には表現、描写、表出・・・

つまり Vector Graphics Representation とは、ベクター方式製図描写とでもいうのでしょう。でも、ベクトルと言いながら何がベクトルなんだろう? ・・・ ベクトルって方向、長さ、向きを持った定量成分だし ・・
さて、この画像描画手法がどんなものかと申しますと、簡単に纏めると『画像情報を図形情報の集合体として表現する方法』です。さらに簡単に言えば、画像データを図形情報として捉えているのです。
具体的には点と点の集合情報で線分や円成分を表現し、この単純化された図形情報の集合体として複雑な画像を描写するわけです。その際 たぶん、線分の始点や終点から方向成分が決定されたり、外積方向を正方向と認識したりするから Vector Respresent なのでしょう。
ところで Vector Graphics は、単純な図形を素体として複雑な情報体を表現するため、この素体を Object として捉えることができます。さらに複数の図形情報体も Object として扱うことが出来るため、CAD ツールなどの Object Oriented Graphics の概念を実現することが可能になります。う〜ん、奥が深いですね、でもこれ以上 Vector Graphics Representation について深追いするつもりはないです


さて、次は以後の目玉となる Raster Graphics Representation を取り上げます。
まずはRasterですが・・・タイルなどでラスターなる言葉が使われていますが、元々の語源はこの辺から来ているのでしょう。これはあくまでも私の推測です・・・語源などはこの辺りにして、実際に Raster Graphics がどのようなものか説明しましょう。ところで、始めは自分のための資料にするつもりで書いていたのだが、段々第三者に説明するような文体になってきたなぁ〜(まぁ、いいか、Web で公開しているんだから)

簡単な説明では、「虫眼鏡で貴方の前にある CRT をよーく見てごらん」 ・・・「ほらウールだよ」冗談はさておいて 画像を拡大して見ると無数の光点で構成されているでしょう。この様な点集合で形成された画像情報をラスターといいます。そういえばタイル画も素単位の集合体ですよね?

少し言葉を難しくすると Raster Graphics とは、画像情報を格子状(グリッド)に分割し、格画素に対して光値を個別に割り当てる画像描画手法のことです ・・・ 一般的に こんぴーたの業界では Raster Graphics のことを Bitmap Representation と言います。
では、Bitmap とは?
これはですね ・・・ 画像イメージに対してビットを素としたデータポイントがマップされるところから、
データポイントマップ する→ ビットマップ する→ ビットマップ
こんな具合に命名されたわけです ・・・ ちなみにマップとは Map であり、学生英語では地図と訳されるところですが、Map 本来の意味のニュアンスは 「射影」 です。つまり、結び付けが本来の意味です ・・・ つまり地図とは、縮尺された情報と現実の地形を結びつけたものというものです。いや〜、コンピュータをいじっていると英語 ・・・ 正確にはラテン語をベースとした欧州の言葉が勉強できますね。さて、ビット情報をマッピングするラスタ表現をもう少し詳しく解説しましょう ・・・ って言うか、今回はこの Bitmap で戯れるつもりです。

ようはラスタとは、点要素を格子状に並ばして画像を表現する方法のことで、画像表示デバイスや印字デバイスなどの電算機の最終的な画像出力方式なのです。

ちっと、ここから話しを一脱しますが ・・・ まったく関係の無い話題ではないのでしばらくは我慢してください。え〜っと、まずは用語の説明が必要と思われるので、私なりにそれぞれの用語を纏めてみました ・・・ 興味の無い人は読み飛ばしてください

Raster 方式の画像に使われる基本単位というか、最小単位を 画素 と呼びます。この画素のことを横文字文化圏では Pixel と呼んでいます。「画(Picture)の要素(Element)」を組み合わせたものらしい・・真意は不明
さて、(ところで、この 「さて、」 ってなんだか私の書き癖のようですね) Pixel が出てきたついでに ppi や dpi なんぞの用語の説明も取り扱ってみましょう・・・
前述にもあるように Raster 方式では、画素の要素数によって出力結果に影響が出てきます。ようはより細密に表現された画像の方が美しいのです ・・ とどのつまり、画素数が多ければ多いほど精密な画像を表示することが出来ます。故に Raster 方式で出力されるデバイスには画素の細密度を定量化した単位が存在するのです。これを 解像度 と言います。(もっともCRTなんぞを対象に扱う場合 Dot Pitch とか Mask Pitch とか言う方もいますが)ところが厄介なことにこの解像度はインチ単位がベースなのです ・・・ もっともこんぴーた自体があめ〜りかで発展した道具であるためインチが使われるているのです。(でも、工業製品を作っている日本やISO準拠を謳う欧州(特に仏蘭西)はSI単位系なんだからさぁ ・・ インチはやめようよ)
解像度を表現するための単位が ppi (Pixel Per Inch)です、馴染みのある言い回しでは dpi (Dot Per Inch)です。さて、CRT などの画像出力デバイスやプリンタなどの印字デバイス、デジカメ(デジカメって、どうしてもでばがめを想像してしまう言い回しやな)のようなや画像入力デバイスなどの解像度の特性の話しになると ・・・ 結構この手の話しが好きなもんで際限がなくなりそうなのでこれ以上深い追いすることはしません・・・
そこでこのネタの最後にちょっとした計算をしてみました・・・
まず、標準的な CRT のドットピッチ(ドットの間隔)が 0.28mm 程度なので、この値がdpiではどれぐらいか算出してみます・・つまらない計算ですので読み飛ばしてもいいですよ;^^
このような式を用いるだけなので簡単な計算です。
x [dpi] = 25.4 / y : (y にドットピッチを代入、ただしミリであること!)
すると
x = 25.4 / 0.28 = 90.71428571 dpi
0.28mm のドットピッチを dpi で表記すると約91 dpi 程度になります。さて、あたりまえのことですが、スキャナからの画像取り込みや画像データの CRT への出力、プリンターなどへの印字デバイスへの出力等を行う際には、この値を考慮しておかないとイメージ通りの結果を得ることが出来なくなります。

ちなみに情報量という観点からではVector Graphics の方が Raster Graphicsと比べ画像情報量を少なくできます ・・ そりゃそうだろう。画像イメージをタイルパターンとして全て保持しているのと、基点の集合だけを図形データとして保持しているから ・・ つまらない話しをしてごめん



あぅ〜、たかがVector Graphics Representation と Raster Graphics Representation を簡単に説明するだけでこんなに長くなってしもうった。まいったな〜、これから色に関してだらだらと纏めるつもりだったんだが・・・


さて、気を取り直して始めましょう、まずは色ですが、色とはなんぞや?その前に私たちが如何にして色を識別しているか、ご存知ですか?
私たちを含め視覚感覚器を保有する生物は、眼球に飛び込んで来た光の波長に応じて色を認識しております。波長とは光の強度程度と理解してください。つまり波長が長いと光の周波数は長くなりエネルギーは小さくなります。逆に波長が短いと周波数が大きくなり、エネルギーが大きくなります。イメージ的には ・・・ 物理をやっている人からは石を投げられそうな表現になりますが、光は粒であるとメタ化(形而上的模型化)すると波長が短い光は粒が飛び込んでくる間隔が短く、波長が長いと粒の飛び込む間隔は長くなると解釈してください、そして粒の当たる間隔がエネルギーと解釈してください。
さて、では物の色を感覚器は如何に識別しているのか?これはですね、感覚器に進入した波長を脳が識別しているのですが、では、どのようにして光が感覚器に飛び込むか考察してみてください。
光が感覚器に進入するまでの経路ですが、一般に三つのパターンがあります。一つは自らが光を発する場合と外部からの光を反射する場合、さらに光が何かを透過する場合です。具体的には、自ら発するケースにおいては必ず発光体が存在します。例えば燃え盛る炎とか、化学反応で発光するものが出す光(蛍の光とか)です。次に反射のケースですが、これは発光体から照らされた物体が、その光を反射する際に入射光の一部を吸収したり、加えたりして、変化した波長の反射光を照射します。この変化した光を私たちのおめめが受け取ることで物体の色を認識します。最後に透過した光が透過した物体によってエネルギーの増減されてしますケースです。ちなみに反射も透過も物質固有にその性質が決まっています。
光に関するイメージはこれぐらいにして、このページの主旨に則った話しに戻しましょう。まずはCRTなどのデバイスは光を発しています。さらに印刷された画像は、塗料を用いて反射した光を眼に渡します。察しのいい人は、ここまでが RGB や CMY へのネタ振りだと気がついたはずです
まずメインディッシュは後にするとして、色の中でも割りと単純なモノクロから始めましょう。さくっと終わらせるために用語の説明だけで済ませるつもりですのであしからず
まず 階調 と言う言葉から説明しておきます。
今、話題の対象としているのはあくまでもコンピュータの世界です。そこで濃淡を表すために使うレベル値が階調です。でぇ、この階調ですが、一般にビットで表記されます。
では、階調も分かったところで、もっとも単純な画像情報は完全なモノクロです。白と黒の点の集合で画像を表現したものです。これを表記するために1ピクセルに辺りに1ビットの情報を当てるわけです。例えば黒を表記するのにビットを立て、白の表記はビットを落とします。
つまり4x4の合計16ピクセルの画像を表現するには16ビット(2バイト)のデータ量になります。ただし残念ながらたいていのこんぴーたはバイト単位でデータを扱うため、2バイトにはならず16バイトになります。もっともこれはプログラマーの怠慢が主たる原因なのでしょう。なぜって?それはですね、ビット列で扱うよりバイト列で扱うほうがプログラミングが楽だからです。・・・蛇足ですが昔、通信関連のプログラムを作るっているときに独自仕様の画像フォーマットを使い、ビット単位で情報を保持するものを作った経験があります さて、以下に画像データのイメージを具体例で示します。
4x4のデータ列
1001 0110 0110 1001

HexとDecでは
0x96(150) 0x69(105)
パターンイメージ
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 0
ビットパターンイメージ
このように単純に白と黒で画像を表現するものを白黒の二階調イメージと言います。
勘の良い方はもうお気づきでしょう。
バイト単位でデータを扱うということは白黒の濃淡を表現することが可能なのです。もう少し噛み砕くと、白と黒の情報を記憶するために仮に一バイト消費するとしますと、白に0x00 、黒に 0xFF (ここで十六進数法表記を使わせて頂きます)を割り当てたとすると、その中間の値を濃淡、つまり明度を表記することができます。一部の人は、「深さをビットで表す」と表現している人がいました。英語などでも 「images depth is 4 bits」などと表記している本がありました。
このように白黒なんだけど明度によって灰色を表現した画像データを Gray scale image と呼びます。
ちなみに人間の肉眼で判る程度の明度は、64階調程度で十分と言われているので現実的には6ビット程度の深さで丁度よいでしょう。この6ビットという値は、2の6乗が64であるところから算出されています。これはコンピュータの情報単位が所詮ビット列であるからです ところが CRT などのようなデバイスでしたら簡単に GrayScale を表現することができますが、プリンターのような印刷デバイスなどでは GrayScale が使えない場合があります。まぁ話しが逸れるので深追いはしませんが、単純に白黒の表現能力しかない場合には擬似的に白黒の画像に明暗を表現する手法があります。基本的は人の目の錯覚を用いるのです
この手法を Half Toning とか Dithering などと呼びます。簡単には数個のピクセル集合を一つの単位として、これを網点といいますが、この網点の集合体で画像を構成します。このとき網点に対するピクセル集合体の個数を変えることで擬似的に人の錯覚を利用して中間調を作り出します。
最後に Half Toning を用いる際に使われる単位を紹介します。Half Toneにおける一インチ辺りの解像度に相当するもので、線数 と呼ばれます。単位には lpi (Lines Per Inch)が使われます。算出方法ですが以下の式を用いてください。
線数 = (解像度2 / 階調レベル)1/2
この式を用いると、例えば 500 dpi 上に 256階調の画像を表現したものは約 31 lpi 程度のものになります。つまりですね、白と黒しか表現できないデバイス上で白黒画像に明暗を付けた状態で表現しようとすると画質が劣悪になってしまうのです。それ以外にも欠点があります。例えばイメージ編集がし難くなったり、モアレパターンが出たり・・・

モノクロに関してはこれぐらいにしていよいよカラーですね、っと続きを書きたいところですが行数も長くなってきたので今回はここの辺りでやめます・・・つまりつづく

ほぇ?つづくんかいな、これ!
いや〜、つづくんですね・・・ではまた


つづく

 



目次に戻る
全文メニュー
サイトの玄関