Anwendung von Python: Datenbereinigung Teil 3: Verwendung von OpenCV und Vorverarbeitung von Bilddaten

Grundlagen der Bilddaten

OpenCV-Grundlagen

OpenCV ist eine praktische Bibliothek zum Arbeiten mit Bildern. Grundlegende Bildbearbeitung mit cv2

Liest das Bild und gibt es aus. Ein Bild laden

OpenCV Verwenden Sie die Funktion cv2.imread ().

cv2.imread("Dateiname")

Ein Bild ausgeben Verwenden Sie die Funktion cv2.imshow (). Die Größe des Fensters, in dem das Bild angezeigt wird, wird automatisch angepasst.

cv2.imshow("Fenstername",Bilddaten lesen)

Ich werde das Bild lesen und ausgeben.

#Importieren Sie die Bibliothek
import numpy as np
import cv2

#Laden Sie das Bild
img = cv2.imread("./4050_data_cleansing_data/sample.jpg ")

#Der Name des Fensters, in dem das Bild angezeigt wird, lautet"sample"
#Das geladene Bild ist"img"ist
cv2.imshow("sample", img)

Erstellen und speichern Sie Bilder

So erstellen und speichern Sie ein monochromes Bild. Bei der Verarbeitung eines Bildes mit cv2 ist die Reihenfolge der Farbspezifikation nicht RGB Bitte beachten Sie, dass es sich um die BGR handelt.

Erstellen Sie eine NumPy-Matrix, um ein Bild zu erstellen Verwenden der Funktion np.array () Darüber hinaus durch mehrere Schleifen, die die for-Anweisung und die range () -Funktion kombinieren Führt eine Verarbeitung durch, z. B. das Zeichnen der Farbinformationen jedes Pixels nebeneinander. Der folgende Beispielcode gibt Werte für [B, G, R] an. 512 Bilder horizontal mit dem ersten für Die zweite für ist eine Mehrfachschleife, die 512 Bilder vertikal erstellt. Der Datentyp ist ein 8-Bit-Integer-Typ ohne Vorzeichen mit einem Wertebereich von 0 bis 255. Geben Sie uint8 an

np.array([[[B, G, R] for _ in range(Horizontale Bildgröße)] for _ in range(Vertikale Bildgröße)], dtype="uint8")

_ In "for _ in range" wird verwendet, wenn der Variablenname für _ nicht angegeben wird, wenn der Vorgang in der for-Anweisung wiederholt wird.

So speichern Sie ein Bild

OpenCV
cv2.imwrite()Verwenden Sie eine Funktion.
cv2.imwrite("Dateiname",Bilddaten erstellt)

Erstellen Sie beispielsweise ein durchgehend rotes Bild mit einer Bildgröße von 512 Pixel Höhe und 512 Pixel Breite.

import numpy as np
import cv2

#Bestimmen Sie die Größe des Bildes
img_size = (512, 512)

#Erstellen Sie mit NumPy eine Matrix mit Bildinformationen
#Da es sich um ein rotes Bild handelt, ist jedes Element[0, 0, 255]Von 512*Betrachten Sie eine Matrix von 512
#Beachten Sie, dass die Matrix transponiert ist
#Jedes Element der Bilddaten ist 0~Da es nur einen Wert von 255 annimmt, geben Sie den Datentyp mit der Option dtype an, um dies zu verdeutlichen.
my_img = np.array([[[0, 0, 255] for _ in range(img_size[1])] for _ in range(img_size[0])], dtype="uint8")

#Anzeige
cv2.imshow("sample", my_img)

#sparen
#Der Dateiname lautet"my_red_img.jpg "
cv2.imwrite("my_red_img.jpg ", my_img)

Zuschneiden und Ändern der Größe

So beschneiden und ändern Sie die Größe eines Bildes. Beim Zuschneiden wird ein Teil des Bildes extrahiert. Das Ändern der Größe dient zum Ändern der Größe (Vergrößern oder Verkleinern) des Bildes.

