octave で画像処理 - 型 †octave の変数の型には「整数型」「実数型」があって,変数の型によって挙動が異なる関数がかなりあります. imread() †今までに出てきた画像を読み込む関数ですが octave:1> [ x m a ] = imread ('DSCF0135.JPG' ); 実は左辺値は整数型で帰ってきています. isinteger() は変数が整数型かどうか検査する関数です. octave:8> isinteger ( x ) ans = 1 double() †整数型から実数型へ変換するには double() という関数を使います. octave:9> xd = double ( x ); octave:10> isinteger ( xd ) ans = 0 異なる型どうしの演算 †ためしに整数型と実数型の計算をさせてみます. octave:14> xx = 1.3 + x; octave:17> isinteger ( xx ) ans = 1 計算結果も整数型のままですね. C 言語風の型昇格とは異なるようです. これだとムチャクチャなことになりそうなので,画像を読み込んだあとは問答無用で実数型に型変換したほうが良さそうです. imshow() の挙動 †imshow() は,引数が整数型か実数型かで挙動が変わります. 先ほどの実数型の変数を画像として表示させると 完全にサチってます. x のほうは 8 bit 整数値(x RGB 3プレーン)で,0〜255 で 暗〜明 のレベルを表しています. が,実数型の場合,0 〜 1.0 で暗〜明レベルを表すようです. octave:12> imshow ( xd / 255 ); で,画像がマトモに表示されましたね. 実は †こんな風に FFT->逆FFT を実行して,元に戻ってるはずの画像を表示させても真っ白けだったので「何なのだろう」としばらく悩んでいたのでした. octave:19> [ x m a ] = imread ( 'DSCF0135.JPG' ); octave:20> y = fft2 ( x ); octave:21> x2 = ifft2 ( y ); octave:22> imshow ( x2 ); こんな風に,最初に輝度値 0 〜 1 の実数型に正規化しておけば問題はありません. octave:24> [ x m a ] = imread ( 'DSCF0135.JPG' ); octave:25> xd = double ( x ) / 255; octave:26> y = fft2 ( xd ); octave:27> xx = ifft2 ( y ); octave:28> imshow ( xx ); |