Python-Downsample-Array

Muhammad Maisam Abbas 10 Oktober 2023
  1. Downsample-Array mit Slicing in Python3
  2. Downsample-Array mit der zoom()-Funktion in Python
  3. Downsample Array Mit der Funktion block_reduce() in Python
Python-Downsample-Array

In diesem Tutorial werden die Methoden zum Downsampling eines Bildes in Python erläutert.

Downsample-Array mit Slicing in Python3

In Python ist ein Bild ein mehrdimensionales Array. Graustufenbilder werden mit einem zweidimensionalen Array dargestellt, während Farb- oder RGB-Bilder mit einem dreidimensionalen Array dargestellt werden.

Der Einfachheit halber konzentriert sich dieses Tutorial auf die Reduzierung der Größe von zweidimensionalen Graustufenbildern, aber die hier besprochenen Methoden können auch verwendet werden, um die Größe von RGB-Bildern zu reduzieren.

Unsere erste Methode ist sehr einfach. Beim Slicing nehmen wir, wie der Name schon sagt, einen kleinen Ausschnitt aus einem insgesamt großen Bild.

Beim Slicen eines Bildes können wir einen Schrittparameter angeben, der angibt, wie viele Werte übersprungen werden sollen, bevor der nächste Wert genommen wird. Standardmäßig ist dieser Wert auf 1 gesetzt.

Das folgende Codebeispiel zeigt, wie wir Array-Slicing verwenden können, um ein Bild herunterzurechnen.

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])

Ausgang:

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]]

Der im obigen Abschnitt geschriebene Code reduziert die Größe unseres ursprünglichen Bildes c von (10, 10) auf (5, 5) und speichert es in new_c.

Es ist wichtig zu beachten, dass diese Methode 25 Werte aus unseren ursprünglichen 100 Werten ausgewählt hat. Die Information in den restlichen Werten geht bei dieser Methode komplett verloren.

Downsample-Array mit der zoom()-Funktion in Python

Die Funktion ndimage.interpolation.zoom() wird auch verwendet, um ein Bild in Python hoch- oder herunterzurechnen. Diese Funktion benötigt 2 Parameter; das Originalbild, das gezoomt werden muss, und das Zoomverhältnis.

Diese Methode ist der Slicing-Methode sehr ähnlich. Es überspringt auch die Zwischenwerte und wählt beim Downsampling nur wenige Werte aus unserem Originalbild aus.

Das folgende Codebeispiel zeigt, wie wir die Funktion ndimage.interpolation.zoom() verwenden können, um ein Bild herunterzurechnen.

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)

Ausgang:

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]]

Der im obigen Abschnitt geschriebene Code funktioniert genauso wie das vorherige Beispiel und reduziert die Größe unseres Originalbildes c von (10, 10) auf (5, 5).

Diese Methode ist besser als einfaches Slicing, da sie auch zum Upsampling eines Bildes verwendet werden kann. Wir müssen einige Zoomwerte größer als 1 angeben.

Beim Downsampling ist diese Methode ineffektiv, da sie viele Pixelwerte überspringt und nur wenige aus unserem Originalbild auswählt. Ein effektiveres Verfahren wird unten beschrieben, um neue Werte durch Kombinieren mehrerer Pixelwerte zu schätzen.

Downsample Array Mit der Funktion block_reduce() in Python

Sowohl Slicing- als auch Zoom-Methoden führen zu dem Treppeneffekt, der unser gesamtes Bild verwischt, selbst wenn wir das Eingangsbild heruntersampeln.

Ein besserer Ansatz zum Umgang mit Zwischenwerten besteht darin, sie anhand ihrer umgebenden Pixel zu schätzen. Dies kann auf unterschiedliche Weise erfolgen, z. B. durch Interpolation und einfachen Mittelwert.

Der Einfachheit halber verwenden wir die Methode der einfachen Mittel. Die block_reduce()-Funktion innerhalb des skimage.measure-Moduls von Python wird verwendet, um die Größe eines mehrdimensionalen Arrays zu reduzieren.

Diese block_reduce()-Funktion benötigt 3 Hauptparameter; das ursprüngliche Array, die Blockgröße und die auf jeden Block anzuwendende Funktion.

Die Blockgröße sagt uns, wie viele Werte aus unserem Originalbild kombiniert werden, um nur einen Wert in unserem reduzierten Bild zu bilden, und der Parameter func gibt die Funktion an, die angewendet wird, um alle Werte in einem Block zu kombinieren.

Da wir in all unseren vorherigen Beispielen ein (10, 10)-Bild auf ein (5, 5)-Bild reduziert haben, ist unsere Blockgröße (2, 2), und da wir möchten, dass der neue Wert der Mittelwert ist des gesamten Blocks anstatt nur eines Werts aus dem Block, verwenden wir np.mean als func.

Das folgende Codebeispiel zeigt, wie wir die Methode block_reduce() verwenden können, um unsere Bilder herunterzurechnen.

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)

Ausgang:

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]]

Der im obigen Abschnitt geschriebene Code nimmt einen (2, 2)-Block aus unserem ursprünglichen Bild c, nimmt den Durchschnitt aller 4 Werte innerhalb des Blocks und platziert das Ergebnis in unser neues Bild new_c.

Dieser Ansatz ist besser als die beiden oben diskutierten Ansätze, da er den kombinierten Effekt aller Werte berücksichtigt, anstatt nur 1 Wert aus dem ursprünglichen Bildblock zu nehmen und die restlichen 3 Werte in jedem Block zu überspringen.

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

Verwandter Artikel - Python Array