拡大縮小方法

Share
Windowsの場合、APIを利用することにより画像の表示時に拡大縮小をOSにやらせることができます。しかし、これだと、どのようなアルゴリズムで拡大縮小を行っているのかわかりませんし、異なる拡大縮小アルゴリズムを使うことができません(もっとも普通はあまりこういう需要そのものがないとは思います)。そのため、このプログラムでは拡大縮小を独自に実装して処理するようにしています。以下では、どのようなアルゴリズムで拡大縮小を行っているかについて説明しています。

線形補間(bi-linear)

画像の拡大縮小の基本的な考え方はわりあいと簡単なものです。下記に拡大時の考え方を図示したものを示します。


拡大縮小の概念図

 

まず、拡大後の画像のピクセル位置(i, j)に対して、対応する元画像の位置を求めます。これは拡大倍率を考慮すれば簡単に求められます。当然、対応する元画像のほうが小さいので、対応する位置は、きれいな整数ではなく実数値になります。この小数部分がちょうど画素間の大きさ1に対する割合になります。そうするとこれを使って両側の画素の重み付け平均を求めればよさそうなことがわかります。
たとえば、元画像の画素値を v(x, y)と表すとして、上図のy位置に対して、横方向のみでの重み付け平均を求めると、

横方向の重み付け平均

となります。これと同じことを縦方向も考慮して周囲4点の重み付け平均を求めると、

重み付け平均

となります。これが拡大後の画素位置に対する画素値になります。

あとは、拡大後の画素位置全てに対してこの計算を行えばよいことになります。また、縮小の場合の考え方も基本的には同じになります。さらに、カラー画像のように、R,G,B値があれば、それぞれに対して上記の拡大・縮小後の画素値を計算するのが最も手っ取り早いと思います。

拡大縮小の方法には他にも、最近傍法(サンプリングになります)や3点補間法などもあります。興味のある方は参考の資料などをご覧ください。

参考

[1] 田村秀行、コンピュータ画像処理、オーム社、2002