« 画像の拡大「Bilinear法」 | トップページ | 画像の拡大「Lanczos法」 »

画像の拡大「Bicubic法」


リンク
画像の変換(目次ページ)
『拡大・縮小』関連
画像の縮小
画像の拡大「Nearest Neighbor法」
画像の拡大「Bilinear法」
・画像の拡大「Bicubic法」
画像の拡大「Lanczos法」
画像の拡大-距離計算に関する考察
超解像
【バイキュービック法 (Bicubic 法)】
バイリニア法は隣接する4点から線形的に中間値を求めているだけなので、
エッジが立っている場所でのガタガタ感が否めません。
バイキュービック法
もう少し滑らかに中間値を求めてやればいいんじゃね?
という発想からきているのだと思います。

そのためには隣接する点だけではなく、その先の点をも考慮する必要があります。
つまり、d6, d7 の値を決めるために
バイリニア法 では s2, s3 の値を参照しました。
それよりも滑らかにしようと思うと、
s2, s3 に加え、s1, s4 の値も参照する必要があります。

下図で言うと赤い点のまわりの2x2点を一回り大きくして
4x4の青い点を参照し、そこから中間値を求めます。


計算方法は次の通りです。
まず、x方向の距離(dx1~dx4)とy方向の距離(dy1~dy4)を求めます。


次に縦方向、横方向それぞれの重みづけ(=ウェイト,weight)を求めます。
(wx1~wx4, wy1~wy4)


バイキュービック法でのウェイト計算式は次の通りです。
bicubic_weight( d ) =   1 - 2*d2 + d3(d ≦ 1.0 )
4 - 8*d + 5*d2 - d3  (1.0 ≦ d ≦ 2.0 )
0(d ≧ 2.0 )

たとえば d = 0.1 の場合は
bicubic_weight( 0.1 ) = 1 - 2*0.12 + 0.13 = 0.981

式に3乗が含まれているので Cubic (キュービック) と言うらしいです。

このウェイト式はグラフで表すと下記のようになります。

このようにしてウェイト値(wx1~wx4, wy1~wy4)が求まったら、
4x4の各点に対して
(ピクセル値) * wx * wy
を計算して、それを合計します。
この合計値をウェイトの合計値で割ったものが求める中間値です。

(求める中間値) =
4 4 4 4
Σ Σ ((ピクセルm,k値)* wxm * wyk)/ Σ Σ (wxm * wyk
m=1 k=1 m=1 k=1

(160x120 → 384x256)
《元画像データ》

《Bicubic》


同様の考え方をすれば、「Nearest Neighbor 法」や「バイリニア法」も
ウェイトの考え方ができます。

Nearest Neighbor 法のウェイト計算式。
nearest_neighbor_weight( d ) =   1  (d ≦ 0.5 )
0( other )

バイリニア法のウェイト計算式。
bilinear_weight( d ) =   1 - d  (d ≦ 1.0 )
0( other )


「一種のフィルタ」と考える事ができますね。
フィルタを変える事でギザギザが無くなったり、滑らかになったりします。
「スムーズ・フィルタ」「エッジ強調フィルタ」と思ってよいかもしれません。

|

« 画像の拡大「Bilinear法」 | トップページ | 画像の拡大「Lanczos法」 »

画像フォーマット」カテゴリの記事

コメント

Bicubic法の画像の拡大で参考にさせて頂きました。ウェイト計算式が距離より3つ示されている部分で ①(d ≦ 1.0 ) ②(1.0 ≦ d ≦ 2.0 ) ③(d ≧ 2.0 )とあると思いますがdが1.0の場合この条件だと①と②両方に該当するので①は(d < 1.0)ではないでしょうか?

投稿: | 2013年5月 6日 (月) 01時17分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/167561/29409755

この記事へのトラックバック一覧です: 画像の拡大「Bicubic法」:

« 画像の拡大「Bilinear法」 | トップページ | 画像の拡大「Lanczos法」 »