Lanczos法で画像の拡大してみた
Lanczos法で画像の拡大
前回のバイリニア法とは重みの付け方が違う
sinc関数ってのを使っているらしい
sinc関数 - Wikipedia普通科という文系の高校だったせいか記憶にない…この前の「分散」と同様に習っていないのかも
https://ja.wikipedia.org/wiki/Sinc%E9%96%A2%E6%95%B0
内挿 - Wikipedia
https://ja.wikipedia.org/wiki/%E5%86%85%E6%8C%BF
説明を読んでも微塵も理解できないゾ
sinc関数にある数値xを渡した時は
sinc(x) = sin(π*x)/(π*x)
こうで、sinは三角関数の、πはパイで、3.14…
これを使って補間するみたい
C#で書くと
//窓関数…?
private double Sinc(double x)
{
return Math.Sin(Math.PI * x) / (Math.PI * x);
}
参照するピクセルの範囲がNで距離がdのときの重みは
- 距離が0なら 1
- 距離dがNより遠ければ 0
- それ以外の時は sinc(d)*sinc(d/N)
これで計算すればいいみたい
C#で書くと
//Lanczosの重み取得
private double GetLanczosWeitgt(double d, int n)
{
if (d == 0) { return 1; }
if (d > n) { return 0; }
return Sinc(d) * Sinc(d / n);
}
距離0.1ごとの重みをエクセルでグラフにすると
範囲が増えるほどきれいに拡大できるけど計算が大変になるので
よく使われるのは2と3
バイキュービックと比べてみる
よく似ている
バイキュービックの-0.5とLanczos2
バイキュービックの-1.0とLanczos3
はほとんど線が重なっている
これを2倍に拡大
Lanczos2
Lanczos3
バイリニア
Lanczos5
参照範囲が一番広いLanczos5は変な輪郭が出ている、広ければいいってものでもないのかなあ
これを2.6倍
Lanczos2
Lanczos5
Lanczos2よりきれい…かなあ
バイリニア
ぼやけるけどバイリニアも悪くないなあ
前回の
バイキュービックは書き方が良くなかったのか
拡大するとブロック状になってしまったけど
Lanczosは大丈夫みたい
これを2倍
Lanczos2
前回の
Lanczos2
バイリニア
Lanczos2で4倍
PixelFormatがgray8のBitmapSourceをLanczos2で拡大
これで大体あっているんだけど
正確に拡大しようとするとピクセルの幅も考える必要があるらしい、さらに
Lanczos関数による画像の拡大縮小縮小の処理は拡大とは違うとか、画像の端の処理は鏡像?とかいう処理がいいとか
http://www.maroon.dti.ne.jp/twist/4C616E637A6F73B4D8BFF4A4CBA4E8A4EBB2E8C1FCA4CEB3C8C2E7BDCCBEAE.html
画像の拡大縮小処理ってのは想像していたよりかなり難しいのがわかった
前回までのバイリニア法やバイキュービックでは何も考えずに縮小処理をしていたのでほとんど差が出なかったみたい、しかも間違っていたと
縮小処理は難しすぎたので諦めて、今回は拡大だけの結果を載せた
参照したところ
Lanczos(ランチョス法)【ついでにSpline36】
https://www.rainorshine.asia/2015/10/12/post2602.html
画像処理 - HexeRein
http://www7a.biglobe.ne.jp/~fairytale/article/program/graphics.html#lanczos
画像の拡大「Lanczos法」: koujinz blog
http://koujinz.cocolog-nifty.com/blog/2009/05/lanczos-76aa.html
コード
アプリ
関連記事
続きは3年後の2021/04/27
前回、2018/4/20
バイキュービック法で画像の拡大してみようとしたけど、難しすぎた ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15469745.html