アップスケーリング

http://en.wikipedia.org/wiki/Pixel_art_scaling_algorithms
id:mokehehe氏からすばらしい情報を頂いたので後でちゃんと読む。


サンプルとかめっちゃ綺麗にアップスケールされててすげぇ!とか思った。


なんか○が角ばってるのが若干気になるかな。


http://web.archive.org/web/20070703061942/www.hiend3d.com/hq3x.html

EPX

   A    --\ 1 2
 C P B  --/ 3 4
   D 
  IF C==A => 1=A
  IF A==B => 2=B
  IF B==D => 4=D
  IF D==C => 3=C
  IF of A, B, C, D, 3 or more are identical: 1=P,2=P,3=P,4=P


取り合えず一番簡単そうなEPX/Scale2x/AdvMAME2xを実装してみた。
1234がどこを表すのか良くわからなかったが、取り合えず2x2で拡大したときの4pixelの矩形のことを言ってるんだと思ってるんだけどどうなんだろう。
ABCDって元のサイズでの上下左右のピクセルでいいんだよね?

なんかドットが丸くなる気がする。
これが正しいのかすら不明だがw

2xSaI

なんかどうやってもEPXより汚い。
サンプルの実行ファイルでコンバートしてもwikiにあるような感じにはならなかった。
ボケた画像に対して2xSaIを行うと綺麗になるのかな。

   E F
 G A B I
 H C D J
   K L

こういう感じでサンプリングしてきて閾値でlerpしてるっぽいんだけど、
なんか単にエッジがボケるだけのような気がする。サンプリング数も多いしシェーダでリアルタイムってわけにはいかないかな。


と思ったら元の画像が単に2ドット単位の絵になってしまってたのが原因だったorz
わりと綺麗にでるね。

アプコン

http://d.hatena.ne.jp/suzume_r/20090802
ここの文章を参考に取り合えずエッジ抽出してスプラインにするところまでをやってみた。
エッジトレースしてスプライン点郡にする時にしくってるところがあるけど途中なので気にしない。


http://takamatsu.cool.ne.jp/tattyu/p55/upscan/


あと抽出したエッジをそのまま点郡にするとドットのエイリアスがそのまま出てしまう。
エイリアスを消すためにベクターデータにするのに元のベクターデータ自体がエイリアスの情報を持ってたら意味ないよなー。
取り合えずいい方法が思いつかなかったので1ドット飛ばしてみた。
3ドットぐらい飛ばすとかなり滑らかにはなるんだけどなんか違うような気もするw


http://takamatsu.cool.ne.jp/tattyu/p55/approximateline/
この方法だとドットのエイリアスは消えないしなぁ。
どうすればいんだべか。


あと点郡そのまま使わないで一旦Lerpで補間した中間値を取るようにしてある。


元のURLだと色差成分のエッジ抽出+ラスタライズしてるけど、
リアルタイムでやろうと思ったらもう一工夫しないと駄目なんだろうなぁ。


ちなみに補間に3次BSplineじゃなくてCatmullRomを使ってるのは周波数成分が高い場合3次BSplineよりも振動が少なかったからです。

3次Bスプラインの近似

Bスプラインの実用的なソースは以下の2つ
http://www5d.biglobe.ne.jp/~stssk/maze/spline.html
http://d.hatena.ne.jp/suzume_r/20090801


普通は3次式の係数を求めるために全点郡での行列式を解くのだけれど、制御点の数が増えればそれだけ初期化の時間と係数の分のメモリを取ってしまう。
さらに制御点を移動させようと思うとまた最初から連立方程式を解かなきゃいけなくなってしまう。制御点少ないならまだいいけど。

久しぶりにP5で実装してみた。
Proce55ingがいつの間にかBetaが取れて普通の1.0になってたのに驚いたw



http://takamatsu.cool.ne.jp/tattyu/p55/BSpline

P5アプレット上では全然見えないけど黒い点が毎回計算しなおしたもの。


実際に再初期化してみるとわかるが、大きく影響する制御点はせいぜい前後3点ずつなのでそこだけ解きなおすようにしてみた。
水色の点がそう。ぱっと見る限り概ね問題はないっぽい。


だったら制御点全部から行列式を作ったり係数を保持しなくても、毎回欲しい位置の前後3点を解くのでもある程度近似できんじゃねーのと思って試してみたのが白い点。


ちなみに精度とか気にしないんであれば前後2点程度でも十分使い物になるみたいだね。

Shorのアルゴリズムとサマーウォーズ

サマーウォーズ見てきた。内容はなんかリア充から見たIT土方SFというか。
割とネタばれです。サマーウォーズ見てない人は見ないほうがいいかも。




内容はともかく主人公が素因数分解してる風なシーンがあったのがすごく気になった。
つか、最初の方の電車の中で彼が読んでる本がShorの素因数分解の本というのがいかにもな前フリだが。


前フリがあったにも関わらず、手計算で2056桁もある数を素因数していてびっくりした。
暗算して解いてるシーンもあったし。
素因数分解ってNP完全じゃなかったっけ。
しかもそんな彼ですら数学オリンピック代表漏れとか。
超人オリンピックですね!


上にはどんだけすごい人がいるんだというかそもそも有限時間で人間の手で解けちゃうとかそんな危ないもんが鍵になってるのかと思うと不安になる。
まぁ映画だから誇張された表現だと思いたいw


ということでShorのアルゴリズムを調べる。
http://blogs.yahoo.co.jp/cat_falcon/10371508.html
周期をみつけて1/2周期乗±1したのが解(の一部)ってことか!
わかりません。元のXはなんですかとかgcdってなんですかとか。


サマーウォーズに出てきたネタは実現可能そうな面白そうなのから、
そんなんぜってー無理だろ的な物まで織り交ぜてあるので
かたっぱしからJavaScriptとかP55あたりで再現してみたらおもしろいかも。