すだちキャンパス

すだちキャンパス

やってみたこと、学んだことなどのメモ。

Pythonで画像処理〜ダウンサンプリングと補間〜

こんにちは。
Python画像処理授業シリーズの続きです。
↓前回の記事
kabos.hatenablog.jp

ダウンサンプリングとは

画像処理でのダウンサンプリングは、画像のサイズを小さくすることのようです。解像度を下げる操作らしいです。
次のように書くことでダウンサンプリングができます。

img = plt.imread('tree.jpg')[:, :, 0] / 255.
factor = 5
img_sub = img[::factor,::factor]

numpyでは、

X[start:end:step]

のように書くことでstepの数だけ飛ばしてスタートから終わりまで要素を抽出するそうです。ちなみに省略すると最初から最後まで、またstep数は1刻みになります。これをスライス操作というみたいです。

ゼロパディング

次に、飛ばした部分を0で補います。

sh = np.shape(img)
img_up = np.zeros(sh)
img[factor//2::factor, factor//2::factor] = img_sub

ちなみに、"//"は切り捨て除算です。

補間フィルタ

周囲のピクセルの値を用いて計算する事で、空白のピクセルの色などを計算するためのフィルタです。
主な補間方法のコードをメモしておきます。

最近接補間
kernel_nearest = np.ones((factor, factor))
img_nearest = nd.convolve(img_sub, kernel_nearest, mode='wrap')
線形補間
kernel_rect = np.zeros((2*factor + factor%2, 2*factor + factor%2))
kernel_rect[factor//2:3*factor//2, factor//2:3*factor//2] = 1.
kernel_linear = nd.convolve(kernel_rect, kernel_rect)
img_linear = nd.convolve(img_up, kernel_linear, mode='wrap')
sinc
kernel_sinc = np.fft.fft2(np.ones((int(sh[0]/factor/2), int(sh[1]/factor/2)))).real
img_sinc = nd.convolve(img_up, kernel_sinc)