
解説クラス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)』を
御贔屓下さい!