[PYTHON] Traitement d'image 100 coups Q9, Q10 (filtre) speedup

Récemment, j'ai commencé à frapper 100 traitement d'image. https://qiita.com/yoyoyo_/items/2ef53f47f87dcf5d1e14

Récemment, j'étais un peu intéressé par le traitement d'image et je voulais bien utiliser numpy, donc je suis très reconnaissant pour cette série de problèmes, mais je ne suis pas satisfait des exemples de réponse de Q.9. Filtre gaussien et Q.10. Filtre médian. Il y avait (je ne veux pas utiliser l'instruction for en python!), J'ai donc écrit un processus qui utilise numpy autant que possible et comparé la vitesse.

Le code que j'ai écrit cette fois:

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)

En tournant y, x de filter_matrix avec for au lieu de y, x de l'image, l'ajout dans l'image peut utiliser pour de numpy. Comparaison de vitesse Nous avons appelé gaussian_filter 100 fois et avons comparé le nombre de secondes nécessaires. Puisque la commande time est utilisée, le temps pour un chargement d'image est inclus, mais je ne pense pas que cela affectera beaucoup de gens.

Méthode temps
Ce code 0.72
Le modèle de réponse 50.60

N'est-ce pas accablant? Q10 Concernant le filtre médian, je pense qu'il peut être accéléré en créant une image (?) Of H * W * (filter_size) puis en faisant np.median (axis = 2) sur cette image. .. ~~ C'est fait.

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

Le temps de mesure était de 1,71 seconde contre 302,98 secondes.

Au fait, je n'ai pas trouvé de moyen d'éviter d'utiliser l'instruction for pour la mise en commun, alors faites-le moi savoir si quelqu'un le sait.

Recommended Posts

Traitement d'image 100 coups Q9, Q10 (filtre) speedup
Traitement d'image 100 coups ①
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
100 coups sur le traitement d'image !! (011-020) Début de partie
100 coups sur le traitement d'image !! (001 --010) Soigneusement et soigneusement
Traitement d'image avec la binarisation Python 100 knocks # 3
100 traitement d'image par Python Knock # 2 Échelle de gris
Traitement d'image par Python 100 knock # 10 filtre médian
100 traitement d'image avec Python Knock # 8 Max Pooling
Traitement d'image par Python 100 knock # 12 motion filter
Traitement d'image avec Python 100 knocks # 7 pooling moyen
Traitement d'image 100 coups Q.6. Explication du traitement de réduction de couleur
100 traitements linguistiques frappent 03 ~ 05
[Traitement d'image] Postérisation
100 coups de traitement linguistique (2020): 40
100 coups de traitement linguistique (2020): 32
100 coups de traitement linguistique (2020): 35
traitement d'image python
100 coups de traitement linguistique (2020): 47
100 coups de traitement linguistique (2020): 39
100 coups de traitement linguistique (2020): 22
100 coups de traitement linguistique (2020): 26
100 coups de traitement linguistique (2020): 34
100 coups de traitement linguistique (2020): 29
100 coups de traitement linguistique (2020): 49
Le traitement de 100 langues frappe 06 ~ 09
100 coups de traitement linguistique (2020): 43
100 coups de traitement linguistique (2020): 24
100 coups de traitement linguistique (2020): 45
100 coups de traitement linguistique (2020): 10-19
100 coups de traitement linguistique (2020): 30
100 coups de traitement linguistique (2020): 00-09
100 coups de traitement linguistique (2020): 31
100 coups de traitement linguistique (2020): 48
100 coups de traitement linguistique (2020): 44
100 coups de traitement linguistique (2020): 41
100 coups de traitement linguistique (2020): 37
100 coups de traitement linguistique (2020): 25
100 coups de traitement linguistique (2020): 23
100 coups de traitement linguistique (2020): 33
100 coups de traitement linguistique (2020): 20
100 coups de traitement linguistique (2020): 27
100 coups de traitement linguistique (2020): 46
100 coups de traitement linguistique (2020): 21
100 coups de traitement linguistique (2020): 36
(Traitement d'image) Petit Thinning - Filtre qui effectue un traitement d'éclaircissage lâche
Traitement d'image par filtre de lissage Python 100 knock # 11 (filtre moyen)
100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 71
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
Traitement d'image avec MyHDL
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 60
100 coups de traitement du langage amateur: 92
100 coups sur le traitement d'image !! (021-030) Je veux faire une pause ...
100 coups de langue amateur: 30
100 coups de traitement du langage amateur: 84