Beim Zuschneiden wird der Bereich der Matrix angegeben, die das Bild darstellt. Schneiden Sie den angegebenen Teil des Bildes in ein Quadrat. Bei der Angabe des Bereichs ist oben links im Bild 0.

img[y Startpunkt: y Endpunkt,x Startpunkt: x Endpunkt]

Resize verwendet die Funktion cv2.resize ().

cv2.resize(Bilddaten, (Breite nach Größenänderung,Höhe nach Größenänderung))
import numpy as np
import cv2
import matplotlib.pyplot as plt

#Bild laden
# cv2.imread liest das Bild mit dem ndarray-Typ von NumPy
img = cv2.imread("./4050_data_cleansing_data/sample.jpg ")

#Die gelesenen Bilddaten sind (Höhe x Breite x Anzahl der Farben))Dreifache Anordnung von
size = img.shape #Größe(1000, 667, 3)

#Extrahieren Sie durch Angabe eines Bereichs (fester Wert oder Slice ist für die Bereichsspezifikation möglich)
#Wenn Sie in n gleiche Teile teilen möchten, nehmen Sie den Quotienten der Größe, schneiden Sie ihn jedoch nach dem Dezimalpunkt ab
my_img = img[: size[0] // 2, : size[1] // 3]

#Bei Angabe einer neuen Größe(Breite,Höhe)Wird in der Reihenfolge von sein
#Beim Verdoppeln von Breite und Höhe unter Beibehaltung der ursprünglichen Vergrößerung
my_img = cv2.resize(my_img, (my_img.shape[1] * 2, my_img.shape[0] * 2))

#Anzeige
#Anzeige mit Matplotlib, das die Skala zum einfachen Verständnis des durch Zuschneiden und Ändern der Größe angegebenen Bereichs anzeigt.
my_img = cv2.cvtColor(my_img, cv2.COLOR_BGR2RGB)
plt.imshow(my_img)
plt.show()

# cv2.Bei der Anzeige mit imshow
# cv2.imshow("sample", my_img)

Mosaik-

Als Anwendung der Größenänderung, wenn Sie das Bild verkleinern, um die Anzahl der Pixel zu verringern, und dann zur ursprünglichen Größe zurückkehren Sie können dem Bild ein Mosaik zuweisen.

Drehung / Umkehrung

Bild drehen

cv2.warpAffine()Verwenden Sie eine Funktion.

Diese Funktion führt eine geometrische Transformation durch, die als affine Transformation bezeichnet wird. Die Affintransformation wird durch eine Kombination aus paralleler Bewegung und linearer Transformation (Vergrößerung / Verkleinerung, Scherung (Schräglauf), Rotation) ausgedrückt.

cv2.warpAffine(Originalbilddaten,Transformationsmatrix,Ausgabebildgröße)

Die Parameter sind wie folgt.

Erstes Argument: Rotieren der Originalbilddaten (NumPy-Array ndarray)
Zweites Argument: Konvertierungsmatrix (NumPy-Array ndarray)
Drittes Argument: Ausgabebildgröße (Taple)

Die im zweiten Argument angegebene Konvertierungsmatrix lautet

cv2.getRotationMatrix2D()Holen Sie es sich mit einer Funktion.
cv2.getRotationMatrix2D(Koordinaten der Bildmitte,Der Winkel, den Sie drehen möchten,Skalierungsverhältnis)

Die Parameter sind wie folgt.

Erstes Argument: Koordinaten der Bildmitte (Taple)
Zweites Argument: Winkel, den Sie drehen möchten (nicht Radian)
Drittes Argument: Vergrößerung / Vergrößerung (1x ist 1).0)
import numpy as np
import cv2

img = cv2.imread("./4050_data_cleansing_data/sample.jpg ") #Größe(1000, 667, 3)

# warpAffine()Das zweite Argument der Funktion`Transformationsmatrix`Bekommen
mat = cv2.getRotationMatrix2D(tuple(np.array([img.shape[1], img.shape[0]]) / 2), 180, 2.0)

#Dreht sich bei 2-facher Vergrößerung um 180 Grad
my_img = cv2.warpAffine(img, mat, img.shape[::-1][1:3])

cv2.imshow("sample", my_img)

Inversion ist

cv2.flip()Verwenden Sie eine Funktion.
cv2.flip(Bilddaten,Achse)

Die Parameter sind wie folgt.

Erstes Argument: Originalbilddaten müssen invertiert werden
Zweites Argument: Zielachse

Wenn die Zielachse 0 ist, ist sie auf der x-Achse zentriert (verkehrt herum), und wenn sie positiv ist, ist sie auf der y-Achse zentriert (Links-Rechts-Inversion).
Wenn es negativ ist, dreht es sich um beide Achsen.
import numpy as np
import cv2

img = cv2.imread("./4050_data_cleansing_data/sample.jpg ")

#x-Achse y-Achse Invertiert um beide Achsen
my_img = cv2.flip(img, -1)

cv2.imshow("sample", my_img)

Farbkonvertierung / Farbinversion

Konvertieren Sie das Bild in einen anderen Farbraum. OpenCV unterstützt verschiedene Farbräume und kann mit der Funktion cv2.cvtColor () ineinander konvertiert werden.

cv2.cvtColor(Bilddaten,Code zum Konvertieren in einen anderen Farbraum)

Konvertieren Sie beispielsweise ein Bild im BGR-Farbraum in den Lab-Farbraum. Der Laborfarbraum ist ein Farbsystem, das sich dadurch auszeichnet, dass es dem menschlichen Sehen ähnelt.

import numpy as np
import cv2

img = cv2.imread("./4050_data_cleansing_data/sample.jpg ")

#Konvertieren Sie BGR in Lab-Farbraum
my_img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)

cv2.imshow("BGR to LAB", my_img)

cv2.imread liest standardmäßig Bilder im BGR-Farbraum Beispielsweise verwenden Matplotlib und SciPy standardmäßig RGB.

Sie können COLOR_BGR2GRAY verwenden, um in Graustufen zu konvertieren. Weitere Conversion-Codes finden Sie auf der offiziellen Website von OpenCV.

Das Invertieren der Farbe eines Bildes wird als negative / positive Inversion bezeichnet. Für Schwarzweißbilder wird eine Schwarzweißinversion durchgeführt, und für Vollfarbbilder wird eine komplementäre Farbinversion durchgeführt.

Da der RGB-Wert aus 0 bis 255 besteht, können Sie die Farbe invertieren, indem Sie einen bestimmten Pixelwert x durch 255-x ersetzen. Die von OpenCV gelesenen Pixelwerte sind ein dreidimensionales Numpy-Array. Schreiben Sie das Array Pixel für Pixel von x auf 255-x für jeden RGB-Kanal um.

#Koordinaten jedes Pixels(i, j)Und RGB-Kanäle(k)Um den Pixelwert vor der Konvertierung durch Angabe zu erhalten
img[i][j][k] = x

Erfassen Sie die Koordinaten mit der for-Anweisung und len (img [i]), greifen Sie nacheinander auf jedes Pixel zu und konvertieren Sie den Pixelwert für jeden RGB-Kanal.

import numpy as np
import cv2

img = cv2.imread("./4050_data_cleansing_data/sample.jpg ")
# img.Form ist(1000, 667, 3)
#Jeder i, j,Ist der Wert von k

#Pixelkoordinaten(i, j)Erhalten
for i in range(len(img)):
    for j in range(len(img[i])):
        #RGB-Kanal(k:0-2)Erhalten
        for k in range(len(img[i][j])):
            #Koordinate(i, j)RGB-Kanal(k:0-2)Konvertieren Sie den Pixelwert für jeden
            img[i][j][k] = 255 - img[i][j][k]

cv2.imshow("sample", img)

#Cv2 in OpenCV.bitwise_not()Mit einer Funktion invertieren.

img = cv2.bitwise_not(Bilddaten)

# cv2.bitwise()Die Funktion kann das Bit jedes Pixels manipulieren, das durch 8 Bits dargestellt wird.
#Invertiere jedes Bit mit nicht.

Verwendung von OpenCV

Schwellenwertverarbeitung (Binärisierung)

