Die Bildverarbeitung liefert nicht immer schöne Bilder. Es ist oft unklar oder laut. Wenn es Rauschen gibt, kann es mit einer als Glätten bezeichneten Technik entfernt werden. Alternativ können Sie absichtlich ein verschwommenes Bild erstellen und es als Dummy-Daten verwenden.
Dieses Mal werden wir Python verwenden, um das Bild mit OpenCV zu glätten.
Das Glätten oder Glätten verwischt einfach das Bild. Man kann auch sagen, dass das Verwischen des Bildes die Änderung des Pixelwerts glättet. Rauschen und Kanten sind plötzliche Änderungen der Pixelwerte. Durch das Glätten können Kanten beseitigt oder weniger auffällig gemacht werden.
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)
Bereiten Sie außerdem ein Bild mit Rauschen vor, damit Sie es später benötigen. Fügen wir hier dem Bild ein Rauschen hinzu, das als "Salz-Pfeffer-Rauschen" (auch als Sesamsalz-Rauschen bezeichnet) bezeichnet wird.
# salt-and-pepper noise
#Code siehe unten
# https://lp-tech.net/articles/nCvfb?page=2
import numpy as np
row, col, ch = img.shape
img_sp = cv2.imread(path)
# salt
pts_x = np.random.randint(0, col-1 , 1000)
pts_y = np.random.randint(0, row-1 , 1000)
img_sp[(pts_y,pts_x)] = (255, 255, 255)
# pepper
pts_x = np.random.randint(0, col-1 , 1000)
pts_y = np.random.randint(0, row-1 , 1000)
img_sp[(pts_y, pts_x)] = (0, 0, 0)
cv2_imshow(img_sp)
Durch das Glätten wird das Bild einfach unscharf. Der einfachste Weg, ein Bild mit OpenCV zu glätten, ist die Verwendung von cv2.blur. Unschärfe bedeutet hier "Unschärfe".
Lassen Sie uns nun das geglättete Bild anzeigen. Ich werde es neben dem Originalbild anzeigen.
img_blur = cv2.blur(img, (3, 3))
imgs = cv2.hconcat([img, img_blur])
cv2_imshow(imgs)
Das linke ist das Originalbild und das rechte ist das geglättete Bild. Sie können sehen, dass der richtige etwas unscharf ist.
Es gibt zwei Argumente für cv2.blur. Das erste ist das Eingabebild. Der zweite heißt Kernel. 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.
Im obigen Beispiel ist es (3, 3), was bedeutet, dass es auf einen 3x3-Bereich abzielt, der auf einem Punkt im Bild zentriert ist. In cv2.blur, einer allgemeinen Glättung, wird das Innere des Kernels mit dem Durchschnittswert der Pixel in diesem Kernel gefüllt. Je größer der Kernel ist, desto stärker ist die Unschärfe des Bildes.
Lassen Sie uns ein Bild mit verschiedenen geänderten Kernelgrößen anzeigen.
img1 = cv2.blur(img, (1, 1))
img2 = cv2.blur(img, (2, 2))
img3 = cv2.blur(img, (3, 3))
img4 = cv2.blur(img, (4, 4))
img5 = cv2.blur(img, (5, 5))
img6 = cv2.blur(img, (6, 6))
imgs_1 = cv2.hconcat([img1, img2, img3])
imgs_2 = cv2.hconcat([img4, img5, img6])
imgs = cv2.vconcat([imgs_1, imgs_2])
cv2_imshow(imgs)
Von oben links wird das Bild mit vergrößerter Kernelgröße angezeigt. Sie können sehen, dass die Unschärfe des Bildes immer stärker wird.
Neben der allgemeinen Glättung ermöglicht OpenCV einige Glättungsprozesse.
Als nächstes werde ich einen Gaußschen Filter einführen. Bei der allgemeinen Glättung werden die Pixel im Kernel mit einem festen Wert gefüllt, der als Durchschnittswert bezeichnet wird. Bei Gaußschen Filtern ändert sich der Wert in Abhängigkeit vom Abstand von der Mitte des Kernels. Der Wert ist in der Mitte am höchsten und nimmt mit zunehmendem Abstand ab. Es wird als Gauß-Filter bezeichnet, da es einer Funktion folgt, die als Gauß-Funktion bezeichnet wird. Die Formel für die Gaußsche Funktion lautet:
\frac{1}{\sqrt{2\pi\sigma^2}}\exp\Bigl(-\frac{x^2}{2\sigma^2}\Bigr) \\
Zusätzlich ist der Graph der Gauß-Funktion wie folgt.
Lassen Sie uns nun das Bild mit einem Gaußschen Filter glätten. Ich werde es auch neben dem Originalbild anzeigen.
img_gauss = cv2.GaussianBlur(img, (3, 3), 3)
imgs = cv2.hconcat([img, img_gauss])
cv2_imshow(imgs)
cv2.GaussianBlur hat drei Argumente. Die ersten beiden sind das Eingabebild und die Kernelgröße, ähnlich wie bei cv2.blur. Das dritte Argument entspricht der Gaußschen Funktion $ \ sigma $. Wenn $ \ sigma $ klein ist, ist der Peak höher, aber der Spread ist schmaler. Umgekehrt ist der Spread umso größer, je größer $ \ sigma $ ist, aber desto niedriger ist der Peak.
Als nächstes werde ich den Medianfilter einführen. Median ist der "Medianwert", der den Medianwert aus den im angegebenen Kernel enthaltenen Pixeln entnimmt und den gesamten Kernel mit diesem Wert füllt.
img_med = cv2.medianBlur(img, 3)
imgs = cv2.hconcat([img, img_med])
cv2_imshow(imgs)
Vergleichen wir das Bild mit dem Medianfilter mit dem Originalbild. cv2.medianBlur hat zwei Argumente, das Eingabebild und die Kernelgröße. Oben ist das zweite Argument 3, was einen 3x3-Kernel darstellt. Dieser Medianfilter ist sehr nützlich, um Salz- und Pfeffergeräusche zu entfernen. Tatsächlich ist das Ergebnis der Anwendung des Medianfilters auf das verrauschte Bild wie folgt. Sie können sehen, dass es sauber entfernt wurde.
Abschließend möchte ich einen bilateralen Filter einführen.
Bilateral bedeutet "beide sind", aber dieser Filter kann Kanten schön hinterlassen. Bisher haben Glättungsfilter Spitzen wie Kanten verwischt. Der bilaterale Filter ist ein praktischer Filter, mit dem Sie das Bild verwischen können, während Sie Kanten verlassen. Lassen Sie es uns zusammen mit dem Originalbild ausgeben.
img_bi = cv2.bilateralFilter(img, 9, 75, 75)
imgs = cv2.hconcat([img, img_bi])
cv2_imshow(imgs)
Sie können sehen, dass die Kanten fest bleiben, obwohl sie insgesamt glatt sind.
Ich werde die Details des Arguments von cv2.bilateralFilter weglassen. Bitte beachten Sie das offizielle Dokument von OpenCV.
Dieses Mal habe ich Python verwendet, um das Bild mit OpenCV zu glätten.
Wenn Ihre Bildverarbeitung eine Rauschentfernung erfordert, versuchen Sie es mit einer Glättung.
Weitere Informationen zum Glätten finden Sie im Folgenden.
Recommended Posts