fine rotation アルゴリズムについては、暇があったらそのうち……。
画像拡大に比べて画像縮小は非常に簡単であり、 輝度の平均化だけで十分綺麗になるので、特筆すべきことはないでしょう。
[通常の拡大]はごく単純な線形補完によって拡大しています。 いわゆるバイリニア補完です。
[エッジシャープ化」は基本的にはバイリニア補完をしていますが、 エッジを検出し、 補完の計算をするときにエッジをまたがるピクセルの輝度に 1未満の係数を掛けることによって、 エッジを強調しています。これによって「ぼやけ」を抑制しています。 エッジ検出方法については4節を参照してください。
「ぼやけ」を抑制するには、 エッジ部分をスプライン関数によって補完してやるのが 理論上最も綺麗になるのですが、Qperコピーでは、それはやってません。 IrfanView などではやってます。 ただし、IrfanView (ver 3.21) は補完処理が不完全なようで (バグがある?) 、 画像の端の部分が綺麗にならなかったりします。
よく知られた3×3マスクのエッジ検出フィルタとして、 Prewittフィルタ、Sobelフィルタ、ラプラシアンフィルタなどがあります。 それぞれのフィルタ係数は以下のようになっています。
|
|
|
前者の2種類のフィルタは1次空間微分フィルタと呼ばれ、 横方向と縦方向の隣接しているピクセルの輝度の差分を算出する フィルタです (まあ一般的にはそういうことになっています) 。 画像のエッジの部分では、この差分の絶対値が大きな値になり、 それによってエッジが検出できる仕組みです。 つまり、画像のエッジの部分では、隣接しているピクセルの色が 例えば黒から白に、白から黒にと、急激に変化して、 輝度の差分が大きくなる (はずである) という考え方です。
これらのフィルタを使うと、横方向と縦方向のエッジの検出だけでなく、
エッジの方向が斜めになっているとき、
そのエッジの角度を計算することができます。
横方向のフィルタを通した結果の値を dx、
縦方向のフィルタを通した結果の値を dy とおくと、
一方、ラプラシアンフィルタは2次空間2回微分フィルタと呼ばれ、 輝度の差分の変化量が極端に大きくなっている部分を抽出する フィルタです (まあ一般的にはそういうことになっています) 。 このフィルタは、 輝度の差分を抽出すると同時に、(8個並んだ「1」の係数によって) 輝度の平均化も行っています。 そのため、1次空間微分フィルタに比べて、 ノイズ入りの画像や自然画像のエッジ検出に向いている、 ということになっています。 フィルタの数も1個だけで済むので、 エッジ検出にこのフィルタを使っているツールは インターネット上にも多く見受けられます。 しかしながら、1次空間微分フィルタのように、 斜め方向のエッジの角度を簡単に算出することはできません。 画像の輪郭線の様子を解析する上で、 エッジの角度は重要なファクターなので、 角度の計算ができるかどうかは重要なキーポイントなのです。 これは、ラプラシアンフィルタの大きな弱点であると言えます。
さて、Qperコピーで使用しているフィルタも 3×3マスクのフィルタなのですが、 上記のどれでもありません。 それは1次空間微分フィルタと2次空間2回微分フィルタの 特徴を兼ね備えたようなフィルタです。 フィルタ係数は以下のようになっています。
|
フィルタ係数を見ると、 なんとなく Sobelフィルタ とラプラシアンフィルタを組み合わせたような フィルタになっています。 もっと正確に言うと、Gaborフィルタを思い切り離散近似したフィルタ と言えるでしょう (Gaborフィルタ: cos関数と正規分布型関数を掛け合わせたもの。 局所コサイン級数の基底)。
なぜわざわざ従来の有名なフィルタを使わず、 こんなフィルタを使ったのかというと、 このフィルタには、従来のフィルタと比べて、以下のような利点があるからです。
斜め方向のエッジの角度が簡単に計算できることは 明白でしょう。 横方向と縦方向のフィルタがあるので、 1次空間微分フィルタと同様の方法で角度を計算すればよいのです。 では、ゼロ交差検出による、 より厳密なエッジ検出とはどういうことでしょうか? その説明のために、「エッジ」というものについて、 よく考えてみましょう。
前述のフィルタも、Qperコピーで使っているフィルタ (便宜上、「Qperフィルタ」と呼びましょう。 一般的な呼び方があるかどうか、私は知りません) も、 画像をフィルタリングすることによって、 エッジの部分だけを抜き出した画像を作ることができます。 しかし、「エッジ」とは、厳密には、どこの部分を指すのでしょうか? それは画像の輝度が大きく変化している「境目」のことであり、 もし「境目」から1ピクセルでもテクスチャの内側に入ってしまったら、 それは厳密には「エッジ」ではないでしょう。 また、下のように、1 0 1 0 ……というパターンが続いていたら、 その 1 と 0 の間はエッジとはいえないでしょう。 それは全体で1枚の灰色のテクスチャだと考えるべきです。
1 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 0 |
-4 | 4 | -4 | 4 | -4 |
4 | -4 | 4 | -4 | 4 |
-4 | 4 | -4 | 4 | -4 |
4 | -4 | 4 | -4 | 4 |
次に、下のようなパターンを見てみましょう。
0 | 0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 1 | 0 | -1 | 0 |
0 | 1 | 0 | -1 | 0 |
0 | 1 | 0 | -1 | 0 |
0 | 1 | 0 | -1 | 0 |
1 0 1 0 …… のパターン | 1 が1列に並んでいるパターン | ||||||||||||||||||||||||||||||||||||||||
|
|
さらに、上の結果で、輝度の符号がプラス (+4) とマイナス (-8) で切り替わっている 部分に注目してください。 この、プラスとマイナスの境目こそが、まさに、 テクスチャの「境目」すなわち「エッジ」を示していることが分かると思います。 つまり、 「フィルタを通した結果において、 プラスとマイナスの符号の切り替わり (これを『ゼロ交差』と言います) が発生している境目を『エッジ』とする」 これが、ゼロ交差検出です。
Qperフィルタを使っても、 ランダムパターンのように複雑な画像を使ったり、 意地悪なパターンを使ったりすると、 突然変なところにプラスまたはマイナスの輝度が現れたりします。 しかし、それらの結果から、 「ゼロ交差」が発生している部分だけを取り出すと、 概ね、エッジになっているように見えるような場所が残り、 視覚的にも納得がいくような結果が得られます。
著者: | |
作成日: | 2003年8月1日 |
最終更新日: | 2004年10月10日 |