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.
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.
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.
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. 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)
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)
Dann werde ich vorstellen, wie man das Bild unterscheidet.
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)
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)
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.
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)
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.
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)
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)
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.
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