Hatena::ブログ(Diary)

GIOの日記 RSSフィード

2009-04-14

[][]Lanczos拡縮アルゴリズムの実装

原理

画像の拡大縮小アルゴリズムはいくつか存在します

ニアレストネイバー

・バイリニア

バイキュービック

・Lanczos-2

・Lanczos-3

この中で理論上最も美しいとされているのはLanczos-3であり、漢はだまってこの方法を選ぶべきなのですが、いくつかの実装では正確な計算がされておらず、もったいない事になっています。

なので今回はできるだけ正確な高品質画像を目指して実装してみました。

rubyで。

原理的なものはコチラが詳しいです。こんなブログを見るよりお勧め

楽天が運営するポータルサイト : 【インフォシーク】Infoseek

前提

画像ピクセルデータを取得しないといけないのだが、画像デコードは別の話なので、また今度にします。

今回は無圧縮のPPM形式を使用。

そしてPPM画像を得るためにImageMagickを使った。

convert test.jpg test.ppm

実装

まずはPPMを読み書きする簡単なクラスがコチラ

image.rb

そして拡大縮小するコードがコチラ

lanczos.rb

※このコードは手続きをダラダラ書いただけな上に、とてつもなく遅いので実用性は皆無です。

出力画像

対象はコチラ

対象画像

40%の縮小結果がコレ

結果画像

f:id:gioext:20090414234705p:image

綺麗ですよねー?

最後に

遅すぎ。rubyでやるもんじゃない。

nunanuna 2009/04/17 17:24 ruby1.9で試しても15分くらいかかりました(笑
ところで、lanczos.rbですけど、
変数dbを初期化していないのでエラーになりますね。

gioextgioext 2009/04/17 18:18 dbは高速化しようとしてた名残ですね。。
情報ありがとうございますー消しときましたー
1.9でもそんなにかかりましたかw

tueda_wolftueda_wolf 2011/06/30 20:49 2つ質問があります。
1つ目:これはなぜ+0.5してるのでしょうか。必要とは思えません。
# ソース画像の対応する位置を取得
x0 = (w + 0.5) / scale
2つ目: これだとn=2のとき5回ループすると思うのですが4回が正解ですよね?(..ではなく...が正しい?)
# 影響する範囲を取得
x_range = ((x0 - n).to_i..(x0 + n).to_i)
以上教えていただければ幸いです。

natarixinatarixi 2011/12/23 00:17 >tueda_wolfさん
1つ目の質問に関して、私も完全に理解したわけではありませんが、
恐らく↓ここに書いてあることです。
http://www.maroon.dti.ne.jp/twist/4C616E637A6F73B4D8BFF4A4CBA4E8A4EBB2E8C1FCA4CEB3C8C2E7BDCCBEAE.html

すなわち、Lanczos補間で距離を考える際に、
例えば0px目の画素の位置をそのまま0とするのではなく、
中央値の0.5にする必要があるということではないでしょうか。
よって全てのx,yに0.5加算してるのだと思われます。

現在私は直感的にしか理解していないので
間違っているかもしれません。どなたかご指摘ください。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証