見出し画像

欅坂46から櫻坂46に改名した事を画像処理的に考察例文ソースコード説明その2

欅坂46から櫻坂46に改名した事を画像処理的に考察例文ソースコード
説明その2


2024年12月31初稿

ここのソースコードは、エッセイ『欅坂46から櫻坂46に
改名した事を画像処理的に考察』
用です!上記エッセイの
ファイル「欅BMP白黒.bmp」・
ファイル「櫻BMP白黒.bmp」を使用します!
そしてココでは、エッセイ『欅坂46から櫻坂46に改名し
た事を画像処理的に考察例文ソースコード説明』

実行関数「execute( pimgA, pimgB );」をソノママ使用しま
すのでココでは解説しません!

1.画像ファイル読み出しと平滑化メインプログラム

main()
{
    TypeArray   imgA;           // 画像型変数A
    TypeArray*  pimgA=&imgA;    // 上記へのポインタ
    TypeArray   imgB;           // 画像型変数B
    TypeArray*  pimgB=&imgB;    // 上記へのポインタ
    TypeArray   imgT;           // 画像型変数T一時的
    TypeArray*  pimgT=&imgT;    // 上記へのポインタ
    int         ft[1000];       // 平滑化用の重み配列
    int         h;              // 水平幅
    int         v;              // 垂直幅
    int         c;              // Bit幅(1,4,8,16,24,32)
    long        xPixPerMeter;   // 水平解像度(Pix/m)
    long        yPixPerMeter;   // 垂直解像度(Pix/m)

    FUN.up_fill_int( 1, ft, 1000 );             // 平滑化用の重み配列初期化
    sti=FUN.ReadBitmapAttribute(                // ファイル情報読み出し
        "欅BMP白黒.bmp",                     // ファイル「欅BMP白黒.bmp」情報読出
        &h, &v, &c,                             // 今回、必要な情報格納変数
        &xPixPerMeter,                          // 今回、不要な情報だが、引数とし
        &yPixPerMeter);                         // てダミー使用
    if( sti != STI_END ){                       // エラー発生なら
        printf("画像ファイル「欅BMP白黒.bmp」がオカシイ\n");
        exit( 0 );                              // C言語標準関数でプログラム終了
    }
    if( h != 640 || v != 480 || c != 8 ){       // 想定したファイル仕様と異なる
        printf("画像ファイル「欅BMP白黒.bmp」がオカシイ\n");
        printf( "h=%d,v=%d,c=%d\n", h, v, c );
        exit( 0 );                              // C言語標準関数でプログラム終了
    }
    pimgA->MallocBYTE(h,v);                     // 画像ファイルサイズで画像情報セット
    FUN.Clear(pimgA,0);                         // 一旦、画像を0クリア
    FUN.ReadBitmap("欅BMP白黒.bmp",          // ファイル「欅BMP白黒.bmp」を
                                pimgA );        // 画像とし画像「imgA」に格納
    pimgT->MallocBYTE(h,v);                     // 画像ファイルサイズで画像情報セット
    FUN.Smoothing(pimgA,pimgT,ft,3,3,2);        // 3×3平滑化でT画像作成
    FUN.Copy(pimgT,pimgA);                      // 「imgA」を平滑化後にセット
    FUN.WriteBitmap("ボカシ欅BMP白黒.bmp",   // ファイル「ボカシ欅BMP白黒.bmp」を
                                pimgA );        // 画像とし画像「imgA」で作成
    pimgT->freeMem();                           // 画像メモリ解放画像「imgT」
    sti=FUN.ReadBitmapAttribute(                // ファイル情報読み出し
        "櫻BMP白黒.bmp",                     // ファイル「櫻BMP白黒.bmp」情報読出
        &h, &v, &c,                             // 今回、必要な情報格納変数
        &xPixPerMeter,                          // 今回、不要な情報だが、引数とし
        &yPixPerMeter);                         // てダミー使用
    if( sti != STI_END ){                       // エラー発生なら
        printf("画像ファイル「櫻BMP白黒.bmp」がオカシイ\n");
        pimgA->freeMem();                       // 画像メモリ解放画像「imgA」
        exit( 0 );                              // C言語標準関数でプログラム終了
    }
    if( h != 640 || v != 480 || c != 8 ){       // 想定したファイル仕様と異なる
        printf("画像ファイル「櫻BMP白黒.bmp」がオカシイ\n");
        pimgA->freeMem();                       // 画像メモリ解放画像「imgA」
        exit( 0 );                              // C言語標準関数でプログラム終了
    }
    pimgB->MallocBYTE (h,v);                    // 画像ファイルサイズで画像情報セット
    FUN.Clear(pimgB,0);                         // 一旦、画像を0クリア
    FUN.ReadBitmap("櫻BMP白黒.bmp",          // ファイル「櫻BMP白黒.bmp」を
                                pimgB );        // 画像とし画像「imgB」に格納
    pimgT->MallocBYTE(h,v);                     // 画像ファイルサイズで画像情報セット
    FUN.Smoothing(pimgB,pimgT,ft,3,3,2);        // 3×3平滑化でT画像作成
    FUN.Copy(pimgT,pimgB);                      // 「imgA」を平滑化後にセット
    FUN.WriteBitmap("ボカシ櫻BMP白黒.bmp",   // ファイル「ボカシ櫻BMP白黒.bmp」を
                                pimgB );        // 画像とし画像「imgB」で作成
    pimgT->freeMem();                           // 画像メモリ解放画像「imgT」
    execute( pimgA, pimgB );                    // 例文の実行部
    pimgA->freeMem();                           // 画像メモリ解放画像「imgA」
    pimgB->freeMem();                           // 画像メモリ解放画像「imgB」
}

