1. ホーム
  2. python

[解決済み] 画像を表すnumpy配列のリサンプリング

2023-06-17 11:41:15

質問

私は新しいサイズで画像データを表すnumpy配列を再サンプリングする方法を探しています、できれば補間方法(直近、バイリニアなど)を選択できるようにしてください。私はそこにあることを知っています。

scipy.misc.imresize

は、PILのリサイズ関数をラップすることで、まさにこれを実現しています。唯一の問題は、PILを使用しているため、numpy配列は画像フォーマットに準拠する必要があり、最大4つのquot;color"チャンネルを与えてしまうことです。

私は、任意の数の"color"チャンネルを持つ、任意の画像のサイズを変更できるようにしたいです。私は、scipy/numpyでこれを行うための簡単な方法があるかどうか、または私が自分でロールバックする必要があるかどうか疑問に思っていました。

私は自分自身を作り上げる方法について2つのアイデアを持っています。

  • を実行する関数 scipy.misc.imresize を各チャンネルで個別に実行する関数です。
  • を使用して自分で作成します。 scipy.ndimage.interpolation.affine_transform

最初のものは大きなデータではおそらく遅いでしょうし、2番目のものはスプライン以外の補間方法を提供していないようです。

どのように解決するのですか?

あなたの記述に基づくと、あなたは scipy.ndimage.zoom .

バイリニア補間の場合は order=1 であり、最も近いものは order=0 で、cubic はデフォルトです ( order=3 ).

zoom は、特に新しい解像度に再サンプリングしたい規則正しい格子状のデータのためのものです。

簡単な例として

import numpy as np
import scipy.ndimage

x = np.arange(9).reshape(3,3)

print 'Original array:'
print x

print 'Resampled by a factor of 2 with nearest interpolation:'
print scipy.ndimage.zoom(x, 2, order=0)


print 'Resampled by a factor of 2 with bilinear interpolation:'
print scipy.ndimage.zoom(x, 2, order=1)


print 'Resampled by a factor of 2 with cubic interpolation:'
print scipy.ndimage.zoom(x, 2, order=3)

そして、その結果。

Original array:
[[0 1 2]
 [3 4 5]
 [6 7 8]]
Resampled by a factor of 2 with nearest interpolation:
[[0 0 1 1 2 2]
 [0 0 1 1 2 2]
 [3 3 4 4 5 5]
 [3 3 4 4 5 5]
 [6 6 7 7 8 8]
 [6 6 7 7 8 8]]
Resampled by a factor of 2 with bilinear interpolation:
[[0 0 1 1 2 2]
 [1 2 2 2 3 3]
 [2 3 3 4 4 4]
 [4 4 4 5 5 6]
 [5 5 6 6 6 7]
 [6 6 7 7 8 8]]
Resampled by a factor of 2 with cubic interpolation:
[[0 0 1 1 2 2]
 [1 1 1 2 2 3]
 [2 2 3 3 4 4]
 [4 4 5 5 6 6]
 [5 6 6 7 7 7]
 [6 6 7 7 8 8]]


編集します。 Matt S. が指摘したように、マルチバンド画像のズームにはいくつかの注意点があります。以下の部分を私の 以前の回答 :

ズームは、3D(およびnD)配列でも機能します。ただし、例えば2倍でズームした場合、以下のような方向にズームすることになるので注意が必要です。 すべて 軸に沿ってズームします。

data = np.arange(27).reshape(3,3,3)
print 'Original:\n', data
print 'Zoomed by 2x gives an array of shape:', ndimage.zoom(data, 2).shape

という結果が得られます。

Original:
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]

 [[18 19 20]
  [21 22 23]
  [24 25 26]]]
Zoomed by 2x gives an array of shape: (6, 6, 6)

マルチバンド画像の場合、通常は "z" 軸に沿って補間し、新しいバンドを作成することはしたくありません。

ズームしたい3バンドのRGB画像のようなものがある場合、ズームファクターとしてタプルのシーケンスを指定することによって、これを行うことができます。

print 'Zoomed by 2x along the last two axes:'
print ndimage.zoom(data, (1, 2, 2))

という結果が得られます。

Zoomed by 2x along the last two axes:
[[[ 0  0  1  1  2  2]
  [ 1  1  1  2  2  3]
  [ 2  2  3  3  4  4]
  [ 4  4  5  5  6  6]
  [ 5  6  6  7  7  7]
  [ 6  6  7  7  8  8]]

 [[ 9  9 10 10 11 11]
  [10 10 10 11 11 12]
  [11 11 12 12 13 13]
  [13 13 14 14 15 15]
  [14 15 15 16 16 16]
  [15 15 16 16 17 17]]

 [[18 18 19 19 20 20]
  [19 19 19 20 20 21]
  [20 20 21 21 22 22]
  [22 22 23 23 24 24]
  [23 24 24 25 25 25]
  [24 24 25 25 26 26]]]