Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"

Einführung

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.

Was ist Morphologieumwandlung?

** 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.

Vorbereitung

Die Umgebung verwendet Google Colaboratory. Die Python-Version ist unten.

import platform
print("python " + platform.python_version())
# python 3.6.9

Lassen Sie uns das Bild anzeigen

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)

image.png

Das Graustufenbild ist unten.

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2_imshow(img_gray)

image.png

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)

image.png

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)

image.png

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)

image.png

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)

image.png

Morphologie-Transformation

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

Erosion

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)

image.png

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)

image.png

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)

image.png

Wiederum wird der Verkleinerungsprozess für die Anzahl der Iterationen wiederholt. Je größer der Wert, desto stärker wird geschrumpft.

Erweiterung

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)

image.png

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.

Öffnungsprozess

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)

image.png

Als Ergebnis des Öffnungsvorgangs können Sie sehen, dass das weiße Rauschen entfernt wurde.

Schließvorgang (Schließen)

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)

image.png

Als Ergebnis des Schließvorgangs können Sie sehen, dass das schwarze Rauschen entfernt wurde.

Morphologie-Gradient

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)

image.png

Sie können sehen, dass der Umriss des Objekts aufgenommen wurde.

Zusammenfassung

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

Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Versuchen Sie, die Bildkonvertierung mit OpenCV mit Python zu projizieren
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, GrabCut von OpenCV zu verwenden
Laden Sie das GIF-Bild mit Python + OpenCV
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Grundlegendes Studium von OpenCV mit Python
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Bilder mit Pupil, Python und OpenCV aufnehmen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe eine funktionale Sprache mit Python ausprobiert
[python, openCV] base64 Gesichtserkennung in Bildern
[Python] Bilder mit OpenCV lesen (für Anfänger)
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe verschiedene Versionen der Python + OpenCV + FFmpeg-Umgebung auf dem Mac ausprobiert
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, Runenfiguren mit Scikit-Learn handschriftlich zu erkennen
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Leistungsvergleich des Gesichtsdetektors mit Python + OpenCV
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Ich habe Flask mit Remote-Containern von VS Code ausprobiert
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, mit Python Faiss zu laufen, Go, Rust
Wavelet-Konvertierung von Bildern mit PyWavelets und OpenCV
Ich habe versucht, Deep Floor Plan mit Python 3.6.10 auszuführen.
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Binarisierung mit OpenCV / Python
Ich habe Python> autopep8 ausprobiert
Ich habe Python> Decorator ausprobiert
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
"Round of MD5-Hashwert des 6-stelligen Passworts" Ich habe es mit Python versucht
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet