見出し画像

解説クラスCopyClear(34)

解説クラスCopyClear(34)


2025年2月23稿(初講)

この解説は、膨大なクラス「class CopyClear」の定義を
記載したファイル「CopyClear.h」の順番に従い解説して
行く為に今回は、「private:属性」の関数の説明を行う
事にします!今回は「BinarizationMyselfBase()」関数から
説明します!
この解説文章は、
解説『解説クラスCopyClear(33)』の続きです

(4-15-93)関数「void BinarizationMyselfBase(
BYTE* p,int h,int data){・・・}」

/************************************************************************/
/*****  2値変換:自分自身:C関数専用:0以外を出力値にする:x方向*****/
/************************************************************************/

void            CopyClear::BinarizationMyselfBase(
    BYTE        *p,                                 // 画像ポインタ
    int         h,                                  // 水平幅
    int         data                                // 出力値:≠0時
){
    int         h4;                                 // 水平幅÷4

    h4 = h / 4;                                     // 水平幅÷4
    h -= h4 * 4;                                    // ÷4の余りを算出
    while( --h4 >= 0 ){                             // 4画素単位で繰返
        if( *p ){                                   // 0以外なら
            *p = data;                              // 出力値をセット
        }                                           // 
        p++;                                        // 
        if( *p ){                                   // 
            *p = data;                              // 
        }                                           // 
        p++;                                        // 
        if( *p ){                                   // 
            *p = data;                              // 
        }                                           // 
        p++;                                        // 
        if( *p ){                                   // 
            *p = data;                              // 
        }                                           // 
        p++;                                        // 
    }                                               // 
    while( --h >= 0 ){                              // 残りの範囲で
        if( *p ){                                   // 0以外なら
            *p = data;                              // 出力値をセット
        }                                           // 
        p++;                                        // 
    }                                               // 
}

☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「private:属性」ですのでライブラリの
外から使用不能です!

(A)関数「BinarizationMyselfBase();」の【関数名】

「Binarization」は、二値化を意味し、
「Myself」は、英単語「Myself」の意味通り「自分自身」
です!
「Base」は、基本を意味します!
この関数「BinarizationMyselfBase()」は、自分自身を
二値化する基本部を意味します!

(B)関数「void BinarizationMyselfBase();」の【返値】

返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!

(C)関数「BinarizationMyselfBase()」の【仮引数】

void            CopyClear::BinarizationMyselfBase(
    BYTE        *p,                                 // 画像ポインタ
    int         h,                                  // 水平幅
    int         data                                // 出力値:≠0時
){

「BYTE* p,」は、1バイト画素単位処理ポインタ
「int h,」は、水平幅
「int data」は、二値化(≠0)時の変換データ

(D)関数「BinarizationMyselfBase()」の【アルゴリズム】

){
    int         h4;                                 // 水平幅÷4

    h4 = h / 4;                                     // 水平幅÷4
    h -= h4 * 4;                                    // ÷4の余りを算出
    while( --h4 >= 0 ){                             // 4画素単位で繰返
        if( *p ){                                   // 0以外なら
            *p = data;                              // 出力値をセット
        }                                           // 
        p++;                                        // 
        if( *p ){                                   // 
            *p = data;                              // 
        }                                           // 
        p++;                                        // 
        if( *p ){                                   // 
            *p = data;                              // 
        }                                           // 
        p++;                                        // 
        if( *p ){                                   // 
            *p = data;                              // 
        }                                           // 
        p++;                                        // 
    }                                               // 
    while( --h >= 0 ){                              // 残りの範囲で
        if( *p ){                                   // 0以外なら
            *p = data;                              // 出力値をセット
        }                                           // 
        p++;                                        // 
    }                                               // 
}

