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

Einführung

Bei der Bildverarbeitung möchten Sie möglicherweise bestimmte Informationen wie Kanten erkennen. Kanten und Rauschen sind plötzliche Änderungen der Pixelwerte. Eine Möglichkeit, diese zu erkennen, besteht darin, "das Bild zu differenzieren".

Dieses Mal werden wir Python verwenden, um das Bild mit OpenCV zu unterscheiden.

Was ist Bilddifferenzierung?

Lassen Sie uns zunächst darüber sprechen, was Differenzierung ist. Die Differenzierung ist eine "kleine Änderung" und repräsentiert die Änderungsrate. Die Formel zur Differenzierung lautet wie folgt.

f'(x) = \lim_{h\rightarrow 0}\frac{f(x+h)-f(x)}{h}

Stellen Sie sich grob gesagt vor, dass es ** darstellt, wie groß die Veränderung ist **.

Die Größe der Differenzierung kann durch die "Neigung" ausgedrückt werden. Je kleiner die Änderung, desto kleiner die Neigung und je größer die Änderung, desto größer die Neigung. Ein Beispiel für ein Differentialdiagramm ist unten dargestellt.

image.png

Der Teil mit kleiner Änderung ist eine blaue gerade Linie, und der Teil mit großer Änderung ist eine rote gerade Linie.

Bei der Bilddifferenzierung wird durch Untersuchen dieser Neigung der Teil erfasst, an dem sich der Pixelwert schnell ändert, dh die Kante.

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. Dieses Mal werde ich das kostenlose Bild von Pixabay verwenden.

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

Zur Bilddifferenzierung verwenden wir außerdem ein Graustufenbild. Bereiten Sie dies vor.

Graustufenbilder können unten angezeigt werden.

img_gray = cv2.imread(path, 0)
cv2_imshow(img_gray)

image.png

Bilddifferenzierung

Dann werde ich vorstellen, wie man das Bild unterscheidet.

Sobel Filter

Lassen Sie uns zunächst den Sobel-Filter einführen. Der Sobel-Filter ist eine einmalige Differenzierung, und ich denke, er kann als die grundlegendste Methode zur Bilddifferenzierung bezeichnet werden.

Bilder, die den Sobel-Filter verwenden, können unten angezeigt werden.

img_sobel = cv2.Sobel(img_gray, cv2.CV_32F, 1, 0, ksize=3)
cv2_imshow(img_sobel)

image.png

cv2.Sobel hat 5 Argumente. Einzelheiten entnehmen Sie bitte den offiziellen Unterlagen. Wenn das dritte Argument 1 ist, wird die Differenzierung in x-Richtung berechnet, und wenn das vierte Argument 1 ist, wird die Differenzierung in y-Richtung berechnet. Im obigen Bild wird das in x-Richtung (horizontale Richtung) differenzierte Bild angezeigt. Das fünfte 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.

Lassen Sie uns nun das 3. und 4. Argument ändern und die in x- bzw. y-Richtung differenzierten Bilder anzeigen.

img_sobel_x = cv2.Sobel(img_gray, cv2.CV_32F, 1, 0, ksize=3)
img_sobel_y = cv2.Sobel(img_gray, cv2.CV_32F, 0, 1, ksize=3)
imgs = cv2.hconcat([img_sobel_x, img_sobel_y])
cv2_imshow(imgs)

image.png

Das Bild links ist in x-Richtung und das Bild rechts in y-Richtung differenziert. Sie können sehen, dass die Differenzierung in x-Richtung (horizontal) die vertikale Kante verlässt und die Differenzierung in y-Richtung (vertikal) die horizontale Kante verlässt.

Wie Sie sehen können, ist es effektiv, den Sobel-Filter zu verwenden, wenn die Kanten gerichtet sind.

Laplace-Filter

Als nächstes werde ich den Laplace-Filter vorstellen. Der Laplace-Filter ist ein doppeltes Differential und effektiv, wenn Sie eine feinere Kantenerkennung als der Sobel-Filter wünschen.

Für alle Fälle ist die Laplace-Formel (zweidimensional) unten dargestellt.

\Delta f = \nabla \cdot \nabla f = \frac{\partial^2}{\partial^2 x}f + \frac{\partial^2}{\partial^2 y}f

