Filtre médian OpenCV
Dans cette démonstration, nous apprendrons ce qu’est un filtre médian et discuterons de deux types de filtres médians dans OpenCV. Ensuite, nous apprendrons également à supprimer le bruit poivre et sel d’une image à l’aide de ces filtres médians.
Supprimer le bruit sel et poivre d’une image à l’aide du filtre médian dans OpenCV
Intéressons-nous au filtre médian, excellent pour le débruitage, notamment les bruits de type poivre et sel. Avant de sauter dans une leçon rapide sur la médiane, nous savons tous que la moyenne n’est rien d’autre que la moyenne de tous les nombres et l’exemple typique que les gens utilisent.
Par exemple, vous vivez dans un quartier où votre maison se situe entre 350 000, 425 000, etc. Vous avez probablement quelques riches qui vivent dans votre quartier, quelque part en haut de la colline, dont les maisons valent 2,2 millions, 3,2 millions, etc.
Supposons que vous regardiez la moyenne de tous ces éléments et que vous voyiez 931 500, ce qui vous a surpris. Vous penseriez probablement que 931 500 est le prix moyen d’une maison ; c’est pourquoi vous regardez toujours la médiane des prix des maisons.
Regardez la médiane de ces valeurs ; il s’agit de 512 500, ce qui représente mieux l’écart que la moyenne. Ce sont les statistiques que vous avez probablement apprises en cinquième ou sixième année, et la raison pour laquelle nous mentionnons cela est que nous les démontrerons dans cette image.
L’image ci-dessous est ajoutée artificiellement avec beaucoup de bruit poivre et sel, et nous pouvons voir de nombreux pixels sombres et lumineux. Si on zoome, on voit cette région qui est censée être uniformément grise.
Pourquoi ces bruits poivre et sel apparaissent-ils ? Pour de nombreuses raisons, la principale source de bruit sel et poivre est là, en particulier dans les appareils électroniques plus anciens que vous utilisiez pour capturer vos images où la conversion analogique-numérique pose certains problèmes.
Le flou gaussien est correct mais pas excellent pour nettoyer ce type de bruit, et techniquement, le filtre médian devrait faire un meilleur travail. Si vous regardez attentivement, tous ces éléments sont à peu près gris de manière homogène, à l’exception de ce pixel qui apparaît comme un pixel brillant.
Si nous appliquons un noyau 3x3 et regardons la valeur médiane, nous regardons tout ce qui entoure ce pixel central. La médiane de tous ces nombres à l’intérieur de cette boîte rouge est de 140.
Si on remplace le 255 par du 140, on obtient une très belle image uniforme et homogène.
Il s’agit d’une représentation graphique rapide en images, alors sautons dans le code Python. Nous allons commencer par importer cv2
et médiane
depuis skimage.filters
pour démontrer l’utilisation de la médiane dans les deux packages.
Nous importons deux images, une image pour le poivre et le sel et une pour le redimensionner. Nous devons utiliser la méthode medianBlur()
, lui passer une image et définir la taille du noyau sur 3.
import cv2
from skimage.filters import median
SP_IMG = cv2.imread("inp.tif", 0)
IMG = cv2.resize(SP_IMG, (720, 600))
IMG = IMG
Opencv_Median = cv2.medianBlur(IMG, 3)
Maintenant, nous utilisons la même terminologie. Le skimage
est très similaire, sauf qu’il définit votre noyau et utilise quelque chose que nous appelons disque.
Nous devons appeler la méthode median()
du package skimage
et transmettre une image. Au lieu de la taille du noyau, nous créons une taille de disque.
Lorsque nous imprimons un disque, il crée une matrice où zéro pixel est multiplié par zéro, et ces pixels sont multipliés par un lorsqu’il se déplace au-dessus de votre image.
Passons maintenant l’argument mode
. Ce n’est rien, mais comment gérez-vous les pixels de fin lorsque ce noyau arrive à la fin de l’image ?
Comme il n’y a rien à sa droite, il ajoutera quelques pixels avec une valeur constante.
Exemple de code :
from skimage.morphology import disk
import cv2
from skimage.filters import median
SP_IMG = cv2.imread("inp.tif", 0)
IMG = cv2.resize(SP_IMG, (720, 600))
IMG = IMG
Opencv_Median = cv2.medianBlur(IMG, 3)
print(disk(3))
SK_Median = median(IMG, disk(3), mode="constant", cval=0.0)
cv2.imshow("Original", IMG)
cv2.imshow("cv2 median", Opencv_Median)
cv2.imshow("Using skimage median", SK_Median)
cv2.waitKey(0)
cv2.destroyAllWindows()
Nous avons trois sorties, et l’une est une image originale avec un peu de bruit gaussien.
La deuxième sortie est l’image médiane utilisant OpenCV. Dans cette sortie, le résultat est meilleur que l’image d’origine.
Si nous regardons la sortie suivante en utilisant la médiane skimage
, elle semble très propre, sans rien en arrière-plan.
Nous pouvons observer que la médiane skimage
est encore meilleure que la médiane OpenCV car la taille du noyau est un peu plus petite pour cette médiane et pas très propre par rapport à l’image d’origine. Pourquoi les images de sortie médianes skimage
et OpenCV ne se ressemblent-elles pas ?
Dans la médiane skimage
, on définit une taille de disque, et dans la médiane OpenCV, on définit une taille de noyau.
Les tailles de noyau sont différentes ; par conséquent, les sorties semblent légèrement différentes. Le calcul sera le même si vous obtenez la même taille de noyau.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn