Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"

Einführung

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.

Was ist Glättung?

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.

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

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)

image.png

Glätten

Allgemeine Glättung

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)

image.png

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)

image.png

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.

Gaußscher Filter

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.

image.png

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)

image.png

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.

Medianfilter

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)

image.png

image.png

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.

bilateraler Filter

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)

image.png

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.

Zusammenfassung

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

Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
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
Glättung kantengespeichert mit Python + OpenCV (BilateralFilter, NLMeansFilter)
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.
vprof - Ich habe versucht, den Profiler für Python zu verwenden
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV