No.1ベストアンサー
- 回答日時:
文字数制限で書ききれないので、2回に分けて投稿します。
以下は差分抽出関数です。
簡単のため、エラーチェックは省いてます。
//img … 検査画像のBITMAP構造体
//bg … 背景画像のBITMAP構造体
void Diff(BITMAP img, BITMAP bg)
{
const int bw = 5;//局所領域のサイズ
const int br = bw/2;//局所領域の中心から見た±方向の領域上限
int w = img.bmWidth;//画像幅
int h = img.bmHeight;//画像高さ
unsigned char* buf = GetGrayscaleBytesFromBitmap(img);//検査画像のグレースケール取得
unsigned char* bgimg = GetGrayscaleBytesFromBitmap(bg);//背景画像のグレースケール取得
float* vector1 = (float*)malloc(sizeof(float)*bw*bw);//検査画像の局所領域バッファ
float* vector2 = (float*)malloc(sizeof(float)*bw*bw);//背景画像の局所領域バッファ
//局所領域が画像内に収まるように、上下左右にbrだけ「のりしろ」を入れる。
for(int y=br;y<h-br;y++){
for(int x=br;x<w-br;x++){
//検査画像と背景画像の局所領域グレー値をvector1とvector2に格納する。
//ついでにvector1とvector2の距離を求めておく。
float vectorAbs1=0.0; //vector1の距離(2乗和を求めて最後に√する)
float vectorAbs2=0.0; //vector2の距離(2乗和を求めて最後に√する)
for(int dy=-br;dy<=br;dy++){
for(int dx-br;dx<=br;dx++){
int idx_vct = (dy+br)*bw + (dx+br);//局所領域バッファの格納順番(左上→右下)
int idx_img = (y+dy)*w + (x+dx);//グレースケール配列の格納順番(左上→右下)
vector1[idx_vct]=(float)buf[idx_img];//検査画像のグレー値を格納
vector2[idx_vct]=(float)bgimg[idx_img];//背景画像のグレー値を格納
vectorAbs1 += vector1[idx_vct]*vector1[idx_vct];
vectorAbs2 += vector2[idx_vct]*vector2[idx_vct];
}
}
vectorAbs1 = sqrt(vectorAbs1);//√して距離にする
vectorAbs2 = sqrt(vectorAbs2);//√して距離にする
//格納された局所領域のグレー値から、正規化距離による差分を計算する。
float distance = 0.0; //差分(2乗和を求めて最後に√する)
for(int dy=-br;dy<=br;dy++){
for(int dx-br;dx<=br;dx++){
int idx_vct = (dy+br)*bw + (dx+br);//局所領域バッファの格納順番(左上→右下)
float dif = vector1[idx_vct]/vectorAbs1 - vector2[idx_vct]/vectorAbs2;
diffSq += dif*dif;
}
}
distance = sqrt(distance);//√して距離にする
//差分が閾値より大きければ検査画像の画素を赤で塗りつぶす
int idx_img32 = (y*w + x)*4; //検査画像のピクセルバッファ位置(1画素=4バイト)
img.bmBits[idx_img32] = 255; //赤=255
img.bmBits[idx_img32+1] = 0; //緑=0
img.bmBits[idx_img32+2] = 0; //青=0
}
}
//バッファ解放
free(buf);
free(bgimg);
free(vector1);
free(vector2);
}
No.2
- 回答日時:
No.1の続きです。
以下はNo.1の関数から呼び出されるグレースケール取得関数です。
//bmp… BITMAP構造体
//戻り値 … グレースケール配列
unsigned char* GetGrayscaleBytesFromBitmap(BITMAP bmp)
{
if(bmp.bmBitsPixel!=32)return NULL; //簡略化のため32bitのみ対応します。
int w = bmp.bmWidth; //幅
int h = bmp.bmHeight;//高さ
int len = w*h; //グレースケール配列のサイズ
unsigned char* buf = (unsigned char*)bmp.bmBits; //画像のピクセルバッファ
unsigned char* result = (unsigned char*)malloc(len); //グレースケール配列の確保
for(int i=0,j=0;i<len;i++,j+=4){ //グレースケールは1画素1バイト、画像は1画素4バイト
//RGBからグレースケールへの変換
//R:G:Bをおよそ3:6:1でブレンドしたものがグレー値。
result[i] = (unsigned char*)((buf[j+2]*3+buf[j+1]*6+buf[j])/10);
}
return result;
}
動作確認等は全くしていないので、適宜修正して下さい。
引数のBITMAP構造体は、WindowsAPIのLoadBitmap()等の関数で取得したビットマップハンドルから、GetObject()で取りだせます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 美術・アート ある背景イラスト画集を探しています。 はじめまして。 以前、ヴィレッジヴァンガードで1度 売られてい 1 2022/11/09 02:22
- 一眼レフカメラ カメラ初心者です。 SONYのフルサイズカメラを購入し、レンズはTAMRONの20-40 F2.8の 5 2023/03/26 22:22
- 英語 カーペンターズ「Your Wonderful Parade」の歌詞の和訳(意訳OK)&背景について 1 2022/07/10 16:58
- その他(悩み相談・人生相談) 新大学1年生です。 入ってそうそう大学の英語テストがあったのですが悪すぎて落ち込んでいます。 友達は 2 2022/04/03 12:51
- その他(映画) 背景がギュイーンとズームアウトするズームの名前と撮影方法を知りたい。 1 2023/04/15 16:00
- その他(Microsoft Office) スプレッドシートにて、条件付き書式で複数の単語に合致するセルを着色したいです。 2 2023/04/06 13:25
- モテる・モテたい 小説書いたり/歌詞//替え歌作曲 趣味で歌い手/バンド/カバーソングライターしてます よろしくお願い 1 2022/04/16 01:29
- 大学受験 大学受験英語長文の勉強法について 武田塾のYouTubeなどを参考にして、勉強法を考えました 自分は 2 2023/05/05 08:05
- 大学受験 大至急お願いします。 今高校3年生で浪人が決まりました。 まずは自己分析しようと思って、 なぜ現役で 5 2023/01/20 10:35
- 美術・アート デザインについての考察。 なぜ人の脳は、規則正しく連続した要素を「背景」と認識するのか、実験してみま 2 2022/04/11 21:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語
-
関数から配列を返すには?
-
100の階乗のプログラムって
-
ループカウンタを使用せず、配...
-
要素数・要素の値が未定の配列...
-
コンボボックスでデフォルト値...
-
配列のアドレス部
-
RAW画像高速表示について
-
2番目の最大値を求める
-
define で 配列
-
配列の要素数に変数を入れたい...
-
C言語の課題が出たのですが自力...
-
背景差分法における正規化距離
-
.NET C++で、構造体の配列をnew...
-
配列の配列をmemcpyやmemcmpし...
-
[C++/CLI]マネージコードで配列...
-
円周率を求めるプログラム
-
シマウマの模様を変えるプログラム
-
C#で構造体の配列を持った構造...
-
C言語についてです 5人のテスト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
構造体のextern方法
-
C言語において、 配列要素をひ...
-
C#でのフィボナッチ数列
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
配列のアドレス部
-
char型配列をint型に代入するには
-
2番目の最大値を求める
-
C言語の課題が出たのですが自力...
-
C言語についてです 5人のテスト...
-
C言語から質問です。
-
C言語 ファイルの指定された行...
-
c言語 構造体
-
コンボボックスでデフォルト値...
-
MFCのCArrayを使った二次元配列
おすすめ情報