掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29257

フラクタル画像符号化
投稿者---学生(2006/12/17 05:23:30)


始めまして、大学生をやっているものです。
学生で今フラクタル画像符号化について勉強しています。
下のものですが、

#define B 8
#define DP 3
#define X 256
#define Y 256
#define HEAD 1078
#define RY (Y/B)
#define RX (X/B)
#define R RY*RX
#define DX (X-2*B+1)
#define DY (Y-2*B+1)
#define D DY*DX

struct tmp{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};

int main(){
struct tmp *ptr;
time_t lt;
int x, y, z, k, i, j, a, p, q, count=0, c;
float s, o, dr, d, r, d_2, ar, mse, average, sbit_2, obit_2, rs, ro;
float obitin, sbitin, sbit, obit, ifs[R][6], sca[256], off[256];
char fno[40], fnot[40];
char tsub[36][40]={"time338hi3.txt","time348hi3.txt","time358hi3.txt","time368hi3.txt","time378hi3.txt","time388hi3.txt",
"time438hi3.txt","time448hi3.txt","time458hi3.txt","time468hi3.txt","time478hi3.txt","time488hi3.txt",
"time538hi3.txt","time548hi3.txt","time558hi3.txt","time568hi3.txt","time578hi3.txt","time588hi3.txt",
"time638hi3.txt","time648hi3.txt","time658hi3.txt","time668hi3.txt","time678hi3.txt","time688hi3.txt",
"time738hi3.txt","time748hi3.txt","time758hi3.txt","time768hi3.txt","time778hi3.txt","time788hi3.txt",
"time838hi3.txt","time848hi3.txt","time858hi3.txt","time868hi3.txt","time878hi3.txt","time888hi3.txt"};
char fsub[36][40]={"ifs338hi3.txt","ifs348hi3.txt","ifs358hi3.txt","ifs368hi3.txt","ifs378hi3.txt","ifs388hi3.txt",
"ifs438hi3.txt","ifs448hi3.txt","ifs458hi3.txt","ifs468hi3.txt","ifs478hi3.txt","ifs488hi3.txt",
"ifs538hi3.txt","ifs548hi3.txt","ifs558hi3.txt","ifs568hi3.txt","ifs578hi3.txt","ifs588hi3.txt",
"ifs638hi3.txt","ifs648hi3.txt","ifs658hi3.txt","ifs668hi3.txt","ifs678hi3.txt","ifs688hi3.txt",
"ifs738hi3.txt","ifs748hi3.txt","ifs758hi3.txt","ifs768hi3.txt","ifs778hi3.txt","ifs788hi3.txt",
"ifs838hi3.txt","ifs848hi3.txt","ifs858hi3.txt","ifs868hi3.txt","ifs878hi3.txt","ifs888hi3.txt"};
unsigned char head[HEAD], buf[Y][X];
unsigned char input_data[Y][X], range[R][B][B], kaiten[B][B];
unsigned char domain[D][2*B][2*B], domain_2[D][B][B];
FILE *fp, *fp2;

if((fp=fopen("Lenap.bmp","rb"))==NULL){
printf("ファイルを開く際にエラーが発生しました。\n");
exit(1);
}
fread(head,1,HEAD,fp);
fread(buf,X,Y,fp);

for(y=0;y<Y;y++){
for(x=0;x<X;x++){
input_data[y][x]=buf[y][x];
}
}
printf("ファイルの読み込み終了しました。\n");
fclose(fp);

for(z=0;z<256;z++)
sca[z]=0;
//ここで輝度値をB×Bのレンジブロックに分けて配列に格納する
for(z=0;z<R;z++){
for(y=0;y<B;y++){
for(x=0;x<B;x++){
range[z][y][x]=input_data[z/RY*B+y][z%RX*B+x];
}
}
ifs[z][0]=(float)z;
}

//ここでは2B×2Bのドメインブロックに分ける
for(a=0;a<D;a++){
for(y=0;y<2*B;y++){
for(x=0;x<2*B;x++){
domain[a][y][x]=input_data[a/DY+y][a%DX+x];
}
}
}

//ここでは2B×2BのドメインブロックをB×Bのドメインブロックにする
for(a=0;a<D;a++){
for(y=0;y<B;y++){
for(x=0;x<B;x++){
average=0;
//ここで2B×2BをB×Bにするので2×2の平均値をとる
for(j=0;j<2;j++){
for(i=0;i<2;i++){
average+=domain[a][y*2+j][x*2+i];
}
}
//ここで入力した輝度値の合計の平均を取る
average/=2*2;
//こで取った平均値を新しいドメインブロックに格納する
domain_2[a][y][x]=(unsigned char)average;
}
}
}
//ここではsx+oを使ってより似ているものに近づけるそして、平均二乗誤差を用いて比較する

ここは符号化の部分です。
これはフラクタルのスケーリング、オフセットの量子化を行ったものです。
複合化の複合化の部分は問題なかったので省きました。
これで実行すると量子化するビットを上げていけばMSE(平均二乗誤差)が小さくなるはずなのですが、5ビットから6ビットにいくときに逆に上がってしまいます。
どこが間違っているのかわかる方、教えていただけないでしょうか?
使っているコンパイラはビジュアルC++です。
osはウィンドウズxpでsp2を用いています。
どうかよろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:フラクタル画像符号化 29258 学生 2006/12/17 05:32:43


No.29258

Re:フラクタル画像符号化
投稿者---学生(2006/12/17 05:32:43)


//ここからスケーリングのループ
for(q=3;q<=8;q++){
sbit=1;
//上で初期化してここで代表点の数を算出する
for(z=0;z<q;z++)
sbit*=2;
//sbitには代表点の間隔,sbit_2には代表点の値の初期値を代入する
sbitin=2/(sbit-1);
sbit_2=-1;
z=0;
while(1){
//配列scaに-1からそれぞれのビットに合わせて代表点を代入していく
sca[z]=sbit_2;
sbit_2+=sbitin;
if(sbit-1 == z){
sca[z]=1;
break;
}else if(sbit<z){
}
z++;
}
//下ではまず、配列offを初期化してスケーリングと同様の手順でオフセットを処理する
for(z=0;z<256;z++)
off[z]=0;
for(p=3;p<=8;p++){
//ここで量子化ビット数が変わるごとに初期mseを初期化する
obit=1;
for(z=0;z<p;z++)
obit*=2;
obitin=512/(obit-1);
obit_2=-256;
z=0;
while(1){
off[z]=obit_2;
obit_2+=obitin;
if(obit-1 == z){
off[z]=256;
break;
}else if(obit<z){
printf("オフセット作業中にエラーが発生しました。\n");
}
z++;
}
strcpy(fnot,&tsub[count]);
if((fp2=fopen(fnot,"w"))==NULL){
exit(1);
}
strcpy(fno,&fsub[count]);
if((fp=fopen(fno, "wb"))==NULL){
exit(1);
}
for(z=0;z<R;z++)
ifs[z][2]=10000;
for(a=0;a<R;a++){
j=(a/RY-DP/2)*B;
while(j<=(a/RY+DP/2-1)*B){
while(j<0)
j++;
i=(a%RX-DP/2)*B;
while(i<=(a%RX+DP/2-1)*B){
while(i<0)
i++;
k=DY*j+i;
for(c=0;c<8;c++){
dr=0, d=0, r=0, d_2=0, mse=0, s=0, rs=0, o=0, ro=0;
//ここで回転反転を加えたものを
switch(c){
case 0:
for(y=0;y<B;y++){
for(x=0;x<B;x++){
kaiten[y][x]=domain_2[k][y][x];
}
} break;
case 1:
for(y=0;y<B;y++){
for(x=0;x<B;x++){
kaiten[y][x]=domain_2[k][B-1-x][y];
}
}
break;
case 2:
for(y=0;y<B;y++){
for(x=0;x<B;x++){
kaiten[y][x]=domain_2[k][B-1-y][B-1-x]; }
}
break;
case 3:
for(y=0;y<B;y++){
for(x=0;x<B;x++){
kaiten[y][x]=domain_2[k][x][B-1-y];
}
}
break;
case 4:
for(y=0;y<B;y++){
for(x=0;x<B;x++){
kaiten[y][x]=domain_2[k][y][B-1-x];
}
}
break;
case 5:
for(y=0;y<B;y++){
for(x=0;x<B;x++){
kaiten[y][x]=domain_2[k][B-1-x][B-1-y];
}
}
break;
case 6:
for(y=0;y<B;y++){
for(x=0;x<B;x++){
kaiten[y][x]=domain_2[k][B-1-y][x];
}
}
break;
case 7:
for(y=0;y<B;y++){
for(x=0;x<B;x++){
kaiten[y][x]=domain_2[k][x][y];
}
}
break;
}
for(y=0;y<B;y++){
for(x=0;x<B;x++){
//ここではsx+oに必要な数値を計算している
dr+=kaiten[y][x]*range[a][y][x];
d+=kaiten[y][x];
r+=range[a][y][x];
d_2+=kaiten[y][x]*kaiten[y][x];
}
}
s=(B*B*dr-d*r)/(B*B*d_2-d*d);
//上では普通のスケーリングの計算をする
z=1;
while(1){
//ここで最初に1以上か-1以下ならそこで1、-1を代入してループを止める
if(s <= -1){
rs = -1;
break;
}else if(s >= 1){
rs = 1;
break;
}
//変数tempにスケーリングと代表点の差の絶対値を代入する
if(s-sca[z-1]<=sca[z]-sca[z-1]){
if(s-sca[z-1]<=(sca[z]-sca[z-1])/2){
  //その絶対値が変数rai以下のとき代表点を代入してループを止める
rs=sca[z-1];
break;
}else if(s-sca[z]<=(sca[z]-sca[z-1])/2){
rs=sca[z];
break;
}
}
z++;
}
//以下ではスケーリングと同様の手順でオフセットの処理を行う
o=(r-rs*d)/(B*B);
z=1;
while(1){
if(o >= 256){
ro = 256;
break;
}else if(o <= -256){
ro = -256;
break;
}
if(o-off[z-1]<=off[z]-off[z-1]){
if(o-off[z-1]<=(off[z]-off[z-1])/2){
ro = off[z-1];
break;
}else if(o-off[z]<=(off[z]-off[z-1])/2){
ro = off[z];
break;
}
}
z++;
}
//ここでMSEを計算する
for(y=0;y<B;y++){
for(x=0;x<B;x++){
  //ここでsx+oを使ってより似ているものにして平均二乗誤差を用いて比較する
ar=rs*kaiten[y][x]+ro;
//ここで両端を揃える
if(ar<=0){
ar=0;
}else if(ar>=255){
ar=255;
}
mse+=(range[a][y][x]-ar)*(range[a][y][x]-ar);
}
}
mse/=B*B;
if(ifs[a][2]>=mse){
ifs[a][1]=(float)k, ifs[a][5]=(float)c;
ifs[a][2]=mse, ifs[a][3]=rs, ifs[a][4]=ro;
}
}
i++;
if(i>DX-1)
break;
}
j++;
if(j>DY-1)
break;
}
printf("s : %d o : %d range : %d終了\n", q, p, a+1);
/*fwriteの3番目と同じ値が返されていなければエラーが起きる*/
if(fwrite(&ifs[a], sizeof(float), 6, fp)!=6){
printf("書き込みエラーが起きました。\n");
exit(1);
}
lt=time(NULL);
ptr=localtime(&lt);
fprintf(fp2,asctime(ptr));
printf("レンジの位置 ドメインの位置 MSE スケーリング オフセット 反転・回転\n");
printf("%.0lf\t %.0lf\t %lf\t %lf\t %lf\t %.0lf\n", ifs[a][0], ifs[a][1], ifs[a][2], ifs[a][3], ifs[a][4], ifs[a][5]);
}
fprintf(fp2,"%u\n",clock()/CLOCKS_PER_SEC);
fclose(fp);
fclose(fp2);
count++;
}
}

printf("符号化の処理が終わりました。\n");
return(1);
}

先ほどの文の続きです。一気に書ききれなかったので分けました。
物凄く見ずらいかとは思いますが、どうかよろしくお願いします。


この投稿にコメントする

削除パスワード

No.29259

Re:フラクタル画像符号化
投稿者---επιστημη(2006/12/17 13:57:00)
http://blogs.wankuma.com/episteme/


読んでもらうことを拒んでいるようなコードです。

せめて「掲示板利用宣言」に従い、
- ソースの添付は「HTML変換ツール」で字下げ
しなさい。

# 長いソースをベタ貼りしたところで、通常見向きもされませんけど。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