2値画像と4連結・8連結
2値画像と4連結・8連結
2024年10月26初稿
解説エッセイ『画像フィルターの概念説明』で自然画像≪
多値画像とし1バイト(8ビット≒0..255)画素画像の≫
処理として典型的な「画像フィルター」を説明しましたが、
多値画像を一旦、2値画像≪画素データとし「0,1」を
数値データとし扱う【但し、目で確認する場合は黒「0」は
ソノママだが白「1」を「255」と表示用】≫を扱う時の
基本概念を説明します!
1.連結性
注視点≪★≫から、上下左右に4方向に関係する事を4連結
と定義します!
注視点≪★≫から、上下左右に4方向に関係する事を4連結
と定義しましたが斜め方向≪左上・右上・左下・右下≫を
加えた上下左右斜めを8連結と定義します!
囲碁≪因みにコノゲームを表現する場合は3値「例えば版を
0・黒石を1・白石を2」で表現します≫に馴染みのアル方
には、石の結び付きが4連結の方が強く簡単に切ラレナイが
8連結の斜めにツナガル結び付きは簡単に切り合いが始まる
と結び付きが弱い事は分かるでしょう!
しかしながら、強い4連結だけでは、画像の扱いとし荒く成
るので4方向しか使用しない事で高速化可能だが、依り細か
い処理が出来る8連結を処理時間が掛かる処理だが用意し、
画像処理ライブラリの関数では往々にしてパラメータとして
4連結/8連結選択可能≪関数「SetDirOffset()」で情報「
方向に対するオフセット」作成≫にし使用するとか?!
code:SetDirOffset()
/************************************************************************/
/***** 図形のフェレ計測:処理部:方向オフセットテーブルの設定 *****/
/************************************************************************/
void Filter::SetDirOffset(
int c, // 4/8連結
int dir_off[], // 方向OffSetTable
int inc // 処理インクリ幅
){
if( c == 4 ){ // 4連結なら
dir_off[ 0 ] = 1; // 0:右方向
dir_off[ 1 ] = inc; // 1:下方向
dir_off[ 2 ] = -1; // 2:左方向
dir_off[ 3 ] = -inc; // 3:上方向
}else{ // 8連結なら
dir_off[ 0 ] = 1; // 0:右方向
dir_off[ 1 ] = 1 + inc; // 1:右下方向
dir_off[ 2 ] = inc; // 2:下方向
dir_off[ 3 ] = -1 + inc; // 3:左下方向
dir_off[ 4 ] = -1; // 4:左方向
dir_off[ 5 ] = -1 - inc; // 5:左上方向
dir_off[ 6 ] = -inc; // 6:上方向
dir_off[ 7 ] = 1 - inc; // 7:右上方向
} //
}
サブルーチン関数は「rem_isolation_4()」で4連結の
孤立点除去、「rem_isolation_8()」で8連結の孤立点除去
とかと4連結/8連結で実行関数を分ける事で処理します!
code:rem_isolation()
/************************************************************************/
/***** 孤立点除去 :実行部:基本部*****/
/***** REM_ISOLATION,s,d,c *****/
/************************************************************************/
int Filter::rem_isolation(
TypeArray *ps, // S画像情報
TypeArray *pd, // D画像情報
int c, // 連結性
int data // 描画データ
){
TypeArray s; // S画像情報:局所
TypeArray d; // D画像情報:局所
int sti; // ステータス情報
sti = Clear( pd, 0 ); // D画像0クリア
if( sti != END_STI ){ // エラーがある場合
return( sti ); // ステータスを返す
} //
s = *ps; // 一旦、S画像情報
ps = &s; // を局所化
d = *pd; // 一旦、D画像情報
pd = &d; // を局所化
sti = PreProcessor3By3( ps, pd ); // 前処理
if( sti != END_STI ){ // エラーがある場合
return( sti ); // ステータスを返す
} //
if( c == 4 ){ // 4連結なら
rem_isolation_4( ps, pd, data ); // 左記で処理
}else{ // 8連結なら
rem_isolation_8( ps, pd, data ); // 左記で処理
} //
return( END_STI ); // 正常終了
}
そして孤立点除去とは、
注視点≪★≫が、4連結≪●の位置≫に画素データが全て
「0」だったら、注視点が「0」に成る!
注視点≪★≫が、8連結≪●の位置≫に画素データが全て
「0」だったら、注視点が「0」に成る!
4連結/8連結での違いを図示して見ました!
画像処理ライブラリでは、孤立点除去以外に、収縮・膨張・
輪郭線抽出・枝刈等の図形を変換させる関数群を用意して
居ますのでC++言語を読み解ける人は読む事に挑戦して
下さい!