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.
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.
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é.
L'environnement utilise Google Colaboratory. La version Python est ci-dessous.
import platform
print("python " + platform.python_version())
# python 3.6.9
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)
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)
Ensuite, je présenterai comment différencier l'image.
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)
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)
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.
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)
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é.
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)
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)
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.
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