Im Gegensatz zum Sobel-Filter müssen Sie die Differenzierungsrichtung nicht angeben.

Das Bild mit dem Laplace-Filter ist wie folgt.

img_lap = cv2.Laplacian(img_gray, cv2.CV_32F)
cv2_imshow(img_lap)

image.png

Sie können sehen, dass der Sobel-Filter feine Kanten erkennen kann. Es kann auch verwendet werden, wenn die Kanten keine bestimmte Ausrichtung haben und der Sobel-Filter nicht aktiviert ist.

Effektive Kantenerkennungsmethode

Bisher haben wir Sobel- und Laplace-Filter verwendet, um Kanten zu erkennen. Durch Differenzieren der Pixelwerte des Bildes ist es möglich, Kanten zu erkennen, bei denen es sich um plötzliche Änderungen der Pixelwerte handelt.

Nicht nur Kanten, sondern auch ** Rauschen sind eine plötzliche Änderung des Pixelwerts **. Bilder enthalten oft eine Vielzahl von Rauschen. Für solche Bilder gibt es eine Möglichkeit, Rauschen zu entfernen, indem zuerst eine ** Glättung ** durchgeführt wird.

Dieses Mal versuchen wir die Kantenerkennung gemäß dem folgenden Verfahren.

img_gauss = cv2.GaussianBlur(img_gray, (3, 3), 3)
img_lap = cv2.Laplacian(img_gauss, cv2.CV_32F)
cv2_imshow(img_lap)

image.png

Canny Abschließend werde ich Cannys Methode vorstellen. Canny ist ein Algorithmus zur Kantenerkennung. Canny unternimmt mehrere Schritte, um Kanten zu erkennen.

Siehe unten für weitere Details. Kantenerkennung mit der Canny-Methode

Lassen Sie uns nun das Bild mit Canny anzeigen.

img_canny = cv2.Canny(img_gray, 100, 200)
cv2_imshow(img_canny)

image.png

Das zweite und dritte Argument sind die Werte, die bei der zweistufigen Schwellenwertverarbeitung verwendet werden. Das zweite Argument gibt den Minimalwert des Schwellenwerts an, und das dritte Argument gibt den Maximalwert des Schwellenwerts an.

Zusammenfassung

Dieses Mal habe ich Python verwendet, um das Bild mit OpenCV zu unterscheiden.

Ich habe den Sobel-Filter, den Laplace-Filter und die Canny-Methode als Methoden zur Unterscheidung von Bildern eingeführt. Bitte verwenden Sie es entsprechend den Eigenschaften der Kante, die Sie erkennen möchten. Die Differenzierung ist eine Methode zur Erkennung plötzlicher Änderungen der Pixelwerte, reagiert jedoch nicht nur auf Kanten, sondern auch auf Rauschen. Wenn Sie daher nur die Kanten erkennen möchten, müssen Sie das Rauschen im Voraus entfernen. Berücksichtigen Sie zur Geräuschentfernung die Glättung.

Weitere Informationen zur Bilddifferenzierung und -glättung finden Sie weiter unten.

Recommended Posts

Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Bildbearbeitung mit Python OpenCV
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Python Open CV hat versucht, das Bild im Text anzuzeigen.
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
Ich habe versucht, WebScraping mit Python.
Ich mochte den Tweet mit Python. ..
Finden Sie Bildähnlichkeit mit Python + OpenCV
Versuchen Sie, das Bild mit opencv2 zu verwischen
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
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, das Gesicht aus dem Video zu erkennen (OpenCV: Python-Version)
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Bildaufnahme von der Kamera mit Python + OpenCV
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Ich habe mit Jupyter eine einfache Bilderkennung versucht
Leichte Bildverarbeitung mit Python x OpenCV
Ich habe das Python Tornado Testing Framework ausprobiert
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Ich habe versucht, die Videowiedergabezeit anzuzeigen (OpenCV: Python-Version)
Ich habe das Objekt gerade mit Image Repair (Inpaint) (OpenCV: Python) gelöscht.
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
[Python] Ich habe versucht, den Funktionsnamen durch den Funktionsnamen zu ersetzen
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
Binarisierung mit OpenCV / Python
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.