欅坂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
で解説する予定です!