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