孤立点除去・収縮・膨張・距離変換・骨格化での共通下請け関数
孤立点除去・収縮・膨張・距離変換・骨格化での共通下請け関数
2024年11月7初稿
1.使用した共通下請け関数
「Clear( pd, 0 );」及び「Copy( ps, pd );」は、ソース
コード解説「解説クラスCopyClear(10)」で
解説済み、
「ClearRoundImage( pd, 0, 1 );」は、ソース
コード解説「解説クラスCopyClear(7)」で
紹介しています!
「PreProcessor3By3(ps,pd);」に関して説明している解説
エッセイが存在して無いので取り敢えず、ココで説明しま
す!正規のソースコード解説では
「解説クラスFilter(○○○)」で解説する予定で
すが、解説作成に手間取って居るのでカナリ先に成りそう
と思い事前紹介します!
2.「PreProcessor3By3(ps,pd);」
code:PreProcessor3By3(ps,pd){}
/************************************************************************/
/***** 2値画像変換用の前処理 *****/
/***** ① S・D画像情報をS・D画像情報の最小幅に補正&検査 *****/
/***** ② S・D画像の始点を一回り内側に補正 *****/
/***** ③ S・D画像サイズを一回り内側に補正 *****/
/************************************************************************/
int Filter::PreProcessor3By3(
TypeArray *ps, // S画像
TypeArray *pd // D画像
){
int h; // 水平幅
int v; // 垂直幅
if( ps->w != 1 || pd->w != 1 ){ // 画素単位=1バイト
return( STI_ARY_5 ); // 以外→左記を返す
} //
h = ( ps->h <= pd->h ) ? ps->h : pd->h; // 有効水平幅算出
v = ( ps->v <= pd->v ) ? ps->v : pd->v; // 有効垂直幅算出
if( h < 3 ){ // 水平サイズ3未満
return( STI_ARY_2 ); // 左記を返す
} //
if( v < 3 ){ // 垂直サイズ3未満
return( STI_ARY_3 ); // 左記を返す
} //
ps->adr += ps->inc + 1; // S画像始点補正
pd->adr += pd->inc + 1; // D画像始点補正
h -= 2; // 画像のサイズを
v -= 2; // 内側に補正
ps->h = h; // S画像のサイズを
ps->v = v; // 再設定
pd->h = h; // D画像のサイズを
pd->v = v; // 再設定
return( END_STI ); // 正常終了
}
2-1.関数名
「Pre」は、「前に」程度に考えて下さい!
「Processor」は、処理するで「PreProcessor」で
「前処理」と考えて下さい!
「3By3」は、「3×3」升を意味して2値化画像処理の
フィルター演算での処理ウィンドウが水平幅・垂直幅が
「3×3」升の処理での前処理とし本体の前に一回処理する
と都合が良い処理です!
2-2.仮引数
code:仮引数
int Filter::PreProcessor3By3(
TypeArray *ps, // S画像
TypeArray *pd // D画像
){
「TypeArrayps,」は、元画像(S≒ソース画像)
「TypeArraypd,」は、結果画像(D≒ディスティネー
ション画像)
2-3.ローカル変数
code:ローカル変数
){
int h; // 水平幅
int v; // 垂直幅
「int h;」は、水平幅
「int v;」は、垂直幅
2-4.アルゴリズム
code:アルゴリズム
if( ps->w != 1 || pd->w != 1 ){ // 画素単位=1バイト
return( STI_ARY_5 ); // 以外→左記を返す
} //
h = ( ps->h <= pd->h ) ? ps->h : pd->h; // 有効水平幅算出
v = ( ps->v <= pd->v ) ? ps->v : pd->v; // 有効垂直幅算出
if( h < 3 ){ // 水平サイズ3未満
return( STI_ARY_2 ); // 左記を返す
} //
if( v < 3 ){ // 垂直サイズ3未満
return( STI_ARY_3 ); // 左記を返す
} //
ps->adr += ps->inc + 1; // S画像始点補正
pd->adr += pd->inc + 1; // D画像始点補正
h -= 2; // 画像のサイズを
v -= 2; // 内側に補正
ps->h = h; // S画像のサイズを
ps->v = v; // 再設定
pd->h = h; // D画像のサイズを
pd->v = v; // 再設定
return( END_STI ); // 正常終了
}
「if(ps->w!=1||pd->w!=1){return(STI_ARY_5);}」は、
元画像・結果画像の画素単位が1バイト整数型以外は、
エラーコード「STI_ARY_5」を関数辺値とし返し終了!
「h=(ps->h<=pd->h)?ps->h:pd->h;」は、元画像・結果
画像の水平幅の有効な処理幅とし最小値算出
「v=(ps->v<=pd->v)?ps->v:pd->v;」は、元画像・結果
画像の垂直幅の有効な処理幅とし最小値算出
「if(h<3){return(STI_ARY_2);}」は、水平幅が3未満
ならエラーコード「STI_ARY_2」を関数辺値とし返し終了!
「if(v<3){return(STI_ARY_3);}」は、垂直幅が3未満
ならエラーコード「STI_ARY_3」を関数辺値とし返し終了!
「ps->adr+=ps->inc+1;pd->adr+=pd->inc+1;」は、
元画像・結果画像の画素ポインタを元の画像の一回り中に
補正!元の画像に比べて1画素右下の位置にセット!
「h-=2;v-=2;」は、水平幅・垂直幅を一回り内側のサイズ
に修正≪水平幅は左右端を切り-2、垂直幅は上限端を切
り-2≫
「pd->h=h;pd->v=v;」は、画像情報の水平幅・垂直幅を
修正した水平幅・垂直幅にセット!
「return(END_STI);」は、正常終了「END_STI」を関数
辺値とし返し終了!