
以下のような低解像度作成の式があり
それをプログラム化してみたのですがいまいちうまくいきません。
先生に式が誤りでないか聞いてみたのですが正しいと言われました。
どなたかプログラムのどの部分が間違っているかご指摘お願いします。
解像度変換の式は以下の通りです。
現画像{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
No.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)だけ平行移動」したものですよね・・・。
(※高校数学うろ覚えですが)
度々ありがとうございます。
回答者様のおっしゃる通り式Bで作り直してみると
成功しました!!
式Aはただ結果画像を平行異動させるだけの式ですよね・・
何度も適当な値を代入してて計算してみたのですがどう考えても
平行移動させてるだけなのに何故・・・・?
と思っていましたがはやりそうでしたね。
式Bのようにすることで原画像の平均値を取る範囲をずらすことで
違った結果が得られるようにできるのですね。
スッキリしました。ありがとうございます。
No.1
- 回答日時:
>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に設定したときの
結果の違いは平行移動した画像が出来るだけです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- 数学 情報処理詳しい人!! A4縦のレポート文書に4:3の大きさの横向きの写真画像を貼り付けることにした。 2 2022/12/18 02:30
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Photoshop(フォトショップ) Photoshopの画像が重すぎるので軽くしたいです 7 2022/05/13 20:13
- その他(教育・科学・学問) 技術のテストの問題です。やり方を教えてください! 間1.7バイトは何ビットか。 間2.5ビットで表現 4 2023/02/27 00:09
- C言語・C++・C# 3×3のラテン方陣をつくるプログラムを作成したのですが、(↓) #include <stdio.h> 5 2023/07/10 01:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビット演算で00000001と1の頭...
-
Ecel 2003 VBA 画像 挿入
-
javaの数値リテラルや文字リテ...
-
数値にウエイトをかけたい
-
replaceAllの使い方
-
HLOOKUP行参照
-
LU分解
-
【JavaScript】指定箇所に文字...
-
パラメータを利用するには…
-
プログラミングの質問です
-
テキストボックスの数値チェック
-
次式のような解像度変換のプロ...
-
Javascriptでマシン固有の情報...
-
ダブルクォーテーションを含む...
-
fortranで・・・
-
txtから読み込んだ計算式の結果...
-
javaで\\という文字列の記述方法
-
buttonの高さの変更
-
iアプリ:ラベル間の文字列操作...
-
選択したチェックボックスの値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
ArrayListの要素数の上限
-
Stringクラスの変数の格納アド...
-
javaのCSVデータ読込についてです
-
PSQLExceptionが発生する
-
excel vba 時間計算と条件分岐...
-
wsprintf関数の使い方について
-
BCD形式で時刻を!
-
C言語の変数(LSB)の合わせ込...
-
DOSバッチで変数の値を変数名に...
-
JSPでの計算結果表示
-
DateTimePickerに値を入れたい...
-
JSPでHashMap・配列の変数の値...
-
StringBufferクラスについて
-
char型での演算子
-
結合した文字列をファイル名に...
-
String str = "a\\\\b\\\\c";
-
Evaluate()に文字列の形式の数...
-
getParameterの値変更
-
matchesを否定文として使う方法...
おすすめ情報