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)
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)
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)
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.
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)
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.
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)
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)
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)
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)
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