[PYTHON] Je suis tombé sur un filtre d'image avec un nom clairement japonais appelé filtre Kuwahara, et quand je l'ai essayé, c'était incroyable, alors je vais le présenter.

introduction

** Qu'est-ce que le filtre Kuwahara ** Le filtre Kuwahara est un type de filtre de lissage conçu par un professeur d'université nommé Michiyoshi Kuwahara (selon Wikipedia). Si vous voulez voir, jetez un œil au bas de l'article) Kuwahara filter -Wikipedia Traitement des données pour SPECT (papier original?)

Contenu du filtre Kuwahara

image.png https://upload.wikimedia.org/wikipedia/commons/4/49/Kuwahara.jpg

Pour expliquer brièvement le filtre Kuwahara, Ce filtre utilise la couleur de chaque pixel comme couleur moyenne de la zone avec la plus petite somme de dispersion dans les zones carrées supérieure gauche, supérieure droite, inférieure gauche et inférieure droite de n'importe quelle largeur autour d'elle.

Dans l'image ci-dessus, pour déterminer la couleur du pixel central,

  1. Calculez la distribution de ** a ** zone, ** b ** répartition de zone, ** c ** répartition de zone et ** d ** distribution de zone pour chaque couleur RVB et pour chaque zone Ajoutez tout RVB à.
  2. Comparez les variances obtenues en 1 et calculez la moyenne des couleurs dans la plus petite zone pour chaque RVB.
  3. Définissez la couleur moyenne obtenue en 2 comme couleur du pixel central.

Suivez les étapes ci-dessus ou le processus pour obtenir des résultats équivalents. De plus, dans l'image, un côté de la zone carrée fait 3 pixels, mais il peut avoir n'importe quelle largeur.

la mise en oeuvre

** Définition **

import numpy as np
import cv2

 def kuwahara (pic, r = 5, resize = False, rate = 0.5): # Image originale, largeur de la zone carrée-1, redimensionnement ou ratio lors du redimensionnement
    h,w,_=pic.shape
    if resize:pic=cv2.resize(pic,(int(w*rate),int(h*rate)));h,w,_=pic.shape
    filtered_pic=np.empty_like(pic)
    pic=np.pad(pic,((r,r),(r,r),(0,0)),"edge")
    ave,var=cv2.integral2(pic)
 ave = (ave [: -r-1 ,: -r-1] + ave [r + 1:, r + 1:] - ave [r + 1:,: -r-1] -ave [: -r -1, r + 1:]) / (r + 1) ** 2 # Dérivation par lots de la couleur moyenne de la zone
 var = ((var [: -r-1 ,: -r-1] + var [r + 1:, r + 1:] - var [r + 1:,: -r-1] -var [: - r-1, r + 1:]) / (r + 1) ** 2-ave ** 2) .sum (axis = 2) # Dérivation par lots de la distribution régionale

    for i in range(h):
        for j in range(w):
 filtered_pic [i, j] = np.array ([ave [i, j], ave [i + r, j], ave [i, j + r], ave [i + r, j + r]]) [ np.array ([var [i, j], var [i + r, j], var [i, j + r], var [i + r, j + r]]). argmin ()] #color Décision

    return filtered_pic

** Courir **

import matplotlib.pyplot as plt

 pic = np.array (plt.imread ("input_picture.png ")) Remplacez # input_picture.png par le chemin de l'image que vous souhaitez filtrer
filtered_pic=kuwahara(pic,7,True,0.2)
plt.imshow(filtered_pic)

résultat

Voici quelques-unes des photos que j'ai prises lors d'un voyage en France l'année dernière.

** L'image d'origine ** IMG_20191102_111359.jpg

** Après avoir appliqué le filtre ** コメント 2020-06-10 193044.jpg ** Ver. ** avec un côté de la zone carrée plus petit eee.png

Les gens, les gens, les gens, les gens > ** Peinture sérieuse ** <  ̄Y^Y^Y^Y^Y^Y^ ̄

Résumé

Je l'ai présenté parce que j'ai été impressionné par la texture comme le dessin sur la toile. C'est facile alors essayez-le. Je ne pouvais pas penser à une méthode qui n'utilise pas l'instruction for cette fois, donc si le paramètre de redimensionnement est désactivé pour une grande image, cela prendra un certain temps. N'oubliez pas de définir le troisième argument sur True.

Recommended Posts

Je suis tombé sur un filtre d'image avec un nom clairement japonais appelé filtre Kuwahara, et quand je l'ai essayé, c'était incroyable, alors je vais le présenter.
Dans IPython, quand j'ai essayé de voir la valeur, c'était un générateur, donc je l'ai inventé quand j'étais frustré.
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
Quand j'ai essayé d'installer PIL et matplotlib dans un environnement virtualenv, j'en étais accro.
Quand j'ai essayé le concours AtCoder pour débutants, c'était un résultat terrible, alors je regarde en arrière
Depuis qu'il y avait Doppelgenger, j'ai essayé de le distinguer avec l'intelligence artificielle (rires) (Partie 1)
Lors de l'accès à une URL contenant du japonais (URL japonais) avec python3 avec urllib, elle sera encodée arbitrairement avec html et une erreur se produira, alors notez la solution de contournement
Un mémorandum lors de l'acquisition automatique avec du sélénium
Je suis tombé sur une expression lambda alors que je m'inquiétais de la fonctionnalisation
J'ai créé une application pour les étrangers visitant le Japon à Hackason et j'ai gagné un prix, mais quand j'y réfléchissais attentivement, c'était inutile
Quand j'ai fait un treemap (graphique de zone) avec python, c'était subtil, donc quand j'ai utilisé fleurir, c'était plutôt bien.
Quand j'ai essayé de créer un VPC avec AWS CDK mais que je n'ai pas pu le faire
D'une manière ou d'une autre, le code que j'ai écrit a fonctionné et j'ai été impressionné, alors je vais le poster
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
J'ai pu me moquer d'AWS-Batch avec python, moto, donc je vais le laisser
J'ai fait un modèle de classification d'images et essayé de le déplacer sur mobile
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
Notez que j'étais accro à la configuration de TensowFlow