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)
参考記事
[Python]Numpyの参照、抽出、結合 - Qiita
Numpyで取り扱う画像をダウンサンプリングする際のスマートな記述方法 - Qiita
https://note.nkmk.me/python-numpy-insert/
numpy.insert — NumPy v1.15 Manual
画像リサイズのうんちく (補間フィルタ) - Qiita
C言語で画像の拡大縮小(線形補間編) | だえうホームページ
{biOps} 画像補間法 - Qiita
http://hil.t.u-tokyo.ac.jp/~kameoka/sp2/SP13_03.pdf
http://www.cfme.chiba-u.jp/~haneishi/class/digitalgazo/5Interpolation.pdf