OpenCV Dilate
Cet article expliquera les concepts de transformation morphologique tels que l’érosion et la dilatation, que nous utilisons pour ajouter et supprimer des pixels de la limite d’un objet donné dans une image dans OpenCV.
Appliquer la transformation morphologique sur une image à l’aide de l’érosion et de la dilatation dans OpenCV
Les transformations morphologiques sont des opérations basées sur l’image qui sont effectuées sur des images binaires. Il nécessite deux entrées, l’une est l’image d’origine et la seconde est le noyau.
Le noyau décide de la nature de l’opération. Deux opérateurs morphologiques de base sont l’érosion et la dilatation, et nous avons également certaines de ses variations telles que l’ouverture et la fermeture, etc.
Comprenons l’érosion et la dilatation à l’aide d’un exemple.
L’érosion est comme l’érosion du sol; il érode les limites d’un objet de premier plan. Considérez cette image de L
où la partie blanche est le numéro 1, qui peut également être traitée comme le numéro 255 du point de vue de la norme OpenCV.
L’érosion supprime le pixel aux limites d’un objet dans une image donnée. Après avoir enlevé les limites de cet objet L
dans l’image, celui-ci devient mince après l’application de l’érosion.
Le noyau glisse à travers l’image comme dans la convolution 2D en termes techniques. Un pixel de l’image d’origine, soit 1 soit 0, ne sera considéré comme 1 que si tous les pixels sous le noyau sont 1 ; sinon, il est érodé ou ramené à zéro, supprimant ainsi la frontière en fonction de la taille du noyau.
La dilatation est le contraire de l’érosion ; il ajoute des pixels aux limites d’un objet dans l’image donnée. Nous pouvons voir que la limite de L
ou de l’objet L
dans l’image devient plus épaisse après la dilatation.
En termes techniques, un élément pixel est 1 si au moins un pixel sous le noyau est 1, et son résultat augmentera la région blanche dans l’image ou la taille de l’objet de premier plan.
Donc, si vous avez une image dans laquelle vous souhaitez supprimer le bruit, vous pouvez d’abord appliquer une opération d’érosion suivie d’une dilatation car l’érosion supprime les bruits blancs, mais elle rétrécit également notre objet. c’est pourquoi on opère une dilatation, préservant ainsi l’image d’origine. Il est également utile pour joindre des parties cassées de l’objet.
Les transformations morphologiques ont des variations comme l’ouverture et la fermeture ; l’ouverture est un processus où nous appliquons une érosion suivie d’une dilatation. La fermeture est tout le contraire, où nous appliquons une dilatation suivie d’une érosion.
Implémentons plusieurs opérations en utilisant OpenCV. Nous devons importer les bibliothèques requises.
Dans cette ligne, nous lisons notre image en utilisant la fonction imread()
et donnons le chemin de l’image comme argument et le stockons dans une variable appelée imagedata_original
.
imagedata_original = cv2.imread("input.png")
Dans ce code, nous définissons le noyau du pixel 5x5
à l’aide de la fonction numpy
ones()
et le type de données du noyau est unsigned int
.
kernel = np.ones((5, 5), np.uint8)
Nous utilisons la fonction erode()
pour appliquer l’érosion dans la ligne suivante. Il prend plusieurs arguments comme l’image d’origine, le noyau et les itérations.
Les itérations
suggèrent combien de fois vous voulez exécuter le processus d’érosion. Si vous augmentez ce nombre, vous augmentez l’effet de l’érosion.
erosion_op = cv2.erode(imagedata_original, kernel, iterations=1)
Nous allons utiliser la fonction dilate()
pour appliquer une dilatation à un objet image. Les arguments sont similaires à ceux définis dans la fonction erode()
.
dilation_op = cv2.dilate(imagedata_original, kernel, iterations=1)
Nous allons maintenant utiliser la fonction morphologyEx()
pour appliquer l’opération d’ouverture. Cette fonction prend des arguments comme l’image d’entrée MORPH_OPEN
, qui signifie l’opération d’ouverture à appliquer, et le noyau que nous avons défini plus haut.
opening_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_OPEN, kernel)
Nous donnons la prochaine instruction pour appliquer l’opération de fermeture à la fonction morphologyEx()
.
closing_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_CLOSE, kernel)
Code source complet :
import cv2
import numpy as np
import matplotlib.pyplot as plot
FIG = plot.figure(figsize=(6, 5))
imagedata_original = cv2.imread("input.png")
FIG.add_subplot(2, 3, 1)
plot.imshow(imagedata_original)
plot.axis("off")
plot.title("original imagge")
kernel = np.ones((5, 5), np.uint8)
erosion_op = cv2.erode(imagedata_original, kernel, iterations=1)
FIG.add_subplot(2, 3, 2)
plot.imshow(erosion_op)
plot.axis("off")
plot.title("Erossion operatiopn")
dilation_op = cv2.dilate(imagedata_original, kernel, iterations=1)
FIG.add_subplot(2, 3, 3)
plot.imshow(dilation_op)
plot.axis("off")
plot.title("Dilation operatiopn")
opening_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_OPEN, kernel)
FIG.add_subplot(2, 3, 4)
plot.imshow(opening_op)
plot.axis("off")
plot.title("Opening operatiopn")
closing_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_CLOSE, kernel)
FIG.add_subplot(2, 3, 5)
plot.imshow(closing_op)
plot.axis("off")
plot.title("Clossing operatiopn")
plot.tight_layout()
plot.show()
Exécutons et voyons les différentes sorties avec différentes opérations dans une image en utilisant matplotlib
.
La plupart des gens pourraient se demander pourquoi le texte de l’image érodée est apparu épais lorsqu’il a supprimé des pixels de la limite ? Pourquoi le texte de l’image dilatée apparaît mince lorsqu’il ajoute des pixels à la limite de l’objet.
En effet, OpenCV a traité la partie blanche comme un objet lui-même plutôt que de traiter le texte noir comme un objet dans l’image. Ainsi, lorsque nous appliquons une opération d’érosion, elle supprime les pixels blancs de la limite du noir, c’est pourquoi la limite du texte noir devient épaisse.
L’opération de dilatation ajoute les pixels blancs à la limite du texte noir ; c’est pourquoi le texte noir s’amincit.
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