見出し画像

孤立点除去・収縮・膨張・距離変換・骨格化での共通下請け関数

孤立点除去・収縮・膨張・距離変換・骨格化での共通下請け関数


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」を関数
辺値とし返し終了!

文末

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