見出し画像

2値画像と4連結・8連結

2値画像と4連結・8連結

2024年10月26初稿

解説エッセイ『画像フィルターの概念説明』で自然画像≪
多値画像とし1バイト(8ビット≒0..255)画素画像の≫
処理として典型的な「画像フィルター」を説明しましたが、
多値画像を一旦、2値画像≪画素データとし「0,1」を
数値データとし扱う【但し、目で確認する場合は黒「0」は
ソノママだが白「1」を「255」と表示用】≫を扱う時の
基本概念を説明します!

1.連結性

4連結

注視点≪★≫から、上下左右に4方向に関係する事を4連結
と定義します!

8連結

注視点≪★≫から、上下左右に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連結孤立点除去

注視点≪★≫が、4連結≪●の位置≫に画素データが全て
「0」だったら、注視点が「0」に成る!

8連結孤立点除去

注視点≪★≫が、8連結≪●の位置≫に画素データが全て
「0」だったら、注視点が「0」に成る!

4連結/8連結での違いを図示して見ました!
画像処理ライブラリでは、孤立点除去以外に、収縮・膨張・
輪郭線抽出・枝刈等の図形を変換させる関数群を用意して
居ますのでC++言語を読み解ける人は読む事に挑戦して
下さい!

文末

いいなと思ったら応援しよう!