「main(){・・本体・・}」は、ご存知、C言語標準のメイン
プログラムを記載する方法!

(1)ローカル変数

    TypeArray   imgA;           // 画像型変数A
    TypeArray*  pimgA=&imgA;    // 上記へのポインタ
    TypeArray   imgB;           // 画像型変数B
    TypeArray*  pimgB=&imgB;    // 上記へのポインタ
    TypeArray   imgT;           // 画像型変数T一時的
    TypeArray*  pimgT=&imgT;    // 上記へのポインタ
    int         ft[1000];       // 平滑化用の重み配列
    int         h;              // 水平幅
    int         v;              // 垂直幅
    int         c;              // Bit幅(1,4,8,16,24,32)
    long        xPixPerMeter;   // 水平解像度(Pix/m)
    long        yPixPerMeter;   // 垂直解像度(Pix/m)

「TypeArray imgA;」は、画像情報「imgA」の定義!
「TypeArray* pimgA=&imgA;」は、画像情報ポインタ変数
「TypeArray* pimgA」に画像情報「imgA」をセット
「TypeArray imgB;」は、画像情報「imgB」の定義!
「TypeArray* pimgB=&imgB;」は、画像情報ポインタ変数
「TypeArray* pimgB」に画像情報「imgB」をセット
「TypeArray imgT;」は、画像情報「imgT;」の定義!
「TypeArray* pimgT=&imgT;」は、画像情報ポインタ変数
「TypeArray* pimgT」に画像情報「imgT」をセット≪ボカシ
画像作成用≫
「int ft[1000];」は、平滑化≪ボカシ作成用≫重み配列
「int h;」は、画像の水平幅
「int v;」は、画像の垂直幅
「int c;」は、画像ファイルの画素ビット幅
「long xPixPerMeter;」は、画像ファイルの水平解像度
「long yPixPerMeter;」は、画像ファイルの垂直解像度

