octave で画像処理 - HD か SD か †やっとこさスカパー!HD に移行でき,HD 放送を楽しんでいる日々である. が,いろいろググってみると
らしい. blu-ray とか売ることを考えて,テレビ放送では敢えて画質を落としているのだろう. ググっている過程で,あに瓶というサイトを見つけた. 色んなアニメ番組の画面をキャプチャして2次元 FFT にかけていて,なかなか興味深い. というわけで,似たようなことを octave でもやってみる. sfline †2次元 FFT だけなら手持ちの関数だけでもできるのだけど,空間周波数領域の画像を読みやすくするために,こんな関数を作ってみた. 空間周波数画像で,指定された縦解像度(=走査線数)のナイキスト周波数に横線を入れる関数. つかいかたは y = sfline ( x, 1, 480 );
function y = sfline ( x, p, v ) if ndims(x) != 3 return; endif y = x; v1 = floor ( ( v + 1 )/2.0 + 0.5 ); v2 = rows( y ) - v1 + 1; y ( v1, :, p ) = ones(1, columns(y)); y ( v2, :, p ) = ones(1, columns(y)); endfunction こんな感じ. では解析 †octave:135> [ x m a ] = imread ( '/home/imai/mpegconv/kanon.bmp' ); # キャプチャ画像を読み込んで octave:136> x = double ( x ) / 255.0; # 型変換 octave:137> y = fft2 ( x ); # 2次元 FFT にかけて octave:138> yn = abs(y)/max(max(max(abs(y)))); # 最大値で正規化 octave:139> yn = sfline ( yn, 1, 480 ); # 走査線 480 本のところに赤線 octave:140> yn = sfline ( yn, 2, 720 ); # 走査線 720 本のところに緑線 octave:141> ys = swap2 ( yn ); # 上下左右を入れ替えて, # 中心が DC 成分を表すようにする octave:142> imshow ( ys * 50000 ); # 空間周波数領域の表示 octave:143> imwrite ( ys * 50000, 'kanon.png' ); # 空間周波数領域画像の保存 読み込ませた元画像は 1920 x 1080 のサイズのもので,2次元 FFT をかけたものも 1920 x 1080 のサイズとなる. しかし,空間周波数領域の上端,右端は,それぞれ1画素単位のしましまである. このままでは横軸と縦軸のスケールが異なることになる. つまり,1920 x 1080 の空間周波数領域画像は,縦横比 1:1 に直してやれば,横軸と縦軸の原点からの距離と解像度が一致することになる. もちろん,octave 上で処理してもいいんだけど(さんざんやってきましたね),今回は手抜きして,外部コマンドを利用. $ pngtopnm kanon.png | pnmscale -xsize 1080 -ysize 1080 | cjpeg -quality 100 > kanon.jpg Kanon ( AT-X ) †AT-X で放送されている Kanon. 放送当時は「HD マスター」ということで話題になったらしい. スペクトルは赤のラインの内側に集まっており,SD 画質であることがわかる. 評判をぐぐってみると,「実はコンポジットなのではないか」という話もある. 見てみると,実際に色ずれが起きてるシーンもあり,その推測は正しいようだ. WORKING!! ( AT-X ) †これも SD 相当. 迷い猫オーバーラン! ( アニマックス ) †ちょっと例が良くなかったようだけど,よーく見ると SD の赤線を越えたスペクトルが存在する. 走査線 720 本あたりなのかなぁ. デュラララ!! ( アニマックス ) †こちらは明らかに SD を越えるスペクトルがあることが分かる. 閃光のナイトレイド ( AT-X ) †これも SD を越えてますね. |