OpenCV Dilate
Dieser Artikel erklärt die morphologischen Transformationskonzepte wie Erosion und Dilatation, die wir verwenden, um Pixel von der Grenze eines bestimmten Objekts in einem Bild in OpenCV hinzuzufügen und zu entfernen.
Morphologische Transformation auf ein Bild anwenden mit Erosion und Dilatation in OpenCV
Die morphologischen Transformationen sind bildbasierte Operationen, die an Binärbildern durchgeführt werden. Es erfordert zwei Eingaben, eine ist das Originalbild und die zweite ist der Kernel.
Der Kernel entscheidet über die Art der Operation. Zwei grundlegende morphologische Operatoren sind Erosion und Dilatation, und wir haben auch einige ihrer Variationen wie Öffnen und Schließen usw.
Machen wir uns anhand eines Beispiels mit Erosion und Dilatation vertraut.
Die Erosion ist wie die Bodenerosion; es erodiert die Grenzen eines Vordergrundobjekts. Betrachten Sie dieses Bild von L
, bei dem der weiße Teil die Nummer 1 ist, die aus Sicht des OpenCV-Standards auch als Nummer 255 behandelt werden kann.
Die Erosion entfernt das Pixel an den Grenzen eines Objekts in einem gegebenen Bild. Nach dem Entfernen der Grenzen dieses Objekts L
im Bild wird dieses nach Anwendung der Erosion dünn.
Technisch gesehen gleitet der Kern wie bei einer 2D-Faltung durch das Bild. Ein Pixel im Originalbild, entweder 1 oder 0, wird nur dann als 1 betrachtet, wenn alle Pixel unter dem Kernel 1 sind; andernfalls wird es erodiert oder auf Null gesetzt, wodurch die Grenze in Abhängigkeit von der Größe des Kernels verworfen wird.
Die Dilatation ist das Gegenteil von Erosion; es fügt den Grenzen eines Objekts im gegebenen Bild Pixel hinzu. Wir können sehen, dass die Grenze von L
oder Objekt L
im Bild nach der Dilatation dicker wird.
Technisch gesehen ist ein Pixelelement 1, wenn mindestens ein Pixel unter dem Kernel 1 ist, und sein Ergebnis erhöht den weißen Bereich im Bild oder die Größe des Vordergrundobjekts.
Wenn Sie also ein Bild haben, in dem Sie das Rauschen entfernen möchten, können Sie zuerst eine Erosionsoperation gefolgt von einer Dilatation anwenden, da die Erosion weißes Rauschen entfernt, aber auch unser Objekt verkleinert; Deshalb führen wir eine Dilatation durch und bewahren so das ursprüngliche Bild. Es ist auch nützlich, um gebrochene Teile des Objekts zu verbinden.
Die morphologischen Transformationen haben Variationen wie Öffnen und Schließen; Das Öffnen ist ein Prozess, bei dem wir Erosion gefolgt von Dilatation anwenden. Das Schließen ist genau das Gegenteil, wo wir eine Dilatation anwenden, gefolgt von Erosion.
Lassen Sie uns mehrere Operationen mit OpenCV implementieren. Wir müssen die erforderlichen Bibliotheken importieren.
In dieser Zeile lesen wir unser Bild mit der Funktion imread()
und geben den Pfad des Bildes als Argument an und speichern ihn in einer Variablen namens imagedata_original
.
imagedata_original = cv2.imread("input.png")
In diesem Code definieren wir den Kernel des Pixels 5x5
mit der Funktion numpy
ones()
und der Datentyp des Kernels ist unsigned int
.
kernel = np.ones((5, 5), np.uint8)
Wir verwenden die Funktion erode()
, um die Erosion in der nächsten Zeile anzuwenden. Es benötigt mehrere Argumente wie das Originalbild, den Kernel und Iterationen.
Die Iterationen
geben an, wie oft Sie den Erosionsprozess durchlaufen möchten. Wenn Sie diese Zahl erhöhen, verstärken Sie den Effekt der Erosion.
erosion_op = cv2.erode(imagedata_original, kernel, iterations=1)
Wir werden die Funktion dilate()
verwenden, um eine Dilatation auf ein Bildobjekt anzuwenden. Die Argumente ähneln denen, die in der Funktion erode()
definiert sind.
dilation_op = cv2.dilate(imagedata_original, kernel, iterations=1)
Jetzt verwenden wir die Funktion morphologyEx()
, um die Öffnungsoperation anzuwenden. Diese Funktion nimmt Argumente wie das Eingabebild MORPH_OPEN
, das die anzuwendende Öffnungsoperation angibt, und den Kernel, den wir oben definiert haben.
opening_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_OPEN, kernel)
Wir geben die nächste Anweisung, um die Schließoperation auf die Funktion morphologyEx()
anzuwenden.
closing_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_CLOSE, kernel)
Vollständiger Quellcode:
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()
Lassen Sie uns die verschiedenen Ausgaben mit verschiedenen Operationen in einem Bild mit matplotlib
ausführen und sehen.
Die meisten Leute könnten verwirrt sein, warum der Text im erodierten Bild dick erscheint, wenn er Pixel von der Grenze entfernt? Warum der Text für das dilatierte Bild dünn erscheint, wenn Pixel zur Grenze des Objekts hinzugefügt werden.
Dies liegt daran, dass OpenCV den weißen Teil als Objekt selbst behandelt, anstatt schwarzen Text als Objekt im Bild zu behandeln. Wenn wir also eine Erosionsoperation anwenden, werden die weißen Pixel von der schwarzen Grenze entfernt, weshalb die schwarze Textgrenze dick wird.
Die Dehnungsoperation fügt die weißen Pixel zur Grenze des schwarzen Textes hinzu; Deshalb wird der schwarze Text dünn.
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