[PYTHON] Medianfilter mit Röntgenstrahl (Medianfilter)

Medianfilter mit Röntgenstrahl

Ich habe xarray verwendet, um Filter wie gleitende Durchschnitte anzuwenden, damit ich Aufzeichnungen führen kann.

Alles, was wir tun mussten, war, einen gleitenden Durchschnitt (oder einen gleitenden Medianfilter) nur in einer Richtung des mehrdimensionalen Arrays anzuwenden. Hier werden Bilddaten als Beispiel behandelt. Ursprünglich sollten die Bilddaten die Bibliothek für Bilddaten verwenden. Beachten Sie jedoch, dass keine geeigneten Daten vorhanden waren.

import numpy as np
import xarray as xr
%matplotlib inline
import matplotlib.pyplot as plt
from PIL import Image
image = np.array(Image.open('lena.jpg'))
plt.imshow(image)
<matplotlib.image.AxesImage at 0x7f6b807a8898>

output_3_1.png

Reduzieren Sie hier die Größe entsprechend und fügen Sie Salz- und Pfeffergeräusche hinzu.

small_image = image[::3, ::3]
noisy_image = small_image.copy()
noisy_image[np.random.randint(0, noisy_image.shape[0], 1000), 
            np.random.randint(0, noisy_image.shape[1], 1000),
            np.random.randint(0, noisy_image.shape[2], 1000)] = 0
noisy_image[np.random.randint(0, noisy_image.shape[0], 1000), 
            np.random.randint(0, noisy_image.shape[1], 1000), 
            np.random.randint(0, noisy_image.shape[2], 1000)] = 256
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('original')
plt.imshow(small_image)
plt.subplot(1, 2, 2)
plt.title('noisy')
plt.imshow(noisy_image)
<matplotlib.image.AxesImage at 0x7f6b7eefb6d8>

output_6_1.png

In xr.DataArray speichern. Die vertikalen, horizontalen und Farbachsen seien "x", "y" bzw. "c".

data = xr.DataArray(noisy_image, dims=['x', 'y', 'c'])

Verwenden Sie die Rollmethode, um den gleitenden Durchschnitt in x-Richtung zu ermitteln. Die Methodenschlüsselwörter geben den entsprechenden Achsnamen und die Fenstergröße an.

rolling = data.rolling(x=3)  #Betrachten Sie ein 3-Pixel-Fenster in x-Richtung.
rolling
DataArrayRolling [window->3,center->False,dim->x]

Rollen entspricht "Mittelwert", "Median", "Max", "Min", "Anzahl" und so weiter.

plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('mean')
plt.imshow(rolling.mean().astype('ubyte'))  # `imshow`Zur Anzeige in Ubote konvertiert.
plt.subplot(1, 2, 2)
plt.title('median')
plt.imshow(rolling.median().astype('ubyte'))
<matplotlib.image.AxesImage at 0x7f6b7edb7f60>

output_12_1.png

Wenn Sie genau hinschauen, können Sie sehen, dass die beiden oberen Pixel schwarz sind. Dies liegt daran, dass für die ersten beiden Pixel keine gleitende Mittelung möglich ist. Es enthält np.nan.

rolling.mean()
<xarray.DataArray (x: 171, y: 171, c: 3)>
array([[[        nan,         nan,         nan],
        [        nan,         nan,         nan],
        ..., 
        [        nan,         nan,         nan],
        [        nan,         nan,         nan]],

       [[        nan,         nan,         nan],
        [        nan,         nan,         nan],
        ..., 
        [        nan,         nan,         nan],
        [        nan,         nan,         nan]],

       ..., 
       [[  91.      ,   27.333333,   63.333333],
        [  93.666667,   26.666667,   61.      ],
        ..., 
        [ 125.666667,   25.333333,   70.      ],
        [ 143.      ,   48.333333,   69.333333]],

       [[  87.333333,   26.333333,   62.666667],
        [  91.333333,   25.333333,   58.666667],
        ..., 
        [ 149.      ,   39.333333,   79.666667],
        [ 162.333333,   60.333333,   73.666667]]])
Dimensions without coordinates: x, y, c

Wenn es Ihnen nicht gefällt, geben Sie die minimale Fensterbreite an, z. B. "Rollen (x = 3, min_periods = 1)". Bei "min_periods = 1" sind die Endpunkte der Wert des gleitenden Durchschnitts von 1 Pixel (effektiv der Wert wie er ist).

plt.imshow(data.rolling(x=3, min_periods=1).median().astype('ubyte'))
<matplotlib.image.AxesImage at 0x7f6b7ed676a0>

output_16_1.png

Wenn Sie genau hinschauen, verschiebt sich dieses Bild im Durchschnitt nach unten. Wenn Sie den oberen Teil vergrößern

plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(data.rolling(x=4, min_periods=1).median().astype('ubyte')[70:100, 70:100])
plt.plot([0, 30], [15, 15], '--k')
plt.subplot(1, 2, 2)
plt.imshow(small_image[70:100, 70:100])
plt.plot([0, 30], [15, 15], '--k')
[<matplotlib.lines.Line2D at 0x7f6b7ec430f0>]

output_18_1.png

Wenn Sie eine solche Verschiebung nicht möchten, geben Sie "center = True" an.

plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(data.rolling(x=4, min_periods=1, center=True).median().astype('ubyte')[70:100, 70:100])
plt.plot([0, 30], [15, 15], '--k')
plt.subplot(1, 2, 2)
plt.imshow(small_image[70:100, 70:100])
plt.plot([0, 30], [15, 15], '--k')
[<matplotlib.lines.Line2D at 0x7f6b7ebdc7b8>]

output_20_1.png


Recommended Posts

Medianfilter mit Röntgenstrahl (Medianfilter)
Eindimensionaler Medianfilter (Medianfilter)
Tiefpassfilter mit Verschluss
Schreiben Sie FizzBuzz mit map (), redu (), filter (), rekursiv