無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
若旦那

無題

#1

投稿記事 by 若旦那 » 17年前

2枚の同サイズのBMP画像を照合して、相関を取る(パターン認識)プログラムを作っています。
原画像を固定して、100枚用意した画像(入力画像)と順番に連続して相関を取るには
どうすればいいのか教えていただけないでしょうか!
今は原画像も入力画像も指定して開いています。
以下が作りかけのプログラムです。

#include <stdio.h>
#include <math.h>


int main(void)
{
FILE *fp;
int wide,hite,wd,ht,cm;
int v,v2;
int h[54],palette[1024],x,y,e,g;
int i,j;
double z,p,n,m;
double sum=0,sum2=0,sum3=0,sum4=0,sum5=0;
double ave=0,ave2=0;

/*原画像データ*/

fp=fopen("m.bmp","rb"); // mono画像ファイルを開く
for(j=0; j<54; j++)h[j]=fgetc(fp);// ヘッダの読み込み
wide=h[18]+h[19]*256; // 画像の幅の計算
hite=h[22]+h[23]*256;// 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++)palette[j]=fgetc(fp);

//mono画像データ読み込み
for(y=0; y<hite; y++)for(x=0; x<wide; x++){
v=fgetc(fp); //v=濃度値

sum+=v;

}
ave=sum/(hite*wide);

/*入力画像データ*/

fp=fopen("p.bmp","rb"); // mono画像ファイルを開く
for(j=0; j<54; j++)h[j]=fgetc(fp);// ヘッダの読み込み
wd=h[18]+h[19]*256; // 画像の幅の計算
ht=h[22]+h[23]*256;// 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++)palette[j]=fgetc(fp);

//mono画像データ読み込み
for(e=0; e<ht; e++)for(g=0; g<wd; g++){
v2=fgetc(fp);

sum2+=v2;

}

ave2=sum2/(ht*wd);

/*相関をとる*/


for(j=0;j<=hite;j++) for(i=0;i<=wide;i++)
{
n=(v-ave)*(v-ave);
sum3+=n;
}


for(j=0;j<=ht;j++) for(i=0;i<=wd;i++)
{
m=(v2-ave2)*(v2-ave2);
sum4+=m;
}


for(j=0;j<=hite;j++) for(i=0;i<=wide;i++)
{
p=(v-ave)*(v2-ave2);
sum5+=p;

}
printf("sum5=%f\n",sum5);

//sum5÷sum3*sum4のルート
z=sum5/sqrt(sum3*sum4);

printf("類似度=%f",z);



return 0;
}

Yuki

Re:無題

#2

投稿記事 by Yuki » 17年前

当方画像処理関係はやったことないので、「相関を取る」とやらはよくわからんのですが
「原画像を固定して、100枚用意した画像(入力画像)と順番に連続して・・・」
でしたら、100枚用意した画像のパスを記述したファイルを用意してあげて、
そのファイルを読みながら「相関を取る」処理をすれば良いのではないでしょうか。

若旦那

Re:無題

#3

投稿記事 by 若旦那 » 17年前

返答ありがとうございます!

パスを記述したファイルとはなんなのか分からないんですが。
原画像はいじらず入力画像のみ配列を使うのってだめですか??

#define num 100
:
int gazou[num]
:
:
/*入力画像データ*/
for(x=0;x<num;x++){
fp=fopen("gazou[x].bmp","rb");
:
:
}

Yuki

Re:無題

#4

投稿記事 by Yuki » 17年前

入力画像がgazou0.bmp~gazou99.bmpの連番という決まりがあるのでしたら、
char infilepath[256];
int x;

/*入力画像データ*/ 
for(x=0;x<num;x++){ 
	sprintf(infilepath, "gazou%d.bmp", x);
	fp=fopen(infilepath,"rb"); 
	: 
	: 
}
で、できます。

パスを記述したファイルとは、プログラム内でパスを生成するのではなく
gazou0.bmp
gazou1.bmp
:
:
gazou98.bmp
gazou99.bmp
という具合にファイルパスを記述したファイルを用意して、
そのファイルを利用して入力画像を取得する方法です。

入力画像のファイルパスに規則性が無い場合に有効です。

若旦那

Re:無題

#5

投稿記事 by 若旦那 » 17年前

Yukiさんありがとうございます!
教えていただいたとおりにしたつもりなのですがコンパイルはできても
2枚目の画像をひらくことができません。
用意している画像はgazou0.bmp~gazou10.bmpです。
プログラムがあるフォルダにいれていればいいんですよね?
もう一度手直ししていただけますでしょうか。
早急に完成させないといけないのでよろしくおねがいします。



#include <stdio.h>
#include <math.h>


int main(void)
{
FILE *fp;
int wide,hite,wd,ht,cm;
int v[256][256],v2[256][256];
int h[54],palette[1024];
int i,j,a,b,x;
int n,m,p,t;
double sum3=0,sum4=0,sum5=0;
double z;
char infilepath[256];




/*1枚目の画像data*/

fp=fopen("p.bmp","rb"); // mono画像ファイルを開く
if(fp==NULL){
printf("エラー\n");
return 1; }
for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wide=h[18]+h[19]*256; // 画像の幅の計算
hite=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);

//mono画像データ読み込み
for(a=0; a<hite; a++)for(b=0; b<wide; b++){
v[a]=fgetc(fp);


}




/*2枚目の画像data*/
for (x=0; x<50; x++) {

sprintf(infilepath,"gazou%d.bmp",x);
fp=fopen("infilepath","rb"); // mono画像ファイルを開く

if(fp==NULL){
printf("エラー2\n");
return 1; }
}
for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wd=h[18]+h[19]*256; // 画像の幅の計算
ht=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);

//mono画像データ読み込み
for(a=0; a<ht; a++)for(b=0; b<wd; b++){
v2[a]=fgetc(fp);

}




/*相関の式に代入*/


//左下の計算//

for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
n=(v[a])*(v[a]);
sum3+=n;

}
printf("sum3=%f\n",sum3);


//右下の計算//


for(a=0;a<ht;a++) for(b=0;b<wd;b++)
{
m=(v2[a])*(v2[a]);
sum4+=m;

}
printf("sum4=%f\n",sum4);


//分子の計算//

for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
p=(v[a])*(v2[a]);
sum5+=p;

}
printf("sum5=%f\n",sum5);

//sum5÷sum3*sum4のルート
z=sum5/sqrt(sum3*sum4);

printf("類似度=%f",z);


return 0;
}

box

Re:無題

#6

投稿記事 by box » 17年前

向こうの掲示板で問題が解決したのであれば、
こちらは「解決」フラグを立ててしっかりクローズしてください。

# マルチポストは感心できません。

若旦那

Re:無題

#7

投稿記事 by 若旦那 » 17年前

マナー違反でした。
すみませんでした。

閉鎖

“C言語何でも質問掲示板” へ戻る