二値化【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] ];
ピンバック: ガンマ補正(ルックアップテーブルの例) | イメージングソリューション
ピンバック: 画像処理フィルタ一覧、比較 | イメージングソリューション
ピンバック: Pタイル法 | イメージングソリューション