昨日見た夢を教えて下さい

以下のような低解像度作成の式があり
それをプログラム化してみたのですがいまいちうまくいきません。
先生に式が誤りでないか聞いてみたのですが正しいと言われました。
どなたかプログラムのどの部分が間違っているかご指摘お願いします。
解像度変換の式は以下の通りです。
現画像{Xm,n}とし低解像度画像を{X'm,n}としたとき

X'm,n=1/W^2 * Σ[k=0.W-1]Σ[l=0.W-1]
   * X[(m+m0)/W]*W+k,[(n+n0)/W]*W+l
となり、
式の添字mは縦方向nは横方向を表し、Wは解像度を何分の1にするかという値です(例えばW=5であれば解像度は5*5の25分の1になります)
また、Σの中の[(m-m0)/W]と[(n-n0)/W]はガウス記号で少数以下切捨てです。
m0とn0の値は0~W-1の任意の値で
これを変化させることで同じ解像度で異なる画像が作成できます。

現画像のサイズ256*256の濃淡画像、
読み込んだ現画像をoriginal[x][y]、
解像度変化後をhenka[x][y]として、
上式の部分の私の作ったプログラムは

  int W = 34;//任意の値
int m0 =0;//任意の値
int n0 =0;//任意の値
int x,y;
x = y = 0;
float sum = 0f;
float pixel = 0f;
for(int m = 0; m < 256; m++){
for(int n = 0; n < 256; n++) {

sum=0;
for(int k = 0; k<W ; k++){
for(int l = 0; l<W ; l++){


x = (m+m0)/W;
y = (n+n0)/W;

x = x * W + k;
y = y * W + l;

pixel = original[x][y];//
sum = sum + (pixel/W/W);

}

}

henka[m][n] = sum;
}
  }

となりました。
しかし実行してみると解像度は確かに変わるのですが
W=10,m0=0,n0=0とした場合の結果と
W=10,m0=10,n0=10とした場合を比べると
単に前者の結果画像が縦横に10画素ずつずれただけ
という結果になりました。

長文になりましたがよろしくお願いしますm(__)m

A 回答 (2件)

#1です。



式A:
X'{m,n}
 =(1/W^2)*ΣΣ
   X{[(m+m0)/W]*W+k,[(n+n0)/W]*W+l}

でなくて

式B:
X'{m,n}
 =(1/W^2)*ΣΣ
   X{[(m+m0)/W]*W-m0+k,[(n+n0)/W]*W-n0+l}

かなあ・・・。
自信アリマセンが・・・。
---

いわれてみれば確かに、式Aは、数式の"外観的"には
式C:
X'{m,n}
 =(1/W^2)*ΣΣ
   X{[m/W]*W+k,[n/W]*W+l}
の図形(?)を「単純に(-m0,-n0)だけ平行移動」したものですよね・・・。
(※高校数学うろ覚えですが)
    • good
    • 0
この回答へのお礼

度々ありがとうございます。
回答者様のおっしゃる通り式Bで作り直してみると
成功しました!!

式Aはただ結果画像を平行異動させるだけの式ですよね・・
何度も適当な値を代入してて計算してみたのですがどう考えても
平行移動させてるだけなのに何故・・・・?
と思っていましたがはやりそうでしたね。
式Bのようにすることで原画像の平均値を取る範囲をずらすことで
違った結果が得られるようにできるのですね。
スッキリしました。ありがとうございます。

お礼日時:2007/09/12 15:22

>W=10,m0=0,n0=0とした場合の結果と


>W=10,m0=10,n0=10とした場合を比べると
>単に前者の結果画像が縦横に10画素ずつずれただけ

とのことですが、

>m0とn0の値は0~W-1の任意の値で
>これを変化させることで同じ解像度で異なる画像が作成できます

と質問者さん自身がお書きになってる以上、
(W=10の場合、)m0とn0のとりうる値は「0から9まで」では?

この回答への補足

すいませんミスです。
おっしゃる通りW=10ならm0とn0の範囲は0~9までです。

ただ0~9の値に設定してもやはり0と1~9に設定したときの
結果の違いは平行移動した画像が出来るだけです。

補足日時:2007/09/11 14:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!