Die Bildverarbeitung liefert nicht immer schöne Bilder. Das Bild ist oft verrauscht. Wenn es Rauschen gibt, kann es mit einer Technik entfernt werden, die als "Glätten" oder "Morphologieumwandlung" bezeichnet wird.
Dieses Mal werden wir Python verwenden, um eine morphologische Konvertierung des Bildes durch OpenCV durchzuführen.
** Die Morphologiekonvertierung ** dient hauptsächlich dazu, die Verarbeitung "** Kontraktion " und " Erweiterung **" für Binärbilder durchzuführen. Morphologie ist ein Prozess, der mit "Morphologie", dh Form, zusammenhängt.
Ein "Binärbild" ist ein binärisiertes Bild. Bei der Binarisierung wird ein Bild in zwei Abstufungen umgewandelt, Weiß und Schwarz.
Die Umgebung verwendet Google Colaboratory. Die Python-Version ist unten.
import platform
print("python " + platform.python_version())
# python 3.6.9
Jetzt schreiben wir den Code. Importieren Sie zunächst OpenCV.
import cv2
Importieren Sie außerdem Folgendes, um das Bild in Colaboratory anzuzeigen.
from google.colab.patches import cv2_imshow
Bereiten Sie auch ein Beispielbild vor.
Lassen Sie uns nun das vorbereitete Beispielbild anzeigen.
img = cv2.imread(path) #Pfad gibt an, wo das Bild platziert wird
cv2_imshow(img)
Das Graustufenbild ist unten.
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2_imshow(img_gray)
Das binärisierte Bild des Graustufenbildes ist wie folgt. Dieses Mal habe ich den Schwellenwert auf 180 gesetzt.
threshold = 180
_, img_th = cv2.threshold(img_gray, threshold, 255, cv2.THRESH_BINARY)
cv2_imshow(img_th)
Lassen Sie uns außerdem ein invertiertes Schwarzweißbild des binärisierten Bildes anzeigen. Ich werde eine Morphologiekonvertierung für dieses Bild durchführen.
img_bw = cv2.bitwise_not(img_th)
cv2_imshow(img_bw)
Bereiten Sie außerdem ein Bild mit Rauschen als Bild vor, das später verwendet werden soll. Dieses Mal habe ich zwei Arten von Bildern mit Rauschen unter Verwendung von Salz-Pfeffer-Rauschen vorbereitet.
import numpy as np
row, col, ch = img.shape
img_s = img.copy()
img_p = img.copy()
pts_x = np.random.randint(0, col-1 , 1000)
pts_y = np.random.randint(0, row-1 , 1000)
img_s[(pts_y,pts_x)] = (255, 255, 255)
img_p[(pts_y,pts_x)] = (0, 0, 0)
imgs = cv2.hconcat([img_s, img_p])
cv2_imshow(imgs)
Diese Bilder sollten auch Graustufen, binärisiert und schwarz-weiß invertiert sein.
#Graustufen
img_s = cv2.cvtColor(img_s, cv2.COLOR_BGR2GRAY)
img_p = cv2.cvtColor(img_p, cv2.COLOR_BGR2GRAY)
#Binarisierung
threshold = 180
_, img_s = cv2.threshold(img_s, threshold, 255, cv2.THRESH_BINARY)
_, img_p = cv2.threshold(img_p, threshold, 255, cv2.THRESH_BINARY)
#Schwarz-Weiß-Inversion
img_s = cv2.bitwise_not(img_s)
img_p = cv2.bitwise_not(img_p)
imgs = cv2.hconcat([img_s, img_p])
cv2_imshow(imgs)
Lassen Sie uns nun vorstellen, wie die Morphologiekonvertierung für ein Bild durchgeführt wird.
Importieren Sie numpy im Voraus, um es im Folgenden zu verwenden.
import numpy as np
Schrumpfen Sie mit der Erosion ** die weißen Bereiche **. Infolgedessen werden die weißen Bereiche kleiner und dünner und die schwarzen Bereiche nehmen zu. Dies ist ein effektiver Prozess zum Entfernen von weißem Rauschen in einem Bild oder zum Trennen mehrerer verbundener Objekte.
Lassen Sie uns nun das verkleinerte Bild neben dem Originalbild anzeigen.
kernel = np.ones((3, 3), np.uint8)
img_ero = cv2.erode(img_bw, kernel, iterations=1)
imgs = cv2.hconcat([img_bw, img_ero])
cv2_imshow(imgs)
Sie können sehen, dass der weiße Teil kleiner und dünner als das Originalbild ist.
Es gibt drei Argumente für cv2.erode. Das erste Argument ist das Zielbild. Das zweite Argument heißt Kernelgröße. Wenn ein Punkt des Bildes festgelegt ist, wird angezeigt, wie viel Fläche um das Bild herum enthalten ist. Betrachten Sie es als die Größe einer Box. Das dritte Argument ist eine sogenannte Iteration. Iteration bedeutet "Iteration", und hier geben Sie an, wie oft der Prozess ausgeführt werden soll. Oben wird der Kontraktionsprozess nur einmal durchgeführt.
Lassen Sie uns nun das verkleinerte Bild anzeigen, indem Sie den Wert für die Kernelgröße auf verschiedene Arten ändern.
kernel_1 = np.ones((1, 1), np.uint8)
kernel_2 = np.ones((3, 3), np.uint8)
kernel_3 = np.ones((5, 5), np.uint8)
img_1 = cv2.erode(img_bw, kernel_1, iterations=1)
img_2 = cv2.erode(img_bw, kernel_2, iterations=1)
img_3 = cv2.erode(img_bw, kernel_3, iterations=1)
imgs = cv2.hconcat([img_1, img_2, img_3])
cv2_imshow(imgs)
Sie können sehen, dass je größer der Kernel ist, desto mehr schrumpft er und die weißen Bereiche werden kleiner und dünner.
Als nächstes zeigen wir das verkleinerte Bild an, indem wir den Iterationswert auf verschiedene Arten ändern.
kernel = np.ones((3, 3), np.uint8)
img_1 = cv2.erode(img_bw, kernel, iterations=1)
img_2 = cv2.erode(img_bw, kernel, iterations=3)
img_3 = cv2.erode(img_bw, kernel, iterations=5)
imgs = cv2.hconcat([img_1, img_2, img_3])
cv2_imshow(imgs)
Wiederum wird der Verkleinerungsprozess für die Anzahl der Iterationen wiederholt. Je größer der Wert, desto stärker wird geschrumpft.
Dilatation ** erweitert die weißen Bereiche **. Dies ist die Umkehrung der Kontraktion. Mit anderen Worten, infolgedessen werden die schwarzen Bereiche kleiner und dünner und die weißen Bereiche nehmen zu.
Lassen Sie uns nun das erweiterte Bild neben dem Originalbild anzeigen.
img_dil = cv2.dilate(img_bw, kernel, iterations = 1)
imgs = cv2.hconcat([img_bw, img_dil])
cv2_imshow(imgs)
Sie können sehen, dass der weiße Teil dicker und größer als das Originalbild ist.
Die Argumente für cv2.dilate ähneln denen für die Kontraktion cv2.erode.
Der Eröffnungsprozess ist der Prozess der Erweiterung nach dem Vertragsabschluss. Der weiße Teil kann durch Schrumpfen verkleinert werden, und die Größe kann durch Erweitern wiederhergestellt werden. Daher ist es ein wirksames Verfahren zum Entfernen von ** weißem Rauschen **.
Lassen Sie uns das Bild mit Rauschen und das Bild mit dem Öffnungsvorgang nebeneinander anzeigen.
img_opening = cv2.morphologyEx(img_p, cv2.MORPH_OPEN, kernel)
imgs = cv2.hconcat([img_p, img_opening])
cv2_imshow(imgs)
Als Ergebnis des Öffnungsvorgangs können Sie sehen, dass das weiße Rauschen entfernt wurde.
Der Schließvorgang ist die Umkehrung des Öffnungsvorgangs. Der schwarze Teil kann durch Expansion verkleinert werden, und die Größe kann durch Kontraktion wiederhergestellt werden. Daher ist es ein wirksames Verfahren zum Entfernen von ** schwarzem Rauschen **.
Lassen Sie uns das Bild mit Rauschen und das Bild mit schließender Verarbeitung nebeneinander anzeigen.
img_closing = cv2.morphologyEx(img_s, cv2.MORPH_CLOSE, kernel)
imgs = cv2.hconcat([img_s, img_closing])
cv2_imshow(imgs)
Als Ergebnis des Schließvorgangs können Sie sehen, dass das schwarze Rauschen entfernt wurde.
Der Morphologie-Gradient ist der Prozess, bei dem der Unterschied zwischen einem erweiterten Bild und einem kontrahierten Bild ermittelt wird. Dies führt zur Konturierung des Objekts.
Lassen Sie uns ein Bild mit einem Morphologiegradienten anzeigen.
img_gradient = cv2.morphologyEx(img_bw, cv2.MORPH_GRADIENT, kernel)
cv2_imshow(img_gradient)
Sie können sehen, dass der Umriss des Objekts aufgenommen wurde.
Dieses Mal habe ich Python verwendet, um die morphologische Konvertierung des Bildes durch OpenCV durchzuführen.
Als Morphologieumwandlung haben wir "Kontraktion", "Expansion", "Öffnungsprozess", "Schließprozess" und "Morphologiegradient" eingeführt. Insbesondere der Öffnungsprozess und der Schließprozess sind wirksame Verfahren zum Entfernen von feinem Rauschen. Erwägen Sie eine Öffnungsbehandlung für weißes Rauschen und eine Schließbehandlung für schwarzes Rauschen.
Es gibt auch eine Methode namens "Glätten", um Rauschen zu entfernen. Ich denke, Sie sollten dies auch versuchen.
Weitere Informationen zu Morphologietransformationen und Glättung finden Sie weiter unten.
Recommended Posts