日記/2010-04-10/octave で画像処理 - 画像の拡大 その 1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
] [
リンク元
]
開始行:
* octave で画像処理 - 画像の拡大 その 1 [#eeab8c1e]
そろそろ実際に画像をいじってみよう.
** 題材 [#t382f589]
今までの画像はサイズが大きくて処理に時間がかかるので,一...
#ref(gaishi.jpg,center)
** 補間無しでの拡大 [#s624e78a]
まず,補間をしないで画像を拡大してみます.
と,いきなり言われても「え?」となると思うので,手順を下...
拡大前 拡大後
□ → □■
■■
元々の画素1つに対し,縦横に(倍率-1)個の黒画素を追加し...
これだけです.
** 関数 [#za6d61cd]
適当な関数が見つからなかったので,黒画素を追加して拡大す...
magnify.m という名前で保存してください.
function y = magnify ( x, m )
if ndims(x) != 3
return;
endif
y ( m*rows(x), m*columns(x), size(x,3) ) = 0;
for d = 1:size(x,3)
for r = 1:rows(x)
mr = m*r;
for c = 1:columns(x)
y ( mr, m*c, d ) = x ( r, c, d );
endfor
endfor
endfor
endfunction
この拡大処理は行列の積で表現することも可能なはずで,おそ...
** 拡大してみる [#r3367db8]
octave:1> [ x m a ] = imread ( 'gaishi.jpg' ); # 画像を...
octave:2> x = double ( x ) /255; # double...
octave:3> imshow ( x ); # 元画像...
octave:4> x2 = magnify ( x, 2 ); # 2倍に...
octave:5> imshow ( x2 ); # 拡大画...
拡大画像の表示が妙なことになっていると思います.
imshow() の表示はあまり綺麗にスケーリングしてくれないよう...
あくまでも「プレビュー」だと思ったほうがいいでしょう.
というわけで,拡大した画像をファイルに保存します.
octave:6> imwrite ( x2, 'gaishi_x2.jpg', 'jpg' );
別の画像表示プログラムで表示させると,ちゃんと画素が水増...
#ref(gaishi_x2.jpg,center)
** 空間周波数領域では [#o8f3d882]
ここでおもむろに,元画像と水増し画像をそれぞれ 2 次元 FFT...
octave:6> y = fft2 ( x );
octave:7> y2 = fft2 ( x2 );
空間周波数領域でのスペクトルを表示させてみます.
前に作った swap2() を使っているので,中央が周波数 0 の点...
octave:8> imshow (abs(swap2(y/100)));
#ref(gaishi_f.jpg,center)
octave:9> imshow (abs(swap2(y2/100)));
#ref(gaishi_x2_f.jpg,center)
水増し画像のスペクトルは,元画像のスペクトルの周囲に余計...
よく見ると,元画像のスペクトルと同じもののようです.
これは「折り返し歪み」とか「エイリアジング」とか呼ばれて...
こんなに高い空間周波数成分は元画像には含まれていないので...
終了行:
* octave で画像処理 - 画像の拡大 その 1 [#eeab8c1e]
そろそろ実際に画像をいじってみよう.
** 題材 [#t382f589]
今までの画像はサイズが大きくて処理に時間がかかるので,一...
#ref(gaishi.jpg,center)
** 補間無しでの拡大 [#s624e78a]
まず,補間をしないで画像を拡大してみます.
と,いきなり言われても「え?」となると思うので,手順を下...
拡大前 拡大後
□ → □■
■■
元々の画素1つに対し,縦横に(倍率-1)個の黒画素を追加し...
これだけです.
** 関数 [#za6d61cd]
適当な関数が見つからなかったので,黒画素を追加して拡大す...
magnify.m という名前で保存してください.
function y = magnify ( x, m )
if ndims(x) != 3
return;
endif
y ( m*rows(x), m*columns(x), size(x,3) ) = 0;
for d = 1:size(x,3)
for r = 1:rows(x)
mr = m*r;
for c = 1:columns(x)
y ( mr, m*c, d ) = x ( r, c, d );
endfor
endfor
endfor
endfunction
この拡大処理は行列の積で表現することも可能なはずで,おそ...
** 拡大してみる [#r3367db8]
octave:1> [ x m a ] = imread ( 'gaishi.jpg' ); # 画像を...
octave:2> x = double ( x ) /255; # double...
octave:3> imshow ( x ); # 元画像...
octave:4> x2 = magnify ( x, 2 ); # 2倍に...
octave:5> imshow ( x2 ); # 拡大画...
拡大画像の表示が妙なことになっていると思います.
imshow() の表示はあまり綺麗にスケーリングしてくれないよう...
あくまでも「プレビュー」だと思ったほうがいいでしょう.
というわけで,拡大した画像をファイルに保存します.
octave:6> imwrite ( x2, 'gaishi_x2.jpg', 'jpg' );
別の画像表示プログラムで表示させると,ちゃんと画素が水増...
#ref(gaishi_x2.jpg,center)
** 空間周波数領域では [#o8f3d882]
ここでおもむろに,元画像と水増し画像をそれぞれ 2 次元 FFT...
octave:6> y = fft2 ( x );
octave:7> y2 = fft2 ( x2 );
空間周波数領域でのスペクトルを表示させてみます.
前に作った swap2() を使っているので,中央が周波数 0 の点...
octave:8> imshow (abs(swap2(y/100)));
#ref(gaishi_f.jpg,center)
octave:9> imshow (abs(swap2(y2/100)));
#ref(gaishi_x2_f.jpg,center)
水増し画像のスペクトルは,元画像のスペクトルの周囲に余計...
よく見ると,元画像のスペクトルと同じもののようです.
これは「折り返し歪み」とか「エイリアジング」とか呼ばれて...
こんなに高い空間周波数成分は元画像には含まれていないので...
ページ名:
-->