(2)アルゴリズム

    FUN.up_fill_int( 1, ft, 1000 );             // 平滑化用の重み配列初期化
    sti=FUN.ReadBitmapAttribute(                // ファイル情報読み出し
        "欅BMP白黒.bmp",                     // ファイル「欅BMP白黒.bmp」情報読出
        &h, &v, &c,                             // 今回、必要な情報格納変数
        &xPixPerMeter,                          // 今回、不要な情報だが、引数とし
        &yPixPerMeter);                         // てダミー使用
    if( sti != STI_END ){                       // エラー発生なら
        printf("画像ファイル「欅BMP白黒.bmp」がオカシイ\n");
        exit( 0 );                              // C言語標準関数でプログラム終了
    }
    if( h != 640 || v != 480 || c != 8 ){       // 想定したファイル仕様と異なる
        printf("画像ファイル「欅BMP白黒.bmp」がオカシイ\n");
        printf( "h=%d,v=%d,c=%d\n", h, v, c );
        exit( 0 );                              // C言語標準関数でプログラム終了
    }
    pimgA->MallocBYTE(h,v);                     // 画像ファイルサイズで画像情報セット
    FUN.Clear(pimgA,0);                         // 一旦、画像を0クリア
    FUN.ReadBitmap("欅BMP白黒.bmp",          // ファイル「欅BMP白黒.bmp」を
                                pimgA );        // 画像とし画像「imgA」に格納
    pimgT->MallocBYTE(h,v);                     // 画像ファイルサイズで画像情報セット
    FUN.Smoothing(pimgA,pimgT,ft,3,3,2);        // 3×3平滑化でT画像作成
    FUN.Copy(pimgT,pimgA);                      // 「imgA」を平滑化後にセット
    FUN.WriteBitmap("ボカシ欅BMP白黒.bmp",   // ファイル「ボカシ欅BMP白黒.bmp」を
                                pimgA );        // 画像とし画像「imgA」で作成
    pimgT->freeMem();                           // 画像メモリ解放画像「imgT」
    sti=FUN.ReadBitmapAttribute(                // ファイル情報読み出し
        "櫻BMP白黒.bmp",                     // ファイル「櫻BMP白黒.bmp」情報読出
        &h, &v, &c,                             // 今回、必要な情報格納変数
        &xPixPerMeter,                          // 今回、不要な情報だが、引数とし
        &yPixPerMeter);                         // てダミー使用
    if( sti != STI_END ){                       // エラー発生なら
        printf("画像ファイル「櫻BMP白黒.bmp」がオカシイ\n");
        pimgA->freeMem();                       // 画像メモリ解放画像「imgA」
        exit( 0 );                              // C言語標準関数でプログラム終了
    }
    if( h != 640 || v != 480 || c != 8 ){       // 想定したファイル仕様と異なる
        printf("画像ファイル「櫻BMP白黒.bmp」がオカシイ\n");
        pimgA->freeMem();                       // 画像メモリ解放画像「imgA」
        exit( 0 );                              // C言語標準関数でプログラム終了
    }
    pimgB->MallocBYTE (h,v);                    // 画像ファイルサイズで画像情報セット
    FUN.Clear(pimgB,0);                         // 一旦、画像を0クリア
    FUN.ReadBitmap("櫻BMP白黒.bmp",          // ファイル「櫻BMP白黒.bmp」を
                                pimgB );        // 画像とし画像「imgB」に格納
    pimgT->MallocBYTE(h,v);                     // 画像ファイルサイズで画像情報セット
    FUN.Smoothing(pimgB,pimgT,ft,3,3,2);        // 3×3平滑化でT画像作成
    FUN.Copy(pimgT,pimgB);                      // 「imgA」を平滑化後にセット
    FUN.WriteBitmap("ボカシ櫻BMP白黒.bmp",   // ファイル「ボカシ櫻BMP白黒.bmp」を
                                pimgB );        // 画像とし画像「imgB」で作成
    pimgT->freeMem();                           // 画像メモリ解放画像「imgT」
    execute( pimgA, pimgB );                    // 例文の実行部
    pimgA->freeMem();                           // 画像メモリ解放画像「imgA」
    pimgB->freeMem();                           // 画像メモリ解放画像「imgB」
}

