_AProg2009/ex03D
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[takataka]] | [[時間割2009]] | [[AProg2009]] | [[AProg2009/ex03]]
**課題D(おまけ課題) [#g003407a]
画像を縮小するプログラムを作ろう.
課題Cに追加してもよいし,独立したプログラムとしてもよい.
画像縮小のアルゴリズムについては,以下で解説する.
***step0 準備 [#l1fffff1]
幅 W 高さ H の画像を幅 w 高さ h の画像に縮小するとする.
縦横の縮小率は別個に定められるようにするべきであるが,ここでは話を簡単にするために同じ縮小率とする.
作成するプログラムも縦横同一の縮小率としてよい.
縮小率を &mimetex(\alpha); で表すことにする.すなわち,
#mimetex( \left\{ \begin{array}{l} w = \frac{W}{\alpha} \\ h = \frac{H}{\alpha} \end{array} \right. );
である(除算は小数点以下切り捨て).
&mimetex(\alpha = 2); ならば画像サイズを縦横半分にすることになる.
***step1 &mimetex(\alpha); が自然数の場合その1 [#q4fa1b26]
&mimetex(\alpha); が自然数の場合,もっとも単純な方法は,画素を「間引く」方法である(サンプリングする,標本化する,という).
簡単のために1次元で考えると,元画像の画素値のならびが
#pre{{
座標 [0] [1] [2] [3] [4] [5] [6] ...
画素値 10 15 17 16 19 20 18 ...
}}
であり,&mimetex(\alpha = 3); だったとすると,縮小後の画素のならびを
#pre{{
座標 [0] [1] [2] ...
画素値 10 16 18 ...
}}
とする,というものである.
#pre{{
for(x = 0; x < w; x++){
X = x * alpha;
img[x] = IMG[X];
}
}}
***step2 &mimetex(\alpha); が自然数の場合その2 [#yd29b08a]
実は,step1のように単純にサンプリングする方法は,「エイリアシング」という現象を起こすことがあるため,あまりよい方法ではない.
以下のサンプル画像を縮小してみるとわかるかもしれない.
&mimetex(\alpha = 3); で縮小してみよう.
-PGM画像 [[reductionsample1.pgm>AProg2009:reductionsample1.pgm]] [[reductionsample2.pgm>AProg2009:reductionsample2.pgm]]
-PPM画像 [[reductionsample1.ppm>AProg2009:reductionsample1.ppm]] [[reductionsample2.ppm>AProg2009:reductionsample2.ppm]]
縮小画像の質を改善する,いいかげんだけど最も簡便な方法は,間引くかわりに平均をとる,というものである.
step1と同様に1次元で説明する.
元画像の画素値のならびが
#pre{{
座標 [0] [1] [2] [3] [4] [5] [6] ...
画素値 10 15 17 16 19 20 18 ...
}}
であり,&mimetex(\alpha = 3); だったとすると,縮小後の画素のならびは
#pre{{
座標 [0] [1] ...
画素値 14 18
}}
とする,というものである.ただし,(10+15+17)/3 = 14, (16+19+20)/3 = 18 である.
&color(#ff0000){ここまでできたら,チェックを受け付けます.};
***step3 &mimetex(\alpha); が正の実数の場合 [#c3744fb3]
step2を締切までにできた人に限り,以下の課題についてのチェックを受け付けます.
期間は,この授業の前半7回の間です.
&mimetex(\alpha); として任意の正の実数をとれるようにしたい場合,困った問題が発生します.
例えば,&mimetex(\alpha = 1.5); として step1 の方法を適用しようとしてみるとわかりますが,縮小後の画像の [1] の位置は,元の画像の [1.5] の位置に対応することになります.
しかし,元画像の座標は [0], [1], ... と整数値をとっているので,[1.5] なんて位置の画素値は得られません.
これを解決するには,何らかの方法で画素値を「補間」(「数値計算法」で学んだかも)する必要があります.中でも単純でよく用いられるのは,「バイリニア法(双線形補間法)」と呼ばれるものです.
というわけで,この方法について調べて,任意の縮小率を実現できるようにしてみよう.
終了行:
[[takataka]] | [[時間割2009]] | [[AProg2009]] | [[AProg2009/ex03]]
**課題D(おまけ課題) [#g003407a]
画像を縮小するプログラムを作ろう.
課題Cに追加してもよいし,独立したプログラムとしてもよい.
画像縮小のアルゴリズムについては,以下で解説する.
***step0 準備 [#l1fffff1]
幅 W 高さ H の画像を幅 w 高さ h の画像に縮小するとする.
縦横の縮小率は別個に定められるようにするべきであるが,ここでは話を簡単にするために同じ縮小率とする.
作成するプログラムも縦横同一の縮小率としてよい.
縮小率を &mimetex(\alpha); で表すことにする.すなわち,
#mimetex( \left\{ \begin{array}{l} w = \frac{W}{\alpha} \\ h = \frac{H}{\alpha} \end{array} \right. );
である(除算は小数点以下切り捨て).
&mimetex(\alpha = 2); ならば画像サイズを縦横半分にすることになる.
***step1 &mimetex(\alpha); が自然数の場合その1 [#q4fa1b26]
&mimetex(\alpha); が自然数の場合,もっとも単純な方法は,画素を「間引く」方法である(サンプリングする,標本化する,という).
簡単のために1次元で考えると,元画像の画素値のならびが
#pre{{
座標 [0] [1] [2] [3] [4] [5] [6] ...
画素値 10 15 17 16 19 20 18 ...
}}
であり,&mimetex(\alpha = 3); だったとすると,縮小後の画素のならびを
#pre{{
座標 [0] [1] [2] ...
画素値 10 16 18 ...
}}
とする,というものである.
#pre{{
for(x = 0; x < w; x++){
X = x * alpha;
img[x] = IMG[X];
}
}}
***step2 &mimetex(\alpha); が自然数の場合その2 [#yd29b08a]
実は,step1のように単純にサンプリングする方法は,「エイリアシング」という現象を起こすことがあるため,あまりよい方法ではない.
以下のサンプル画像を縮小してみるとわかるかもしれない.
&mimetex(\alpha = 3); で縮小してみよう.
-PGM画像 [[reductionsample1.pgm>AProg2009:reductionsample1.pgm]] [[reductionsample2.pgm>AProg2009:reductionsample2.pgm]]
-PPM画像 [[reductionsample1.ppm>AProg2009:reductionsample1.ppm]] [[reductionsample2.ppm>AProg2009:reductionsample2.ppm]]
縮小画像の質を改善する,いいかげんだけど最も簡便な方法は,間引くかわりに平均をとる,というものである.
step1と同様に1次元で説明する.
元画像の画素値のならびが
#pre{{
座標 [0] [1] [2] [3] [4] [5] [6] ...
画素値 10 15 17 16 19 20 18 ...
}}
であり,&mimetex(\alpha = 3); だったとすると,縮小後の画素のならびは
#pre{{
座標 [0] [1] ...
画素値 14 18
}}
とする,というものである.ただし,(10+15+17)/3 = 14, (16+19+20)/3 = 18 である.
&color(#ff0000){ここまでできたら,チェックを受け付けます.};
***step3 &mimetex(\alpha); が正の実数の場合 [#c3744fb3]
step2を締切までにできた人に限り,以下の課題についてのチェックを受け付けます.
期間は,この授業の前半7回の間です.
&mimetex(\alpha); として任意の正の実数をとれるようにしたい場合,困った問題が発生します.
例えば,&mimetex(\alpha = 1.5); として step1 の方法を適用しようとしてみるとわかりますが,縮小後の画像の [1] の位置は,元の画像の [1.5] の位置に対応することになります.
しかし,元画像の座標は [0], [1], ... と整数値をとっているので,[1.5] なんて位置の画素値は得られません.
これを解決するには,何らかの方法で画素値を「補間」(「数値計算法」で学んだかも)する必要があります.中でも単純でよく用いられるのは,「バイリニア法(双線形補間法)」と呼ばれるものです.
というわけで,この方法について調べて,任意の縮小率を実現できるようにしてみよう.
ページ名: