Python ダウンサンプル配列

Muhammad Maisam Abbas 2023年10月10日
  1. Python3 でスライスを使用して配列をダウンサンプリングする
  2. Python で zoom() 関数を使用して配列をダウンサンプリングする
  3. Python で block_reduce() 関数を使用して配列をダウンサンプリングする
Python ダウンサンプル配列

このチュートリアルでは、Python で画像をダウンサンプリングする方法について説明します。

Python3 でスライスを使用して配列をダウンサンプリングする

Python では、画像は多次元配列です。 グレースケール画像は 2 次元配列で表され、カラーまたは RGB 画像は 3 次元配列で表されます。

簡単にするために、このチュートリアルでは 2 次元のグレースケール イメージのサイズを縮小することに焦点を当てますが、ここで説明する方法を使用して RGB イメージのサイズを縮小することもできます。

最初の方法は非常に簡単です。 スライスでは、名前が示すように、全体的な大きな画像から小さなスライスを取得します。

画像をスライスするときに、次の値を取る前にいくつの値をスキップするかを指定するステップ パラメータを指定できます。 デフォルトでは、この値は 1 に設定されています。

次のコード例は、配列スライスを使用して画像をダウンサンプリングする方法を示しています。

import numpy as np

b = np.arange(0, 100)
c = b.reshape([10, 10])
print("Original Array:")
print(c)
print("Downsized Array:")
print(c[::2, ::2])

出力:

Original Array:
[[ 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 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 0  2  4  6  8]
 [20 22 24 26 28]
 [40 42 44 46 48]
 [60 62 64 66 68]
 [80 82 84 86 88]]

上記のセクションで書かれたコードは、元の画像 c のサイズを (10, 10) から (5, 5) に縮小し、new_c に格納します。

注意すべき重要なことは、この方法では元の 100 個の値から 25 個の値が選択されていることです。 この方法では、残りの値の情報は完全に失われます。

Python で zoom() 関数を使用して配列をダウンサンプリングする

ndimage.interpolation.zoom() 関数 は、Python で画像をアップサンプリングまたはダウンサンプリングするためにも使用されます。 この関数は 2つのパラメーターを取ります。 ズームする必要がある元の画像とズーム率。

この方法は、スライス方法と非常によく似ています。 また、中間値をスキップし、ダウンサンプリング中に元の画像からいくつかの値のみを選択します。

次のコード例は、ndimage.interpolation.zoom() 関数を使用して画像をダウンサンプリングする方法を示しています。

import numpy as np
from scipy import ndimage

b = np.arange(0, 100)
c = b.reshape([10, 10])

new_c = ndimage.interpolation.zoom(c, 0.5)
print("Original Array:")
print(c)
print("Downsized Array:")
print(new_c)

出力:

Original Array:
[[ 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 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 0  2  4  6  8]
 [20 22 24 26 28]
 [40 42 44 46 48]
 [60 62 64 66 68]
 [80 82 84 86 88]]

上記のセクションで書かれたコードは、前の例と同じように機能し、元の画像 c のサイズを (10, 10) から (5, 5) に縮小します。

この方法は、画像のアップサンプリングにも使用できるため、単純なスライスよりも優れています。 1 より大きいズーム値をいくつか指定する必要があります。

ダウンサンプリング中、この方法は多くのピクセル値をスキップし、元の画像から少数のみを選択するため、効果がありません。 複数のピクセル値を組み合わせて新しい値を推定する、より効果的な方法を以下に説明します。

Python で block_reduce() 関数を使用して配列をダウンサンプリングする

スライスとズームの両方の方法で階段効果が発生し、入力画像をダウンサンプリングしている場合でも画像全体がぼやけます。

中間値を処理するためのより良い方法は、周囲のピクセルを使用してそれらを推定することです。 これは、補間や単純平均など、さまざまな方法で実行できます。

簡単にするために、単純平均法を使用します。 Python の skimage.measure モジュール内の block_reduce() 関数 は、多次元配列のサイズを縮小するために使用されます。

この block_reduce() 関数は 3つの主要なパラメーターを取ります。 元の配列、ブロック サイズ、および各ブロックに適用される関数。

ブロック サイズは、縮小された画像で 1つの値のみを形成するために元の画像からいくつの値を組み合わせるかを示し、func パラメーターは、1つのブロック内のすべての値を組み合わせるために適用される関数を指定します。

これまでのすべての例では、(10, 10) 画像を (5, 5) 画像に縮小しているため、ブロック サイズは (2, 2) になり、新しい値を平均値にしたいので ブロックからの 1つの値だけではなく、ブロック全体の値を取得するには、func として np.mean を使用します。

次のコード例は、block_reduce() メソッドを使用して画像をダウンサンプリングする方法を示しています。

import numpy as np
from skimage.measure import block_reduce

b = np.arange(0, 100)
c = b.reshape([10, 10])

new_c = block_reduce(c, block_size=(2, 2), func=np.mean)
print("Original Array:")
print(c)
print("Downsized Array:")
print(new_c)

出力:

Original Array:
[[ 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 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 5.5  7.5  9.5 11.5 13.5]
 [25.5 27.5 29.5 31.5 33.5]
 [45.5 47.5 49.5 51.5 53.5]
 [65.5 67.5 69.5 71.5 73.5]
 [85.5 87.5 89.5 91.5 93.5]]

上記のセクションで書かれたコードは、元の画像 c から (2, 2) ブロックを取得し、ブロック内の 4つの値すべての平均を取り、結果を新しい画像 new_c に配置します。

このアプローチは、元の画像ブロックから 1つの値を取得して各ブロックの残りの 3つの値をスキップするのではなく、すべての値を組み合わせた効果を利用するため、上記で説明した前の 2つのアプローチよりも優れています。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

関連記事 - Python Array