二値化【Binarization】では画像の輝度値が指定した値(しきい値【Threshold】)以上の場合は白、値未満の場合は黒にする処理を行います。
→ | ||
二値化処理前 | 二値化処理後 |
二値化処理では上図のように、しきい値付近に輝度値の変動がある場合、二値化処理を行うと点々とした画素が残ってしまうため、この場合は二値化処理を行う前に平滑化フィルタやメディアンフィルタなどのノイズ除去を行ってから二値化処理を行う場合が多くあります。 また、二値化処理を行うと画像の輝度値は白と黒しかないため、白の輝度値を1、黒の輝度値を0とし、1画素を1ビットであらわす事ができ、画像データサイズを小さくすることができるのですが、1画素を1ビットであらわすと各画素の輝度値の参照がかえって面倒になってしまうので、画像処理のプログラムでは白の輝度値を255、黒の輝度値を0として、1画素8ビット(1バイト)で扱う場合の方が一般的です。 (フォトレタッチ系のソフトでは1画素1ビットで扱う場合の方が多いと思います。)
【二値化処理の応用例】
- 欠陥検出
- 領域分割、抽出
- 処理領域のマスク(領域指定)
など
【二値化プログラム例】
●効率の悪いプログラム例
for (j = 0; j < Height ; j++){
for ( i = 0; i < Width; i++){
//入力画像の輝度値の取得
Bright = pSrc[i + j * Width];
//二値化処理
if (Bright >= Threshold)
pDst[i + j * Width] = 255;
else
pDst[i + j * Width] =0;
}
}
このプログラムでは画像の全画素をif文で処理しているので、非常に非効率です。 この部分はルックアップテーブルを用いて最適化します。 また、この例では二重ループを用いて画像の輝度値を二次元的に参照していますが、二値化処理では近傍画素を用いて処理を行わないので、画像データをただの一次元的な配列として捉えても構いません。 ということで、最適化したのが以下の例です。
●効率の良いプログラム例
unsigned char LUT[256] = {0};
//二値化ルックアップテーブルの作成
for ( i = Threshold; i < 256; i++)
LUT[i] = 255;
//二値化処理
for ( i = 0; i < Width * Height; i++)
pDst[i] = LUT[ pSrc[i] ];
コメント
[…] 他にも二値化処理や、輝度値を0~255の範囲内に収めるための if 文の代わりなどにも応用できる場合があるので、処理を高速にしたい場合は、このルックアップテーブルが使えるか […]
[…] 二値化、Pタイル法、判別分析法(大津の二値化) […]
[…] Pタイル法【Percentile Method】は、画像の二値化したい領域が全画像の領域に占める割合をパーセント(%)で指定し二値化する手法です。 […]