(D-1)ローカル変数

){
    int         h4;                                 // 水平幅÷4

「int h4;」は、ループカウンタ≪水平幅÷4と4単位毎≫

(D―2)アルゴリズムコード

    h4 = h / 4;                                     // 水平幅÷4
    h -= h4 * 4;                                    // ÷4の余りを算出
    while( --h4 >= 0 ){                             // 4画素単位で繰返
        if( *p ){                                   // 0以外なら
            *p = data;                              // 出力値をセット
        }                                           // 
        p++;                                        // 
        if( *p ){                                   // 
            *p = data;                              // 
        }                                           // 
        p++;                                        // 
        if( *p ){                                   // 
            *p = data;                              // 
        }                                           // 
        p++;                                        // 
        if( *p ){                                   // 
            *p = data;                              // 
        }                                           // 
        p++;                                        // 
    }                                               // 
    while( --h >= 0 ){                              // 残りの範囲で
        if( *p ){                                   // 0以外なら
            *p = data;                              // 出力値をセット
        }                                           // 
        p++;                                        // 
    }                                               // 
}

「h4=h/4;」は、4単位毎のループカウンタ算出
「h-=h4*4;」は、4単位毎の余りのループカウンタ算出
ダウンカウンタ方式でwhile構文「--h4>=0」とループ
条件でループ本体
「if(*p){*p=data;}p++;if(*p){*p=data;}p++;
if(*p){*p=data;}p++;if(*p){*p=data;}p++;」と基本単位
1画素の処理「if(*p){*p=data;}p++;」を4組み並べて
高速化処理を行い!1画素の処理
「if(*p){*p=data;}p++;」は、if条件「*p」と「≠0」
なら「*p=data;」と仮引数「int data」の値をセットし
「p++;」ポインタを次の画素へ進める
そして「while(--h>=0){if(*p){*p=data;}p++;}」と
4単位に満たない余りの処理を行います!
★備考★
4単位に画素の処理を行って居るのが高速化と言って居る
のに少ないとお考えの方に、実験≪コンパイラMCC68K
でCPU68060「68Kシリーズ最終最高CPUでデー
タキャッシュ装備」での実際の処理時間比較≫で最適な数と
判断しています!これ以上、多いと無駄と判断!
更に、名称「Base」で「基本部」と説明して居ますが、
多くの処理で「水平方向の処理」が連続する画素を処理する
場合の「基本」と理解して下さい!

(4-15-94)関数「void BinarizationNonZeoBase(
BYTE* ps,BYTE* pd,int h,int data
){・・・}」

/************************************************************************/
/*****  2値変換:S→D:C関数専用:0以外を出力値にする:x方向  *****/
/************************************************************************/

