J'ai essayé de "différencier" l'image avec Python + OpenCV

introduction

Lors du traitement d'image, vous souhaiterez peut-être détecter des informations spécifiques telles que les contours. Les bords et le bruit sont des changements soudains des valeurs de pixels. Une façon possible de les détecter est de «différencier l'image».

Cette fois, nous utiliserons Python pour différencier l'image avec OpenCV.

Qu'est-ce que la différenciation d'image?

Tout d'abord, parlons de ce qu'est la différenciation. La différenciation est un «petit changement» et représente le taux de changement. La formule de différenciation est la suivante.

f'(x) = \lim_{h\rightarrow 0}\frac{f(x+h)-f(x)}{h}

En gros, pensez-y comme représentant ** l'ampleur du changement **.

L'ampleur de la différenciation peut être exprimée par le "tilt". Plus le changement est petit, plus l'inclinaison est petite et plus le changement est important, plus l'inclinaison est grande. Un exemple de graphique différentiel est présenté ci-dessous.

image.png

La partie avec un petit changement est une ligne droite bleue et la partie avec un grand changement est une ligne droite rouge.

Dans la différenciation d'image, en examinant cette inclinaison, la partie où la valeur du pixel change rapidement, c'est-à-dire le bord est détecté.

Préparation

L'environnement utilise Google Colaboratory. La version Python est ci-dessous.

import platform
print("python " + platform.python_version())
# python 3.6.9

Montrons l'image

Maintenant écrivons le code. Tout d'abord, importez OpenCV.

import cv2

De plus, importez les éléments suivants pour afficher l'image dans Colaboratory.

from google.colab.patches import cv2_imshow

Préparez également un exemple d'image. Cette fois, j'utiliserai l'image gratuite de Pixabay.

Maintenant, affichons l'exemple d'image préparé.

img = cv2.imread(path) #chemin spécifie où l'image est placée
cv2_imshow(img)

image.png

De plus, pour la différenciation de l'image, une image en niveaux de gris est utilisée, alors préparez-la.

Les images en échelle de gris peuvent être visualisées ci-dessous.

img_gray = cv2.imread(path, 0)
cv2_imshow(img_gray)

image.png

Différenciation d'image

Ensuite, je présenterai comment différencier l'image.

Filtre Sobel

Tout d'abord, introduisons le filtre Sobel. Le filtre Sobel est une différenciation ponctuelle, et je pense qu'il peut être considéré comme la méthode de différenciation d'image la plus élémentaire.

Les images utilisant le filtre Sobel peuvent être visualisées ci-dessous.

img_sobel = cv2.Sobel(img_gray, cv2.CV_32F, 1, 0, ksize=3)
cv2_imshow(img_sobel)

image.png

cv2.Sobel a 5 arguments. Pour plus de détails, veuillez vous référer aux documents officiels. Si le troisième argument est 1, la différenciation dans la direction x est calculée, et si le quatrième argument est 1, la différenciation dans la direction y est calculée. Dans l'image ci-dessus, l'image différenciée dans la direction x (direction horizontale) est affichée. Le cinquième argument est appelé la taille du noyau. Lorsqu'un point de l'image est décidé, cela montre combien de zone autour de lui est incluse. Considérez-le comme la taille d'une boîte.

Maintenant, changeons les 3ème et 4ème arguments et affichons les images différenciées respectivement dans les directions x et y.

img_sobel_x = cv2.Sobel(img_gray, cv2.CV_32F, 1, 0, ksize=3)
img_sobel_y = cv2.Sobel(img_gray, cv2.CV_32F, 0, 1, ksize=3)
imgs = cv2.hconcat([img_sobel_x, img_sobel_y])
cv2_imshow(imgs)

image.png

L'image de gauche est différenciée dans la direction x et l'image de droite est différenciée dans la direction y. Vous pouvez voir que la différenciation dans la direction x (horizontale) quitte le bord vertical et la différenciation dans la direction y (verticale) quitte le bord horizontal.

Comme vous pouvez le voir, il est efficace d'utiliser le filtre Sobel lorsque les bords sont directionnels.

Filtre laplacien

Ensuite, je présenterai le filtre laplacien. Le filtre laplacien est un double différentiel et est efficace lorsque vous souhaitez une détection des bords plus fine que le filtre Sobel.

