画像処理入門
~画像(Bitmap)の入出力~
―――――――――――――――――――――――――――――――――
画像処理のために最初にすること、画像の読み込みと書き込みについてです。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BitmapはWindowsが標準でサポートしている画像フォーマットです。
BitmapにはOS/2とWindows用、また1ピクセル当たりのビット数(1,2,8,24)によって、
ヘッダー情報が異なります。
ここでは、Windows用の24bit Bitmapについて説明します。
ヘッダー情報の含まれていないRAW画像の方が読み込み、書き込みの観点では楽なのですが、
表示・保存できるソフトが少ないので、Bitmapを用いて画像処理を学んでいきます。
Bitmapフォーマットは大雑把に分けると次のように表すことができます。
①ファイルヘッダー (14 Byte) |
②情報ヘッダー (40 Byte) |
③画像データ (不定) |
① ファイルヘッダー
ファイルヘッダー部には14 byteのデータが格納されています。
最初のbfTypeが”BM”であればビットマップであると判断します。
また、bfReaserved1とbfReaserved2は常に0です。
typedef struct { char bfType[2]; //2 byte -> “BM” int bfSize; //4 byte -> ファイルのサイズ short int bfReserved1; //2 byte -> 0 short int bfReserved2; //2 byte -> 0 int bfOffBits; //4 byte -> 画像データまでのオフセット } BmpFileHeader; |
② 情報ヘッダー
情報ヘッダー部には40 byteのデータが格納されています。
画像の横(width)と縦(height)のサイズや、また1ピクセル当たりのビット数(biBitCount)が含まれます。
当然、今回使用するフォーマットではbiBitCounthは24です。
typedef struct { int biSize; //4 byte -> 情報ヘッダーのサイズ int biWidth; //4 byte -> 画像の横幅 int biHeight; //4 byte -> 画像の縦幅 short int biPlanes; //2 byte short int biBitCount; //2 byte -> 1 pixelのサイズ int biCompression; //4 byte int biSizeImage; //4 byte int biXPixPerMeter; //4 byte int biYPixPerMeter; //4 byte int biClrUsed; //4 byte int biClrImporant; //4 byte } BmpInfoHeader; |
③ 画像データ
画像データが1ピクセルごとにBlue(8 bit)、Green(8 bit)、Red(8 bit)の順番に格納されています。
(つまり1ピクセル当たり8 bit×3色 = 24 bit)
また、1行のサイズ(width×3 byte)が4 byteの倍数でなければならないので、
4の倍数にならない場合は0で埋められています。
例えば極端な例ですが、幅が2 pixelの画像ではwidth×3 byte = 6 byteですから、
4の倍数には2 byte足りません。そこで、以下のようにその2 byteを0で埋めます。
青、緑、赤、青、緑、赤、0、0
実際にビットマップのフォーマットを見てみましょう。
↑の画像(64*32)をバイナリエディタTSXBINを用いて読み込んでみた結果です。
画像データには画像の端、黄色の情報が映っていますが、
赤成分と緑成分の値が大きく青成分が0であることから、すなわち黄色を示していることがわかります。