「FUN.up_fill_int(1,ft,1000);」は、平滑化用の重み配列
を全て「1」に初期化≪平滑化≒ボカシ画像作成準備≫
「sti=FUN.ReadBitmapAttribute("欅BMP白黒.bmp",
&h,&v,&c,&xPixPerMeter,&yPixPerMeter);」は、
画像ファイル「欅BMP白黒.bmp」のファイルとしての諸元
情報≪画像としての水平幅・垂直幅・画素のビット単位・
水平垂直の解像度≫を取得する関数です!
「if( sti != STI_END ){printf(メッセージ);exit(0);}」
は、エラー発生時にエラーメッセージ≪ここでは、
「("画像ファイル「欅BMP白黒.bmp」がオカシイ」≫を
表示し、「exit(0);」でプログラム終了!
「if(h!=640||v!=480||c!=8){printf(メッセージ);
exit(0);}」は、
条件「h!=640||v!=480||c!=8」で例文用に用意した画像ファ
イル「欅BMP白黒.bmp」なら水平幅=640、垂直幅=480、
画素のビット数=8に成る筈が異なるのでエラーと判断して
「printf(メッセージ);」とエラーメッセージを出して
因みにメッセージ
「("画像ファイル「欅BMP白黒.bmp」がオカシイ」です!
「exit(0);」でプログラム終了!
「pimgA->MallocBYTE(h,v);FUN.Clear(pimgA,0);」は、
画像メモリ「pimgA」実態を動的に確保し、0クリア、
「FUN.ReadBitmap("欅BMP白黒.bmp",pimgA);」は、
画像メモリ「pimgA」に画像ファイル「欅BMP白黒.bmp」
の画像を読み出す!
「pimgT->MallocBYTE(h,v);」は、画像メモリ「pimgT」実態を動的に確保、
「FUN.Smoothing(pimgA,pimgT,ft,3,3,2);」は、3×3
平滑化≪ボカシ(弱:※備考:強くボカシを入れる場合は、
「ft,5,5,2」とか「ft,7,7,2」を試して下さい)画像作成≫
「FUN.Copy(pimgT,pimgA);」は、ボカシた画像を画像メモリ
「pimgA」にコピー
「FUN.WriteBitmap("ボカシ欅BMP白黒.bmp",pimgA);」
は、ファイル「ボカシ欅BMP白黒.bmp」にボカシた画像
を作成
「pimgT->freeMem();」は、画像メモリ解放「pimgT」
「sti=FUN.ReadBitmapAttribute("櫻BMP白黒.bmp",
&h,&v,&c,&xPixPerMeter,&yPixPerMeter);」は、
画像ファイル「櫻BMP白黒.bmp」のファイルとしての諸元
情報≪画像としての水平幅・垂直幅・画素のビット単位・
水平垂直の解像度≫を取得する関数です!
「if( sti != STI_END ){printf(メッセージ);
pimgA->freeMem();exit(0);}」
は、エラー発生時にエラーメッセージ≪ここでは、
「("画像ファイル「櫻BMP白黒.bmp」がオカシイ」≫を
表示し、
「pimgA->freeMem();」は、画像メモリ解放「imgA」
「exit(0);」でプログラム終了!
「if(h!=640||v!=480||c!=8){printf(メッセージ);
pimgA->freeMem();exit(0);}」は、
条件「h!=640||v!=480||c!=8」で例文用に用意した画像ファ
イル「櫻BMP白黒.bmp」なら水平幅=640、垂直幅=480、
画素のビット数=8に成る筈が異なるのでエラーと判断して
「printf(メッセージ);」とエラーメッセージを出して
因みにメッセージ
「("画像ファイル「櫻BMP白黒.bmp」がオカシイ」です!
「pimgA->freeMem();」は、画像メモリ解放「imgA」
「exit(0);」でプログラム終了!
「pimgB->MallocBYTE(h,v);FUN.Clear(pimgB,0);」は、
画像メモリ「pimgB」実態を動的に確保し、0クリア、
「FUN.ReadBitmap("櫻BMP白黒.bmp",pimgB);」は、
画像メモリ「pimgB」に画像ファイル「櫻BMP白黒.bmp」
の画像を読み出す!
「pimgT->MallocBYTE(h,v);」は、画像メモリ「pimgT」実態を動的に確保、
「FUN.Smoothing(pimgB,pimgT,ft,3,3,2);」は、3×3
平滑化≪ボカシ(弱:※備考:強くボカシを入れる場合は、
「ft,5,5,2」とか「ft,7,7,2」を試して下さい)画像作成≫
「FUN.Copy(pimgT,pimgB);」は、ボカシた画像を画像メモリ
「pimgB」にコピー
「FUN.WriteBitmap("ボカシ櫻BMP白黒.bmp",pimgB);」
は、ファイル「ボカシ櫻BMP白黒.bmp」にボカシた画像
を作成
「pimgT->freeMem();」は、画像メモリ解放「pimgT」
「execute( pimgA, pimgB );」は、実際の処理部
「pimgA->freeMem();」は、画像メモリ解放「imgA」
「pimgB->freeMem();」は、画像メモリ解放「imgB」

2.考察

この画像処理ライブラリ関数を使用したソースコードを
コンパイルして実行すると「欅」と「櫻」の画像として
見たら、一致率「execute(pimgA,pimgB);実際の処理部」の
中のデバッグ用に入れた「printf()」での表示で一致率が
フォーマット「%e」なので浮動小数点形式で表示される筈
です、
しかしながら、アルゴリズム中ほどの
「if(abs(data)>0.5){・・・}」と相関値が「0.5」を超え無
いとデータとしては排除して居るので私は、図形を見た経験
から「0.5」程度で丁度いいと判断したが、動作させて無い
ので「0.1」程度に下げる必要が有るかもしれません?!
試行錯誤とし、ソースコードでの提供ですから、数値を変更
して色々試して下さい!
そして、
「FUN.Smoothing(pimgA,pimgT,ft,3,3,2);」は、3×3
平滑化≪ボカシ(弱:※備考:強くボカシを入れる場合は、
「ft,5,5,2」とか「ft,7,7,2」を試して下さい)画像作成≫
「FUN.Smoothing(pimgB,pimgT,ft,3,3,2);」は、3×3
平滑化≪ボカシ(弱:※備考:強くボカシを入れる場合は、
「ft,5,5,2」とか「ft,7,7,2」を試して下さい)画像作成≫
と「備考:」で記載した様にオリジナルでは3×3ボカシ
ですが、5×5ボカシや7×7ボカシが、可能ですから、
色々試して下さい!

画像をボカシての方法の後は、高速化≪今回は、パターン
画像(欅)をサーチ対象画像(櫻)の一致率が高い所を探す
手法が二次元XY座標方向に虱潰し的にベターと処理時間の
掛かるが解り易いとして採用しましたが、実用では高速化と
して色々考えラレルので紹介する心算です!≫、
高速化は、来年、

欅坂46から櫻坂46に改名した事を画像処理的に考察例
文ソースコード説明その3

で解説する予定です!

文末


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