** 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?)
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,
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.
** 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)
Voici quelques-unes des photos que j'ai prises lors d'un voyage en France l'année dernière.
** L'image d'origine **
** Après avoir appliqué le filtre ** ** Ver. ** avec un côté de la zone carrée plus petit
Les gens, les gens, les gens, les gens > ** Peinture sérieuse ** <  ̄Y^Y^Y^Y^Y^Y^ ̄
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