Heller als ein bestimmter Betrag, um die Bildgröße zu verringern Oder machen Sie alle Farben dunkler als ein bestimmter Wert zum gleichen Wert Kurz gesagt, der Prozess der Binärisierung auf Weiß und Schwarz

Dies wird als Schwellenwertverarbeitung bezeichnet.
Die Schwellenwertverarbeitung ist cv2.threshold()Verwenden Sie eine Funktion.
cv2.threshold(Bilddaten,Schwelle,Maximalwert maxValue,Schwelle処理の種類)
Die Parameter sind wie folgt.

Erstes Argument: Name der zu bildenden Originalbilddatei
Zweites Argument: Anzahl der Pixel, die der Schwellenwert sein sollen
Drittes Argument: Maximaler Konzentrationswert für den Schwellenwert
Viertes Argument: OpenCV-Schwellenwertverarbeitungstyp (THRESH)_BINARY, THRESH_BINARY_INV, THRESH_TRUNC, THRESH_TOZERO, THRESH_TOZERO_Beliebig von INV)
Die Arten der Schwellenwertverarbeitung für das vierte Argument sind wie folgt.

THRESH_BINARY: Die Pixel, die den Schwellenwert überschreiten, werden auf maxValue und die anderen Pixel auf 0 gesetzt.
THRESH_BINARY_INV: 0 für Pixel über dem Schwellenwert, maxValue für alle anderen Pixel
THRESH_TRUNC: Pixel, die den Schwellenwert überschreiten, werden auf den Schwellenwert gesetzt, und andere Pixel werden nicht geändert.
THRESH_TOZERO: Pixel, die den Schwellenwert überschreiten, werden nicht geändert, und andere Pixel sind 0.
THRESH_TOZERO_INV: Pixel über dem Schwellenwert werden auf 0 gesetzt, andere Pixel bleiben unverändert
Abhängig von der Art der Schwellenwertverarbeitung können verschiedene Schwellenwertverarbeitungen durchgeführt werden.
import numpy as np
import cv2

#Lesen Sie das Farbbild in Graustufen (cv2).IMREAD_GRAYSCALE oder 0)
img = cv2.imread("./4050_data_cleansing_data/sample.jpg ", 0)

# THRESH_Verwenden Sie TOZERO, um den Schwellenwert auf 150 und das Maximum auf 255 einzustellen
#Der Schwellenwert wird ebenfalls zurückgegeben, erhalten Sie ihn also mit Retval
retval, my_img = cv2.threshold(img, 150, 255, cv2.THRESH_TOZERO)

cv2.imshow("original", img)
cv2.imshow("sample", my_img)
print(retval)

Maskierung

Zeigt einen Teil des Originalbilds so an, als wäre er in dem weiß gezeichneten Bereich eines anderen Bildes ausgehöhlt. Bereiten Sie für den Maskierungsprozess ein Bild zum Maskieren mit einem Schwarzweißkanal vor. Maskieren Sie das Originalbild mit dem schwarzen Teil des Maskenbildes Es wird nur der weiße Teil angezeigt. Der Maskierungsprozess verwendet die Funktion cv2.bitwise_and ().

cv2.bitwise_and(Originalbilddaten 1,Originalbilddaten 2(Originalbilddaten 1と同じで可), mask=Bild für Maske)
import numpy as np
import cv2

#Laden Sie das Originalbild
img = cv2.imread("./4050_data_cleansing_data/sample.jpg ")

#Das Maskenbild wird durch Angabe von 0 für das zweite Argument in ein Bild mit 1 Kanal (Graustufenbild) konvertiert und gelesen.
mask = cv2.imread("./4050_cleansing_data/mask.png ", 0)

#Ändern Sie die Größe des Maskenbilds auf die gleiche Größe wie das Originalbild
mask = cv2.resize(mask, (img.shape[1], img.shape[0]))

#Geben Sie das Maskenbild im dritten Argument und in der Maske an
my_img = cv2.bitwise_and(img, img, mask = mask)

cv2.imshow("sample", my_img)

Unschärfe (Glättung)

