無題
Posted: 2007年1月18日(木) 01:57
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;
}
原画像を固定して、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;
}