Filtrage par convolution par matrice-Reinventor of Python image processing-

Une histoire sur le filtrage par convolution uniquement par calcul matriciel sans s'appuyer sur la bibliothèque de traitement d'image. Également possible avec Pythonista

** Cliquez ici pour les informations de base **

Qu'est-ce qu'un «réinventeur»?

Au lieu de m'appuyer sur Open CV ou Pillow, j'écrirai en fait divers traitements d'images en utilisant numpy et matplotlib. C'est une combinaison qui peut également être utilisée avec l'application iOS Pythonista.

import numpy as np
import matplotlib.pyplot as plt

De plus, les fonctions suivantes sont pratiques pour afficher des images. (Pour plus de détails, Basics)

def img_show(img : np.ndarray, cmap = 'gray', vmin = 0, vmax = 255, interpolation = 'none') -> None:
    '''np.Afficher une image avec un tableau comme argument.'''
    
    #Définissez dtype sur uint8
    img = np.clip(img,vmin,vmax).astype(np.uint8)
    
    #Afficher l'image
    plt.imshow(img, cmap = cmap, vmin = vmin, vmax = vmax, interpolation = interpolation)
    plt.show()
    plt.close()

Filtrage par convolution

Filtrage spatial est facile à comprendre pour le filtre par convolution.

Tout d'abord, créez une fonction de convolution d'un tableau à deux dimensions.

def convolve2d(img, kernel):
    #Calculer la taille de la sous-matrice
    sub_shape = tuple(np.subtract(img.shape, kernel.shape) + 1)
    
    #Le nom de la fonction étant long, il est omis une fois
    strd = np.lib.stride_tricks.as_strided
    
    #Créer une matrice sous-matrice
    submatrices = strd(img,kernel.shape + sub_shape,img.strides * 2)
    
    #Calculer la somme d'Einstein de la sous-matrice et du noyau
    convolved_matrix = np.einsum('ij,ijkl->kl', kernel, submatrices)
 
    return convolved_matrix

Le code ci-dessus est alambiqué en utilisant la matrice de la sous-matrice de img. Voir enseignant stackoverflow pour plus de détails. Dans cet algorithme, la partie périphérique peut être supprimée.

