[PYTHON] Bildverarbeitung 100 Klopfen Q9, Q10 (Filter) Beschleunigung

Vor kurzem habe ich angefangen, 100 Bildverarbeitung anzuklopfen. https://qiita.com/yoyoyo_/items/2ef53f47f87dcf5d1e14

Vor kurzem war ich ein wenig an Bildverarbeitung interessiert und wollte Numpy gut verwenden, daher bin ich sehr dankbar für diese Sammlung von Problemen, aber ich bin unzufrieden mit den Antwortbeispielen von Q.9. Gauß-Filter und Q.10. Median-Filter. Es gab (ich möchte die for-Anweisung nicht in Python verwenden!), Also schrieb ich einen Prozess, der so viel wie möglich numpy verwendet und die Geschwindigkeit verglich.

Der Code, den ich diesmal geschrieben habe:

def gaussian_filter(_img, filter_matrix):
    # assume that fY and fX is odd number
    (fY, fX) = filter_matrix.shape
    mY = (fY - 1) // 2
    mX = (fX - 1) // 2

    (Y, X, C) = _img.shape
    img = np.zeros((Y + mY*2, X + mX*2, C))
    img[mY:Y+mY, mX:X+mX, :] = _img

    out_img = np.zeros_like(_img, np.float32)
    for dy in range (fY):
        for dx in range(fX):
            out_img += filter_matrix[dy][dx] * img[dy:Y+dy, dx:X+dx, :]
    return out_img.astype(np.uint8)

Durch Drehen von y, x von filter_matrix mit for anstelle von y, x des Bildes kann die Addition im Bild für von numpy verwendet werden. Geschwindigkeitsvergleich Wir haben gaussian_filter 100 Mal aufgerufen und verglichen, wie viele Sekunden es gedauert hat. Da der Befehl time verwendet wird, ist die Zeit für das Laden eines Bildes enthalten, aber ich denke nicht, dass dies viele Menschen betreffen wird.

Methode Zeit
Dieser Code 0.72
Musterantwort 50.60

Ist es nicht überwältigend? F10. In Bezug auf den Medianfilter denke ich, dass er beschleunigt werden kann, indem ein Bild (?) Von H * W * (filter_size) erstellt und dann np.median (Achse = 2) für dieses Bild ausgeführt wird. .. ~~ Es ist geschafft.

def median_filter(_img, filter_size):
    # assume that filter_size is odd
    half_size = (filter_size - 1) // 2
    (Y, X, C) = _img.shape
    img = np.zeros((Y + half_size*2, X + half_size*2, C))
    img[half_size:Y+half_size, half_size:X+half_size, :] = _img

    out_img = np.zeros_like(_img)
    for c in range(C):
        big_ch_img = np.zeros((Y, X, filter_size**2))
        for fy in range(filter_size):
            for fx in range(filter_size):
                ch = fy * filter_size + fx
                big_ch_img[:,:,ch] = img[fy:fy+Y, fx:fx+X,c]
        out_img[:,:,c] = np.median(big_ch_img, axis=2)
    return out_img

Die Messzeit betrug 1,71 Sekunden gegenüber 302,98 Sekunden.

Übrigens habe ich mir keine Möglichkeit ausgedacht, die Verwendung der for-Anweisung für Pooling zu vermeiden. Lassen Sie mich daher bitte wissen, wenn jemand davon weiß.

Recommended Posts

Bildverarbeitung 100 Klopfen Q9, Q10 (Filter) Beschleunigung
Bildverarbeitung 100 Schläge ①
Bildverarbeitung mit Python 100 Knock # 9 Gauß-Filter
100 Schläge bei der Bildverarbeitung !! (011-020) Frühes Spiel
100 Klopfen bei der Bildverarbeitung !! (001 - 010) Vorsichtig und vorsichtig
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
100 Bildverarbeitung mit Python Knock # 2 Graustufen
Bildverarbeitung mit Python 100 Knock # 10 Medianfilter
100 Bildverarbeitung mit Python Knock # 8 Max Pooling
Bildverarbeitung mit Python 100 Knock # 12 Bewegungsfilter
Die Bildverarbeitung mit Python 100 führt zu einem durchschnittlichen Pooling von # 7
Bildverarbeitung 100 Klopfen Q.6. Erklärung der Farbreduktionsverarbeitung
100 Sprachverarbeitungsklopfen 03 ~ 05
[Bildverarbeitung] Posterisierung
100 Sprachverarbeitungsklopfen (2020): 40
100 Sprachverarbeitungsklopfen (2020): 32
100 Sprachverarbeitungsklopfen (2020): 35
Python-Bildverarbeitung
100 Sprachverarbeitungsklopfen (2020): 47
100 Sprachverarbeitungsklopfen (2020): 39
100 Sprachverarbeitungsklopfen (2020): 22
100 Sprachverarbeitungsklopfen (2020): 26
100 Sprachverarbeitungsklopfen (2020): 34
100 Sprachverarbeitungsklopfen (2020): 29
100 Sprachverarbeitungsklopfen (2020): 49
100 Sprachverarbeitungsklopfen 06 ~ 09
100 Sprachverarbeitungsklopfen (2020): 43
100 Sprachverarbeitungsklopfen (2020): 24
100 Sprachverarbeitungsklopfen (2020): 45
100 Sprachverarbeitungsklopfen (2020): 10-19
100 Sprachverarbeitungsklopfen (2020): 30
100 Sprachverarbeitungsklopfen (2020): 00-09
100 Sprachverarbeitungsklopfen (2020): 31
100 Sprachverarbeitungsklopfen (2020): 48
100 Sprachverarbeitungsklopfen (2020): 44
100 Sprachverarbeitungsklopfen (2020): 41
100 Sprachverarbeitungsklopfen (2020): 37
100 Sprachverarbeitungsklopfen (2020): 25
100 Sprachverarbeitungsklopfen (2020): 23
100 Sprachverarbeitungsklopfen (2020): 33
100 Sprachverarbeitungsklopfen (2020): 20
100 Sprachverarbeitungsklopfen (2020): 27
100 Sprachverarbeitungsklopfen (2020): 46
100 Sprachverarbeitungsklopfen (2020): 21
100 Sprachverarbeitungsklopfen (2020): 36
(Bildverarbeitung) Petit Thinning - Filter, der eine lose Ausdünnung durchführt
Bildverarbeitung mit Python 100 Knock # 11 Glättungsfilter (Durchschnittsfilter)
100 Amateur-Sprachverarbeitungsklopfen: 41
100 Amateur-Sprachverarbeitungsklopfen: 71
100 Amateur-Sprachverarbeitungsklopfen: 56
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Amateur-Sprachverarbeitungsklopfen: 59
100 Amateur-Sprachverarbeitungsklopfen: 70
Bildverarbeitung mit MyHDL
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Klopfen bei der Bildverarbeitung !! (021-030) Ich möchte eine Pause machen ...
100 Amateur-Sprachverarbeitungsklopfen: 30
100 Amateur-Sprachverarbeitungsklopfen: 84