はじめに
この記事の続きです。
- エッジ判定型超解像アルゴリズム FCBI (Fast curvature based interpolation) 後編:アルゴリズム詳解
弱点の部分を改造したら、なんとなく良い結果を得られたので、その説明です。
弱点
勾配のないフラットな塗りに、右下向きの width:1 の線があると補間が崩れます。
テスト画像 | ドット拡大表示 |
---|---|
改造 take1
v1 と v2 の値が近い時は、単純な Bi-Linear にように4隅を混ぜた方がマシになります。
- https://github.com/yoya/image.js/blob/v1.3/fcbi.js#L241
if (Math.abs(v1 - v2) < TM) { // yoya custom var rgba = meanRGBA(meanRGBA(rgba1, rgba4), meanRGBA(rgba2, rgba3)); } else { if (v1 < v2) { var rgba = meanRGBA(rgba1, rgba4); } else { var rgba = meanRGBA(rgba2, rgba3); } }
結果。
テスト画像 | ドット拡大表示 |
---|---|
実際のイラストでも線が途切れる箇所が減っています。
元画像 | オリジナル | 改造版 |
---|---|---|
改造 take2
エッジ判定になっても v1(1-4) と v2(2-3) の差がない時は非エッジとして処理する改造をしたら、いい感じになりました。
-
https://github.com/yoya/image.js/blob/v1.3/fcbi.js#L241
if (((v1 < TM) && (v2 < TM) && (Math.abs(p1 - p2) < TM)) || (Math.abs(v1 - v2) < TM)) { // yoya custom if (edgeMode) { var rgba = [0, 128, 0, 255]; // green } else { // 非エッジの処理
-
結果 (TM:15)
テスト画像 ドット拡大表示
実際のイラストでも線が途切れる箇所が減っています。
オリジナル | 改造 take1 | 改造 take2 |
---|---|---|
まとめ
- イラストだとそのままのアルゴリズムより、少し弄って使った方が良いみたいです
- 非エッジとして処理をしてもエッジが残るように補間されるので、エッジ処理と分けるのは恐らく高速化の為では
- 分岐がもったいない環境だと、全部非エッジとして処理した方が速いかも。
- 本家の CUDA 実装がそうなってます。輝度が(R+G+B)/3という雑な実装ですが