Juste au cas où, la formule de Laplacian (bidimensionnelle) est montrée ci-dessous.

\Delta f = \nabla \cdot \nabla f = \frac{\partial^2}{\partial^2 x}f + \frac{\partial^2}{\partial^2 y}f

Contrairement au filtre Sobel, vous n'avez pas à spécifier le sens de différenciation.

L'image utilisant le filtre laplacien est la suivante.

img_lap = cv2.Laplacian(img_gray, cv2.CV_32F)
cv2_imshow(img_lap)

image.png

Vous pouvez voir que le filtre Sobel peut détecter les bords fins. Il peut également être utilisé lorsque les bords n'ont pas d'orientation spécifique et que le filtre Sobel n'est pas activé.

Méthode de détection de bord efficace

Jusqu'à présent, nous avons utilisé des filtres Sobel et laplacien pour détecter les contours. En différenciant les valeurs de pixel de l'image, il est possible de détecter des contours qui sont des changements soudains des valeurs de pixel.

Cependant, non seulement les bords, mais aussi ** le bruit est un changement soudain de la valeur des pixels **. Les images contiennent souvent une variété de bruits. Pour de telles images, il existe un moyen d'éliminer le bruit en effectuant d'abord un ** lissage **.

Cette fois, nous allons essayer la détection des bords selon la procédure suivante.

--Échelle grise

img_gauss = cv2.GaussianBlur(img_gray, (3, 3), 3)
img_lap = cv2.Laplacian(img_gauss, cv2.CV_32F)
cv2_imshow(img_lap)

image.png

Canny Enfin, je présenterai la méthode de Canny. Canny est un algorithme de détection des contours. Canny prend plusieurs étapes pour détecter les bords.

Voir ci-dessous pour plus de détails. Détection des bords par la méthode Canny

Maintenant, affichons l'image en utilisant Canny.

img_canny = cv2.Canny(img_gray, 100, 200)
cv2_imshow(img_canny)

image.png

Les deuxième et troisième arguments sont les valeurs utilisées dans le traitement de seuil en deux étapes. Le deuxième argument spécifie la valeur minimale du seuil et le troisième argument spécifie la valeur maximale du seuil.

Résumé

Cette fois, j'ai utilisé Python pour différencier l'image avec OpenCV.

J'ai introduit le filtre Sobel, le filtre laplacien et la méthode Canny comme méthodes de différenciation des images. Veuillez l'utiliser correctement en fonction des caractéristiques du bord que vous souhaitez détecter. La différenciation est une méthode de détection des changements soudains des valeurs de pixels, mais elle répond non seulement aux contours mais aussi au bruit. Par conséquent, si vous souhaitez détecter uniquement les contours, vous devez supprimer le bruit à l'avance. Pour éliminer le bruit, pensez au lissage.

Voir ci-dessous pour plus d'informations sur la différenciation et le lissage des images.

Recommended Posts

J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé de jouer avec l'image avec Pillow
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
Édition d'image avec python OpenCV
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème avec Python Vol.1
Python Open CV a essayé d'afficher l'image sous forme de texte.
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
J'ai essayé de frapper l'API avec le client python d'echonest
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
J'ai essayé webScraping avec python.
J'ai aimé le tweet avec python. ..
Trouver la similitude d'image avec Python + OpenCV
Essayez de brouiller l'image avec opencv2
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai essayé la reconnaissance faciale avec OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé de reconnaître le visage de la vidéo (OpenCV: version python)
Traitement d'image avec Python et OpenCV [Tone Curve]
Acquisition d'images depuis une caméra avec Python + OpenCV
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
Python: j'ai essayé le problème du voyageur de commerce
J'ai essayé la reconnaissance d'image simple avec Jupyter
Traitement d'image léger avec Python x OpenCV
J'ai essayé le framework de test Python Tornado
# J'ai essayé quelque chose comme Vlookup avec Python # 2
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
J'ai essayé d'afficher le temps de lecture de la vidéo (OpenCV: version Python)
Je viens d'effacer l'objet en utilisant la réparation d'image (inpaint) (OpenCV: Python)
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
J'ai essayé des centaines de millions de SQLite avec python
[Python] J'ai essayé de remplacer le nom de la fonction par le nom de la fonction
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
Comment couper la partie inférieure droite de l'image avec Python OpenCV
Binarisation avec OpenCV / Python
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-