void            CopyClear::BinarizationNonZeoBase(
    BYTE        *ps,                                // S画像ポインタ
    BYTE        *pd,                                // D画像ポインタ
    int         h,                                  // 水平幅
    int         data                                // 出力値:≠0時
){
    int         h4;                                 // 水平幅÷4
    int         zero;                               // 0データ
    int         d;                                  // 出力値

    zero = 0;                                       // 0データセット
    h4   = h / 4;                                   // 水平幅÷4
    h   -= h4 * 4;                                  // ÷4の余りを算出
    while( --h4 >= 0 ){                             // 4画素単位で繰返
        d = zero;                                   // 0で初期化し
        if( *ps++ ){                                // 0以外なら
            d = data;                               // 出力値をセット
        }                                           // 
        *pd++ = d;                                  // 出力
        d = zero;                                   // 
        if( *ps++ ){                                // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d = zero;                                   // 
        if( *ps++ ){                                // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d = zero;                                   // 
        if( *ps++ ){                                // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
    }                                               // 
    while( --h >= 0 ){                              // 残りの範囲で
        d = zero;                                   // 0で初期化し
        if( *ps++ ){                                // 0以外なら
            d = data;                               // 出力値をセット
        }                                           // 
        *pd++ = d;                                  // 出力
    }                                               // 
}

☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「private:属性」ですのでライブラリの
外から使用不能です!

(A)関数「BinarizationNonZeoBase();」の【関数名】

「Binarization」は、二値化を意味し、
「NonZeo」は、カタカナ語「ノンゼロ」の意味通り「≠0」
です!
「Base」は、基本を意味します!
この関数「BinarizationNonZeoBase()」は、「≠0」二値化
する基本部を意味します!

(B)関数「void BinarizationNonZeoBase();」の【返値】

返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!

(C)関数「BinarizationNonZeoBase()」の【仮引数】

void            CopyClear::BinarizationNonZeoBase(
    BYTE        *ps,                                // S画像ポインタ
    BYTE        *pd,                                // D画像ポインタ
    int         h,                                  // 水平幅
    int         data                                // 出力値:≠0時
){

「BYTE* ps,」は、S(元)画像画素単位処理ポインタ
「BYTE* pd,」は、D(結果)画像画素単位処理ポインタ
「int h,」は、水平幅
「int data」は、二値化(≠0)時の変換データ
「Base」は、基本部と言う意味で基本的な水平方向処理を
行います!★備考★
多くの処理で「水平方向の処理」が連続する画素を処理する
場合の「基本」と理解して下さい!

(D)関数「BinarizationNonZeoBase()」の【アルゴリズム】

){
    int         h4;                                 // 水平幅÷4
    int         zero;                               // 0データ
    int         d;                                  // 出力値

    zero = 0;                                       // 0データセット
    h4   = h / 4;                                   // 水平幅÷4
    h   -= h4 * 4;                                  // ÷4の余りを算出
    while( --h4 >= 0 ){                             // 4画素単位で繰返
        d = zero;                                   // 0で初期化し
        if( *ps++ ){                                // 0以外なら
            d = data;                               // 出力値をセット
        }                                           // 
        *pd++ = d;                                  // 出力
        d = zero;                                   // 
        if( *ps++ ){                                // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d = zero;                                   // 
        if( *ps++ ){                                // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d = zero;                                   // 
        if( *ps++ ){                                // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
    }                                               // 
    while( --h >= 0 ){                              // 残りの範囲で
        d = zero;                                   // 0で初期化し
        if( *ps++ ){                                // 0以外なら
            d = data;                               // 出力値をセット
        }                                           // 
        *pd++ = d;                                  // 出力
    }                                               // 
}

(D-1)ローカル変数

){
    int         h4;                                 // 水平幅÷4
    int         zero;                               // 0データ
    int         d;                                  // 出力値

「int h4;」は、ループカウンタ≪水平幅÷4と4単位毎≫
「int zero;」は、S(元)画像画素が「=0」の時の結果
「int d;」は、D(結果)画像画素データ

(D―2)アルゴリズムコード

    zero = 0;                                       // 0データセット
    h4   = h / 4;                                   // 水平幅÷4
    h   -= h4 * 4;                                  // ÷4の余りを算出
    while( --h4 >= 0 ){                             // 4画素単位で繰返
        d = zero;                                   // 0で初期化し
        if( *ps++ ){                                // 0以外なら
            d = data;                               // 出力値をセット
        }                                           // 
        *pd++ = d;                                  // 出力
        d = zero;                                   // 
        if( *ps++ ){                                // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d = zero;                                   // 
        if( *ps++ ){                                // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d = zero;                                   // 
        if( *ps++ ){                                // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
    }                                               // 
    while( --h >= 0 ){                              // 残りの範囲で
        d = zero;                                   // 0で初期化し
        if( *ps++ ){                                // 0以外なら
            d = data;                               // 出力値をセット
        }                                           // 
        *pd++ = d;                                  // 出力
    }                                               // 
}

「zero=0;」は、「=0」と0画素の値を変数にセット
★備考★往々にして直に数値を記載する依りCPUの
レジスターにセットされる機械コードを生成するコンパイル
システムの方が多いので高速化の為に使用!
「h4=h/4;」は、4単位毎のループカウンタ算出
「h-=h4*4;」は、4単位毎の余りのループカウンタ算出
ダウンカウンタ方式でwhile構文「--h4>=0」とループ
条件でループ本体「d=zero;if(*ps++){d=data;}*pd++=d;」
が4組み並べて4画素ループさせている?!その1単位
は、「d=zero;」で初期化、
if構文「if(*ps++){d=data;}」と条件「*ps++」の
「≠0」で「d=data;」とセットし、結果画素書き込み
「*pd++=d;」で書き込む!★備考★「*ps++」でポインタを
次の画素に移動している事に注意!
そして「while(--h>=0){d=zero;if(*ps++){d=data;}
*pd++=d;}」と4単位に満たない余りの処理を行います!
★備考★
4単位に画素の処理を行って居るのが高速化と言って居る
のに少ないとお考えの方に、実験≪コンパイラMCC68K
でCPU68060「68Kシリーズ最終最高CPUでデー
タキャッシュ装備」での実際の処理時間比較≫で最適な数と
判断しています!これ以上、多いと無駄と判断!

(4-15-95)関数「void BinarizationXYBase(
BYTE* ps,BYTE* pd,int h,int t,
int data,int low){・・・}」

/************************************************************************/
/*****  2値変換:S→D:C関数専用:XY座標とHVで部分範囲用    *****/
/*****  x方向:※LUTを使用しないので狭い範囲の2値化に向きます※*****/
/************************************************************************/

void            CopyClear::BinarizationXYBase(
    BYTE        *ps,                                // S画像ポインタ
    BYTE        *pd,                                // D画像ポインタ
    int         h,                                  // 水平幅
    int         t,                                  // しきい値 0..255
    int         data,                               // 出力値:高位(省略時255)
    int         low                                 // 出力値:低位(省略時0)
){
    int         h4;                                 // 水平幅÷4
    int         d;                                  // 出力値

    h4   = h / 4;                                   // 水平幅÷4
    h   -= h4 * 4;                                  // ÷4の余りを算出
    while( --h4 >= 0 ){                             // 4画素単位で繰返
        d = low;                                    // 出力値:低をセット
        if( *ps++ > t ){                            // しきい値Overなら
            d = data;                               // 出力値:高をセット
        }                                           // 
        *pd++ = d;                                  // 出力
        d     = low;                                // 
        if( *ps++ > t ){                            // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d     = low;                                // 
        if( *ps++ > t ){                            // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d     = low;                                // 
        if( *ps++ > t ){                            // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
    }                                               // 
    while( --h >= 0 ){                              // 残りの範囲で
        d = low;                                    // 出力値:低をセット
        if( *ps++ > t ){                            // しきい値Overなら
            d = data;                               // 出力値:高をセット
        }                                           // 
        *pd++ = d;                                  // 出力
    }                                               // 
}

☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「private:属性」ですのでライブラリの
外から使用不能です!

(A)関数「BinarizationXYBase();」の【関数名】

「Binarization」は、二値化を意味し、
「XY」は、XY座標、詰り、二次元画像の意味です!
「Base」は、基本を意味します!
この関数「BinarizationXYBase()」は、二値化する
基本部としてX座標方向の処理を意味します!

(B)関数「void BinarizationXYBase();」の【返値】

返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!

(C)関数「BinarizationXYBase()」の【仮引数】

void            CopyClear::BinarizationXYBase(
    BYTE        *ps,                                // S画像ポインタ
    BYTE        *pd,                                // D画像ポインタ
    int         h,                                  // 水平幅
    int         t,                                  // しきい値 0..255
    int         data,                               // 出力値:高位(省略時255)
    int         low                                 // 出力値:低位(省略時0)
){

「BYTE* ps,」は、S(元)画像画素単位処理ポインタ
「BYTE* pd,」は、D(結果)画像画素単位処理ポインタ
「int h,」は、水平幅
「int t,」は、閾値
「int data,」は、白画素(閾値越えた値)の結果値
「int low」は、黒画素(閾値以下)の結果値
「int data」は、二値化(≠0)時の変換データ

(D)関数「BinarizationXYBase()」の【アルゴリズム】

){
    int         h4;                                 // 水平幅÷4
    int         d;                                  // 出力値

    h4   = h / 4;                                   // 水平幅÷4
    h   -= h4 * 4;                                  // ÷4の余りを算出
    while( --h4 >= 0 ){                             // 4画素単位で繰返
        d = low;                                    // 出力値:低をセット
        if( *ps++ > t ){                            // しきい値Overなら
            d = data;                               // 出力値:高をセット
        }                                           // 
        *pd++ = d;                                  // 出力
        d     = low;                                // 
        if( *ps++ > t ){                            // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d     = low;                                // 
        if( *ps++ > t ){                            // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d     = low;                                // 
        if( *ps++ > t ){                            // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
    }                                               // 
    while( --h >= 0 ){                              // 残りの範囲で
        d = low;                                    // 出力値:低をセット
        if( *ps++ > t ){                            // しきい値Overなら
            d = data;                               // 出力値:高をセット
        }                                           // 
        *pd++ = d;                                  // 出力
    }                                               // 
}

(D-1)ローカル変数

){
    int         h4;                                 // 水平幅÷4
    int         d;                                  // 出力値

「int h4;」は、ループカウンタ≪水平幅÷4と4単位毎≫
「int d;」は、D(結果)画像画素データ

(D―2)アルゴリズムコード

    h4   = h / 4;                                   // 水平幅÷4
    h   -= h4 * 4;                                  // ÷4の余りを算出
    while( --h4 >= 0 ){                             // 4画素単位で繰返
        d = low;                                    // 出力値:低をセット
        if( *ps++ > t ){                            // しきい値Overなら
            d = data;                               // 出力値:高をセット
        }                                           // 
        *pd++ = d;                                  // 出力
        d     = low;                                // 
        if( *ps++ > t ){                            // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d     = low;                                // 
        if( *ps++ > t ){                            // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
        d     = low;                                // 
        if( *ps++ > t ){                            // 
            d = data;                               // 
        }                                           // 
        *pd++ = d;                                  // 
    }                                               // 
    while( --h >= 0 ){                              // 残りの範囲で
        d = low;                                    // 出力値:低をセット
        if( *ps++ > t ){                            // しきい値Overなら
            d = data;                               // 出力値:高をセット
        }                                           // 
        *pd++ = d;                                  // 出力
    }                                               // 
}

「h4=h/4;」は、4単位毎のループカウンタ算出
「h-=h4*4;」は、4単位毎の余りのループカウンタ算出
ダウンカウンタ方式でwhile構文「--h4>=0」とループ
条件でループ本体「d=low;if(*ps++){d=data;}*pd++=d;」
が4組み並べて4画素ループさせている?!その1単位
は、「d=low;」で初期化、
if構文「if(*ps++){d=data;}」と条件「*ps++」の
「≠0」で「d=data;」とセットし、結果画素書き込み
「*pd++=d;」で書き込む!★備考★「*ps++」でポインタを
次の画素に移動している事に注意!
そして「while(--h>=0){d=low;if(*ps++){d=data;}
*pd++=d;}」と4単位に満たない余りの処理を行います!
★備考★
4単位に画素の処理を行って居るのが高速化と言って居る
のに少ないとお考えの方に、実験≪コンパイラMCC68K
でCPU68060「68Kシリーズ最終最高CPUでデー
タキャッシュ装備」での実際の処理時間比較≫で最適な数と
判断しています!これ以上、多いと無駄と判断!

ココまでで区切り≪「private:属性」の関数の並びが、
「BinarizationXYBase()」関数までと二値化変換の基本部が
終了したので
次から「ConvertRgbToMonoBase()」と色変換系関数の説明に
なるので≫が良いので終わります?!
継続追加は有りません!★備考★
勿論、記載ミスは直して行きますが!
引き続き、
新規解説『解説クラスCopyClear(35)』
御贔屓下さい!

文末

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