Es gibt verschiedene Möglichkeiten, das Bild zu verwischen Unter diesen werden n✕n Pixel um ein bestimmtes Pixel (Pixel) gemittelt und unscharf. Verwischen Sie das gesamte Bild mit einem Gaußschen Filter. Die Unschärfeverarbeitung verwendet die Funktion cv2.GaussianBlur ().

cv2.GaussianBlur(Bilddaten,Kernelgröße(n, n), 0)
Die Parameter sind wie folgt.

Erstes Argument: Name der zu verwischenden Originalbilddatei
Zweites Argument: Kernelgröße (n ✕ n Wert (n ist ungerade))
Drittes Argument: Standardabweichung der x-Richtung des Gaußschen Kernels (normalerweise 0)

Je größer die Werte für Kernelgröße und Standardabweichung sind, desto stärker ist die Unschärfe.

import numpy as np
import cv2

img = cv2.imread("./4050_data_cleansing_data/sample.jpg ")

my_img = cv2.GaussianBlur(img, (51, 51), 0)

cv2.imshow("sample", my_img)

Geräuschreduzierung

So entfernen Sie Rauschen in Farbbildern Verwenden der Funktion cv2.fastNlMeansDenoisingColored () Zur Rauschentfernung von Graustufenbildern Verwenden Sie die Funktion cv2.fastNlMeansDenoising ().

#Farbbild
cv2.fastNlMeansDenoisingColored(Bilddaten)
#Graustufenbild
cv2.fastNlMeansDenoising(Bilddaten)
import numpy as np
import cv2

img = cv2.imread("./4050_data_cleansing_data/sample.jpg ")

my_img = cv2.fastNlMeansDenoisingColored(img)

cv2.imshow("sample", my_img)

Expansion / Kontraktion

Durch nicht lokale Mittel Filter Ich habe Rauschen von Farbbildern und Graustufenbildern entfernt. Rauschen kann auch durch Expansions- / Kontraktionsverarbeitung entfernt werden.

Expansion und Kontraktion sind Methoden, die häufig hauptsächlich in Binärbildern verwendet werden. Die Erweiterung wird auf ein Pixel zentriert, und der Maximalwert (= Weiß) im Filter ist der Mittelwert.

Im Gegenteil, der Minimalwert (= schwarz) ist der Mittelpunkt der Kontraktion. Der Filter ist eine Methode, bei der vier obere, untere, linke und rechte Pixel des mittleren Pixels verwendet werden. Es gibt zwei Hauptmethoden, bei denen acht Sie umgeben.

Die Erweiterung verwendet die Funktion cv2.dilate () Die Kontraktion verwendet die Funktion cv2.erode ().

#Erweiterung
cv2.dilate(Bilddaten,Filter)
#Schrumpfen
cv2.erode(Bilddaten,Filter)
Die Parameter sind wie folgt.

Erstes Argument: Name der Originalbilddatei
Zweites Argument: Filter (Kernelgröße)
Der Filter kann entweder durch ein Array vom Typ numpy ndarray oder durch ein Taple angegeben werden.
#In Graustufen lesen
img = cv2.imread("./4050_data_cleansing_data/sample.jpg ", 0)

#In Binärbild konvertieren
retval, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

#Filterdefinition
filt = np.array([[0, 1, 0],
                [1, 0, 1],
                [0, 1, 0]], np.uint8)
# filt = np.ones((3, 3), np.uint8)Aber ok

#Erweiterung
my_img = cv2.dilate(img, filt)

cv2.imshow("sample", my_img)

np.uint8 repräsentiert den Datentyp, bei dem es sich um einen vorzeichenlosen Integer-Typ handelt, der durch 8 Bits dargestellt wird.

Recommended Posts