[Découpage] 'tiger.jpeg'(http://qiita.com/secang0/items/1229212a37d8c9922901#%E5%9B%9B%E8%A7%92% E5% BD% A2% E3% 81% AB% E3% 83% 88% E3% 83% AA% E3% 83% 9F% E3% 83% B3% E3% 82% B0330% E8% BF% BD% E5% 8A% A0) image [moyenne pondérée par coefficient NTSC](http://qiita.com/secang0/items/6fba02d7cc3ef34c0c31#ntsc-%E4%BF%82%E6%95%B0%E3%81%AB % E3% 82% 88% E3% 82% 8B% E5% 8A% A0% E9% 87% 8D% E5% B9% B3% E5% 9D% 87% E6% B3% 95) En revanche, divers filtres ont été utilisés.

img = plt.imread('tiger.jpeg')[1200:1500,1400:1700]
img = (0.298912 * img[...,0] + 0.586611 * img[...,1] + 0.114478 * img[...,2])
img_show(img)

img.png

Filtre passe bas

Un filtre passe-bas est un filtre qui a tendance à laisser une partie basse fréquence plutôt qu'une partie haute fréquence d'une image. (Haut / bas est la fréquence) En bref, cela s'estompe en réduisant les changements soudains. Ce processus est souvent utilisé pour supprimer le bruit.

img_show(convolve2d(img, kernel))

Dans le tableau ci-dessous, la concaténation est utilisée pour s'aligner sur l'image d'origine.

Nom de la méthode Noyau / image originale / image de filtre Remarques
Filtre de moyenne mobile simple kernel = np.ones((5,5)/25 sma.png Le filtre passe-bas le plus simple
Filtre gaussien kernel = gaussian_kernel(5) gaussian.png Excellent filtre passe-bas basé sur une distribution normale

Dans l'image d'origine, la partie gris clair (vert jaunâtre dans l'image couleur) au centre est pointillée. Cependant, l'application d'un filtre passe-bas rend la confirmation difficile.

Dans le tableau, la matrice gaussienne suivante est utilisée. Référence

def gaussian_kernel(n : int) -> np.ndarray:
    '''(n,n)Faire une matrice gaussienne de'''
    
    #[nC0, nC1, ..., nCn]Créer
    combs = [1]
    for i in range(1,n):
        ratio = (n-i)/(i)
        combs.append(combs[-1]*ratio)
    combs = np.array(combs).reshape(1,n)/(2**(n-1))
    
    #Créer une matrice gaussienne avec le produit des vecteurs verticaux et horizontaux
    result = combs.T.dot(combs)
    return result

Filtre passe-haut

Un filtre passe-haut est un filtre qui a tendance à laisser une partie haute fréquence plutôt qu'une partie basse fréquence d'une image. Cela rend les zones variées plus accentuées et affine l'image.

Un filtre de netteté typique est pour $ k> 0 $

1.\hspace{5pt}
\left(
\begin{matrix}
0&-k&0\\
-k&1+4k&-k\\
0&-k&0\\
\end{matrix}
\right)
\\
\mbox{Ou}
\\
2.\hspace{5pt}

\left(
\begin{matrix}
-k&-k&-k\\
-k&1+8k&-k\\
-k&-k&-k\\
\end{matrix}
\right)
sharp_kernel_1 = lambda k : np.matrix('0,{0},0;{0},{1},{0};0,{0},0'.format(-k,1+4*k))
sharp_kernel_2 = lambda k : np.matrix('{0},{0},{0};{0},{1},{0};{0},{0},{0}'.format(-k,1+8*k))

Appel. Référence Plus la valeur de k est élevée, plus le filtre est puissant. De plus, si k est le même, 2 est plus fort.

L'image est filtrée gaussienne 3 * 3 et l'affichage est normalisé comme décrit ci-dessous.

img_gaussian = convolve2d(img, gaussian(3))
img_show(norm_img(convolve2d(img_gaussian, kernel)))

Dans le tableau ci-dessous, la concaténation est utilisée pour s'aligner sur l'image d'origine. La partie gris clair ci-dessous (vert jaunâtre dans une image couleur) est à l'origine pointillée et comporte de nombreuses composantes haute fréquence. Veuillez prêter une attention particulière.

Noyau / image originale / image de filtre
kernel = sharp_kernel_1(1)sharpen_1_1.png
kernel = sharp_kernel_1(10)sharpen_1_10.png
kernel = sharp_kernel_1(1)sharpen_2_1.png
kernel = sharp_kernel_2(10)sharpen_2_10.png

Étant donné que la valeur de pixel de l'image de filtre ne rentre pas entre 0 et 255, elle est normalisée par la fonction suivante. Cela correspond à l'intervalle de $ average \ pm n_ {std} \ fois l'écart type $ à 0 ~ 255. (En fait $ n_ {std} = 2 $) Il s'agit d'un processus qui est également utilisé pour l'image d'origine à des fins de comparaison, et est légèrement différent de l'image du haut.

def norm_img(img_filtered,n_std):
    '''img_Standardiser filtré'''
    mean = img_filtered.mean() #moyenne
    std = img_filtered.std() #écart-type
    img_norm = 256*((img_filtered - mean)/std + n_std)/(n_std*2)
    return np.clip(img_norm,0,255).astype(np.uint8)

différentiel

Des filtres différentiels sont utilisés pour l'extraction des contours. En effet, en trouvant la différence par rapport au pixel adjacent, vous pouvez savoir où le changement est important.

référence: ** Le résultat réel est affiché ** ** Explication des différentes différences de filtre **

L'image est filtrée gaussienne 3 * 3. En outre, [Section filtre passe-haut](http://qiita.com/secang0/items/f3a3ff629988dc660d87#%E3%83%8F%E3%82%A4%E3%83%91%E3%82%B9 % E3% 83% 95% E3% 82% A3% E3% 83% AB% E3% 82% BF% E3% 83% BC) Le processus de normalisation décrit en) a été appliqué.

img_gaussian = convolve2d(img, gaussian(3))
img_show(norm_img(convolve2d(img_gaussian, kernel)))
Contenu Noyau / image originale / image de filtre Remarques Lien de référence
Filtre différentiel simple du premier ordre de bas en haut kernel = np.matrix('0,-1,0;0,1,0;0,0,0')down_up_1.png Sensibleaubruit Avecexplication
Filtre Prewitt de bas en haut kernel = np.matrix('-1,-1,-1;0,0,0;1,1,1')down_up_prewitt.png Avecl'imagederésultat&Avecexplication
Filtre Sobel de bas en haut kernel = np.matrix('-1,-2,-1;0,0,0;1,2,1')down_up_sobel.png np.matrix('-1,-1,-1;0,0,0;1,1,1')*1.33Ladifférenceavec Avecl'imagederésultat&Avecexplication
Filtre laplacien kernel = np.matrix('-1,-1,-1;-1,8,-1;-1,-1,-1')laplacian.png Différentieldesecondordredanstouteslesdirections\nabla^2 Avecl'imagederésultat&Avecexplication

Autre

Contenu Noyau / image originale / image de filtre Remarques Lien de référence
Gaufrage kernel = np.matrix('-2,-1,0;-1,1,1;0,1,2')emboss.png 1aucentredeSobel Imagederésultatenbas

Recommended Posts

Filtrage par convolution par matrice-Reinventor of Python image processing-
Traitement d'image par matrice Basics & Contents-Reinventor of Python image processing-
traitement d'image python
Bases du traitement d'images binarisées par Python
Échelle de gris par matrice-Reinventor of Python image processing-
Dessin avec Matrix-Reinventor of Python Image Processing-
Premier traitement d'image Python
Traitement d'image avec Python
Divers traitements de Python
Traitement d'image? L'histoire du démarrage de Python pour
Traitement d'image avec Python (partie 2)
Conversion d'affine par matrice (agrandissement / réduction / rotation / cisaillement / mouvement) -Réinventeur du traitement d'image Python-
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
Traitement d'image par python (Pillow)
Post-traitement de python (NG)
[Python] Traitement d'image avec scicit-image
Capture d'image de Firefox en utilisant Python
Notes personnelles pour le traitement d'images python
Traitement d'image avec la binarisation Python 100 knocks # 3
100 traitement d'image par Python Knock # 2 Échelle de gris
Vérification de la valeur semi-positive du noyau de convolution
Comprendre la fonction de convolution en utilisant le traitement d'image comme exemple
Dessin linéaire avec une matrice - Recherche originale par un réinventeur du traitement d'image Python -
Traitement d'image par Python 100 knock # 10 filtre médian
Python: principes de base de la reconnaissance d'image à l'aide de CNN
Traitement d'image par le remplacement du canal Python 100 Knock # 1
[Python] Temps de traitement de la multiplication de la matrice avec NumPy
100 traitement d'image avec Python Knock # 8 Max Pooling
Python: Application de la reconnaissance d'image à l'aide de CNN
[Python] Calcul de la similarité d'image (coefficient de dés)
Traitement d'image avec Python et OpenCV [Tone Curve]
Traitement d'image par Python 100 knock # 12 motion filter
Traitement d'image par Python 100 Knock # 6 Traitement de réduction de couleur
Analyse d'image de microtomographie à rayons X par Python
L'histoire du traitement A du blackjack (python)
Traitement d'image léger avec Python x OpenCV
Comparaison de la vitesse de transposition de la matrice par Python
Statut de chaque système de traitement Python en 2020
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
[Traitement d'image] Postérisation
Traitement d'image à partir de zéro avec python (5) Transformation de Fourier
Afficher le résultat du traitement de la géométrie en Python
[Python] Rotation à droite de 90 degrés, rotation à gauche de 90 degrés, rotation de la matrice à 180 degrés [AtCoder]
Les bases de Python ①
Bases de python ①
Traitement d'image à partir de zéro avec python (4) Extraction de contour
Traitement d'image avec la configuration de l'environnement Python pour Windows
Copie de python
[Python] Opération de matrice
Traitement d'image 100 coups ①
Traitement d'image par filtre de lissage Python 100 knock # 11 (filtre moyen)
Image de fermeture
[Python + OpenCV] Peignez la partie transparente de l'image en blanc
Introduction de Python
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
[Traitement du langage 100 coups 2020] Résumé des exemples de réponses par Python
Extraire le tableau des fichiers image avec OneDrive et Python