【画像処理】最近傍補間法の原理・計算式

この記事では、画像を拡大・縮小・回転したときなどに利用する補間法の1つである「最近傍法補間法」の原理や計算方法についてまとめました。

最近傍法(Nearest neighbor)による画像拡大・縮小の仕組み

最近傍法(Nearest neighbor・ニアレストネイバー法)は、画像を拡大した際に最近傍にある画素をそのまま使う線形補間法です。
単純なアルゴリズムなので、他の補間法と比較して処理速度が速い反面、画質が劣化しやすくなります。

最近傍法によって拡大後の画素値を求める計算式は以下のとおりです。

計算式

拡大前の元画像をI、拡大率\alphaで拡大後の画像をI'とします。
このとき、拡大後の画素値は次の式で求めます。

(1)   \begin{eqnarray*} I'(x, y)=I([\frac{x}{\alpha}], [\frac{y}{\alpha}]) \end{eqnarray*}

[]は四捨五入を表しています。
つまり、「拡大後の座標÷拡大率」を四捨五入して得られた座標にある元画像の画素値をそのまま利用します。

【計算例】2×2のグレースケール画像を1.5倍に拡大する場合

次のような入力画像Iを1.5倍に拡大した画像I'について考えます。

(2)   \begin{eqnarray*} I= \left[ \begin{array}{ccccc} 50 & 100 \\ 150 & 200 \\ \end{array} \right] \end{eqnarray*}

画像Iのサイズは2×2なので1.5倍に拡大した画像I'は以下のように3×3のサイズとなります。

(3)   \begin{eqnarray*} I'= \left[ \begin{array}{ccccc} I'(0,0) & I'(1,0) & I'(2,0) \\ I'(0,1) & I'(1,1) & I'(2,1) \\ I'(0,2) & I'(1,2) & I'(2,2) \\ \end{array} \right] \end{eqnarray*}

拡大後の画素値を最近傍法で求まると次のようになります。

(4)   \begin{eqnarray*} I'(0,0)=I([\frac{0}{1.5}], [\frac{0}{1.5}])=I(0,0)=50 \\ I'(1,0)=I([\frac{1}{1.5}], [\frac{0}{1.5}])=I(1,0)=100 \\ I'(2,0)=I([\frac{2}{1.5}], [\frac{0}{1.5}])=I(1,0)=100 \\ I'(0,1)=I([\frac{0}{1.5}], [\frac{1}{1.5}])=I(0,1)=150 \\ I'(1,1)=I([\frac{1}{1.5}], [\frac{1}{1.5}])=I(1,1)=200 \\ I'(2,1)=I([\frac{2}{1.5}], [\frac{1}{1.5}])=I(1,1)=200 \\ I'(0,2)=I([\frac{0}{1.5}], [\frac{2}{1.5}])=I(0,1)=150 \\ I'(1,2)=I([\frac{1}{1.5}], [\frac{2}{1.5}])=I(1,1)=200 \\ I'(2,2)=I([\frac{2}{1.5}], [\frac{2}{1.5}])=I(1,1)=200 \\ \end{eqnarray*}

よってI'

(5)   \begin{eqnarray*} I= \left[ \begin{array}{ccccc} 50 & 100 & 100 \\ 150 & 200 & 200 \\ 150 & 200 & 200 \\ \end{array} \right] \end{eqnarray*}

となります。

【注意】
拡大率によっては四捨五入した際に存在しない座標になる場合もあります。
その場合、近傍にある利用可能な画素で代用するなど対策を考える必要があります。

関連ページ

PythonとOpenCVを用いて最近傍補間法を実装する方法について以下ページで解説しています。

【Python/OpenCV】cv2.resizeの最近傍補間法(cv2.INTER_NEAREST)で画像の拡大
Python版OpenCVのcv2.resizeで最近傍補間法(cv2.INTER_NEAREST)を実装し、画像サイズを変更する方法をソースコード付きで解説します。

PythonとOpenCVを用いた画像処理全般については以下ページで解説しています。

【Python版OpenCV入門】画像処理の基礎〜応用例までサンプルコード付きで徹底解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。

他の画像処理アルゴリズムについては、以下ページでまとめています。

【画像処理入門】アルゴリズム&プログラミング
この記事では、画像処理における基本的なアルゴリズムとその実装例(プログラム)についてまとめました。

コメント