Anwendung von Python: Datenbereinigung Teil 3: Verwendung von OpenCV und Vorverarbeitung von Bilddaten
Datenbereinigung 3 Verwendung von OpenCV und Vorverarbeitung von Bilddaten
Umgebungskonstruktion von Python und OpenCV
Anwendung von Python: Datenbereinigung Teil 2: Datenbereinigung mit DataFrame
Einfache Einführung in die Python3-Serie und OpenCV3
Python: Vorverarbeitung beim maschinellen Lernen: Umgang mit fehlenden / Ausreißern / unausgeglichenen Daten
Python-Entwicklungsumgebung - Verwendung von Pyenv und Virtualenv-
cv2-Funktionen und Datentypen (OpenCV-Python-Bindung)
[Python + OpenCV] Malen Sie den transparenten Teil des Bildes weiß
Vorverarbeitung von Präfekturdaten
Anwendung von Python 3 vars
Verarbeitung von CSV-Daten in voller und halber Breite in Python
Liste der Python-Bibliotheken für Datenwissenschaftler und Dateningenieure
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Geschichte der Bildanalyse von PDF-Dateien und Datenextraktion
Ubuntu 20.04 auf Himbeer-Pi 4 mit OpenCV und mit Python verwenden
Verwenden wir die offenen Daten von "Mamebus" in Python
Überblick über die Verarbeitung natürlicher Sprache und ihre Datenvorverarbeitung
Verwendung für Python-Stapel und -Warteschlangen (Geschwindigkeitsvergleich jeder Datenstruktur)
[Python of Hikari-] Kapitel 08-03 Modul (Import und Verwendung der Standardbibliothek)
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Vor- und Nachbearbeitung von Pytest
Bildbearbeitung mit Python OpenCV
[Einführung in die Udemy Python3 + -Anwendung] 36. Verwendung von In und Not
Befreien Sie sich mit Python und regulären Ausdrücken von schmutzigen Daten
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
Python-Anwendung: Datenverarbeitung Teil 1: Datenformatierung und Dateieingabe / -ausgabe
Python-Anwendung: Datenvisualisierung # 2: matplotlib
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
Anwendung der CNN2-Bilderkennung
Datenbereinigung 1 Praktische Python-Notation wie Lambda und Map
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
[Einführung in Data Scientists] Grundlagen von Python ♬ Funktionen und Klassen
Verwendung und Integration von "Shodan"
Implementieren Sie die Normalisierung der Vorverarbeitung von Python-Trainingsdaten mit scicit-learn [fit_transform].
Konvertierung von Bilddatentypen [Python]
Quellinstallation und Installation von Python
[Python] Zugreifen auf und Zuschneiden von Bildpixeln mit OpenCV (für Anfänger)
[Python] Mit OpenCV können Sie problemlos Bilddateien mit Seriennummern lesen
Empfohlene Bücher und Quellen für die Datenanalyseprogrammierung (Python oder R)
Verarbeitung zur Verwendung von notMNIST-Daten in Python (und versucht, sie zu klassifizieren)
Automatische Bildinterpolation mit OpenCV und Python (Fast Marching Method, Navier-Stokes)
Automatische Erfassung von Genexpressionsdaten durch Python und R.
[Bildverarbeitung] Poo-san ist durch Kantenerkennung mit Python und OpenCV nackt!
Praxis der Datenanalyse durch Python und Pandas (Tokyo COVID-19 Data Edition)
Ich möchte sowohl den Schlüssel als auch den Wert des Python-Iterators verwenden
Ausrichten gescannter Bilder von animiertem Videopapier mit OpenCV und Python
[Einführung in die Udemy Python3 + -Anwendung] 69. Import des absoluten Pfads und des relativen Pfads
[Einführung in die Udemy Python3 + -Anwendung] 12. Indizieren und Schneiden von Zeichenketten
[Einführung in Data Scientists] Grundlagen von Python ♬ Bedingte Verzweigung und Schleifen
[Einführung in Data Scientists] Grundlagen von Python ♬ Funktionen und anonyme Funktionen usw.
Leuchtendes Leben mit Python und OpenCV
Die Geschichte von Python und die Geschichte von NaN
Bilderfassung von Firefox mit Python
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
Neuronales Netzwerk mit OpenCV 3 und Python 3
Installation von SciPy und matplotlib (Python)
Beurteilung des hintergrundbeleuchteten Bildes mit OpenCV