IplImageにおけるデータの格納方法

marseditgasoti.jpg

IplImageのImageDataに画素データが埋め込まれています。

ここでは、どのように画素データが埋め込まれているかについて解説します。

コンピュータ上の画像の定義

画素

はじめに、コンピュータ上の画像をIplImageがどのように理解しているかを解説します。

まず、画像は正方形で区切られています。

この区切られた正方形を画素といいます。

ですから、いくら画像を拡大しても正方形しか見えないわけです。

そして、画像における横方向の画素の数が幅であり、縦方向の画素数が高さとなります。

IplImageでは幅がwidthで高さはdepthで表されます。

チャネル数

そして、この画素に色が定義されます。

カラーの場合は色の三原色である赤(Red)、青(Blue)、緑(Green)の値を指定すればOKです。

グレースケールの場合は、ひとつの値を指定します。

この色の数をチャネル数といいIplImageではnChannelsで指定します。カラーなら

nChannels=3

だし、グレースケールなら1となります。

ビット深度

最後に、色の濃さはビット深度で表されます。ビット深度は

  • IPL_DEPTH_8U:符号なし8ビット整数
  • IPL_DEPTH_8S:符号あり8ビット整数
  • IPL_DEPTH_16U:符号なし16ビット整数
  • IPL_DEPTH_16S:符号あり16ビット整数
  • IPL_DEPTH_32S:符号あり32ビット整数
  • IPL_DEPTH_32F:単精度浮動小数点
  • IPL_DEPTH_64F:倍精度浮動小数点

で指定できます。8ビットときたら、2の8乗で256で、0から255の値をとります。

よくカラーの設定で、255が最大となるのを見かけると思います。

ビット深度はカラーの場合は、赤、青、緑の3つの設定が必要となります。

 

IplImageにおけるデータの格納方法

いよいよIplImageのImageDataにおいてどのように画素データが格納してあるかを説明します。

はじめに、

char *imageData;

であることを理解してください。これは、imageDataはchar型で8ビット=1バイトのデータ入ります。

ですから、これでメモリを確保すれば、1バイトの箱を最小単位とした配列ができます。

この箱に画素データを入れていくことになります。

 

では、

  • 画像の幅が2、高さが4
  • チャネル数が3(カラー)
  • ビット深度が16ビット

の画素データの格納法について解説します。この場合は、

(0,0),(0,1),

(1,0),(1,1),

(2,0),(2,1),

(3,0),(3,1)

の順に画素データが格納されます。そして、画素には

青(16ビット),緑(16ビット),赤(16ビット)

の順にデータが格納されます。よって、

画素データの格納のされ方

というようにchar型の配列ImageDataに格納されます。

ImageData[16]

とすれば、画素(0,1)の赤の画素値の半分が得られることになります。

画素データの格納方法を理解することはプログラムを組む上で重要なのでしっかり理解しましょう。

著者:安井 真人(やすい まさと)