Erste Schritte mit Bildern / Sudo Null IT News

Ich übersetze natives OpenCV-shny Lernprogramm. Und er ist gut! (Es ist schwer zu sagen, warum sie diejenigen nicht mochten, die es sind.)
Ursprünglich hatte das Tutorial die Form eines Laptops, also habe ich etwas entfernt. Und etwas hinzugefügt. Im Allgemeinen ist dies eine Mischung aus Übersetzung und Nacherzählung.

Einführung

Dieser Hinweis hilft bei den ersten Schritten beim Erlernen der Bildverarbeitung und des maschinellen Sehens durch OpenCV. Ein paar einfache Beispiele werden wichtige Dinge erklären! In Betracht ziehen:

  • So öffnen Sie ein Bild

  • Überprüfen Sie seine Attribute wie Formular oder Datentyp darin

  • Matrixdarstellung eines Bildes in Numpy

  • Bilder kolorieren und mit Bildkanälen arbeiten

  • Plotten eines Bildes über matplotlib

  • Bilder speichern

Importieren der erforderlichen Bibliotheken

import cv2 # eigentlich OpenCV import numpy as np # zum Arbeiten mit Mathematik import matplotlib.pyplot as plt # zum Anzeigen eines Bildes

Öffnen von Bildern in OpenCV

Das Bild wird ein winziges kariertes Brett mit 18 x 18 Pixeln sein:

"schachbrett_18x18.png"“Schachbrett_18x18.png”

Mit OpenCV können Sie mit verschiedenen Formaten arbeiten: JPG, PNG und so weiter. Sie können Farb- und SW-Bilder sowie Bilder mit Alphakanal hochladen. Verwenden Sie zum Laden die Funktion cv2.imread().

cv2.imread() – Syntax und Argumente retval = cv2.imread( Dateiname[, flags] )

retval: Wenn das Bild nicht geladen wurde, wird retval auf None gesetzt. Dies geschieht, wenn der Name/Pfad fehlerhaft ist oder das Bild beschädigt ist.

Der Funktion wird ein erforderliches Argument und ein optionales Flag übergeben:

  1. Dateiname: Kann entweder relativer oder absoluter Pfad sein. Dies ist ein erforderliches Argument.

  2. Flags: Flags werden benötigt, um das Bild in einem bestimmten Format (z. B. Graustufen/Farbe/Alpha) zu lesen. Optionales Argument! Der Standardwert ist cv2.IMREAD_COLOR oder 1: Dieses Flag lädt das Bild als Farbe.

Sehen wir uns vor den Beispielen ein paar Flags an:

  1. cv2.IMREAD_GRAYSCALE oder 0: Bild als Schwarzweiß laden

  2. cv2.IMREAD_COLOR oder 1: Default-Flag, lädt das Bild als Farbe, ohne Alphakanal.

  3. cv2.IMREAD_UNCHANGED oder -1: Lädt das Bild wie es ist, einschließlich Alpha.

Natürlich gibt es noch mehr Flaggen.

Mehr über imread(): Link zu aus. Dokumentation
Mehr zu Flaggen: Link zu aus. Dokumentation

Sehen wir uns nun an, was in den Steinen steckt:

# Lesen Sie das Bild in Schwarzweiß. cb_img = cv2.imread(“checkerboard_18x18.png”,0) # Drucken Sie, was wir gelesen haben. Jedes Pixel ist ein Element eines zweidimensionalen numpy-Arrays. # Der Pixelwert ist acht Bit: [0,255]
Drucken (cb_img)es gibt eine ähnlichkeites gibt eine ähnlichkeit

Schauen wir uns die Bildattribute an

# Bildgröße drucken (d. h. Numpy-Array) print(“Bildgröße ist “, cb_img.shape) # Datentyp im Bild (d. h. Numpy-Array) print(“Datentyp des Bilds ist “, cb_img.dtype)

Als Antwort erhalten wir:

>>>Bildgröße ist (18, 18) >>>Datentyp des Bildes ist uint8 Was ist uint8?

8-Bit-Integer-Arrays ohne Vorzeichen!
Uint8 ist eine Standardmethode zum Anzeigen von Bildern, bei der ein Pixel durch einen Bereich von 0 bis 255 beschrieben wird. Wenn das Bild ein Graustufenbild ist, ist ein Pixel mit einem Wert von 0 schwarz und ein Pixel mit einem Wert von 255 weiß.
Natürlich gibt es auch andere Formate.

Im Allgemeinen funktioniert alles, was mit ndarray funktioniert: .ndim, .itemsize, .fill()…

Und jetzt werden wir das Bild über matplotlib anzeigen

Zwei Teams:

# Dame zeichnen plt.imshow(cb_img) # Dame zeigen plt.show()

Wir sind überrascht:

Schta?Schta?

Die gelesene Farbpalette und die angezeigte stimmen möglicherweise nicht überein. Daher geben wir explizit den Farbraum für die Darstellung des Bildes an:

# Farbzuordnungseinstellung setzen plt.imshow(cb_img, cmap=’gray’)das ist besser!das ist besser!

Ein anderes Beispiel

Flauschige Spieße! Dasselbe wie beim letzten Mal, aber jetzt mit unscharfen Kanten:

"schachbrett_fuzzy_18x18.jpg"“checkerboard_fuzzy_18x18.jpg”# Bild als sw lesen cb_img_fuzzy = cv2.imread(“checkerboard_fuzzy_18x18.jpg”,0) # Array drucken print(cb_img_fuzzy) # Bild anzeigen plt.imshow(cb_img_fuzzy,cmap=’gray’) plt.show( )

Kommen wir zur Farbe

Bis zu diesem Punkt haben wir über Schwarz-Weiß-Bilder gesprochen, und jetzt sprechen wir über Farbe.

Das Versuchskaninchen wird das Cola-Logo:

"coca-cola-logo.png"“coca-cola-logo.png”

Laden, Größe und Datentyp prüfen:

coke_img = cv2.imread(“coca-cola-logo.png”,1) print(“Bildgröße ist “, coke_img.shape) print(“Datentyp des Bildes ist “, coke_img.dtype)

Als Antwort erhalten wir:

>>>Bildgröße ist (700, 700, 3) >>>Datentyp des Bildes ist uint8

Die Größe des Bildes hat sich geändert, da das SW-Bild aus einem Kanal besteht – von Schwarz nach Weiß, und das Farbbild aus mehreren, beispielsweise drei: RGB.

Lassen Sie uns die bereits bekannten Manipulationen anzeigen:

plt.imshow(coke_img) plt.show()Verwirrung jedoch.Verwirrung jedoch.

Die Farbe des Logos unterscheidet sich deutlich von dem, was es war. Matplotlib erwartet ein Bild im RGB-Format, während OpenCV es im BGR-Format speichert. Das heißt, für die korrekte Anzeige müssen wir die roten und blauen Kanäle vertauschen.

# Unten ist ein numpy-spezifisches Konstrukt: # (:) – Nimm jedes Element der Reihe nach, # (::-1) – Nimm jedes Element, aber in umgekehrter Reihenfolge. coke_img_channels_reversed = coke_img[:, :, ::-1]

plt.imshow(coke_img_channels_reversed)Also schon mehr pokakoli.Also schon mehr pokakoli.

Aufteilen und Zusammenführen von Kanälen

Zwei Funktionen:

cv2.split() – teilt ein Mehrkanal-Array in mehrere Einkanal-Arrays auf.
cv2.merge() – Arrays zu einem Multichannel zusammenführen. Arrays müssen dieselbe Größe haben.

Schauen wir sie uns auf dem See an. Ich meine, der See.

"Neuseeland_See.jpg"“New_Zealand_Lake.jpg”# Bild in Kanäle aufteilen: B,G,R img_NZ_bgr = cv2.imread(“New_Zealand_Lake.jpg”,cv2.IMREAD_COLOR) b,g,r = cv2.split(img_NZ_bgr) # Zeichne sie plt. Figur (figsize=[20,5]) plt.subplot(141);plt.imshow(r,cmap=’gray’);plt.title(“Red Channel”) plt.subplot(142);plt.imshow(g,cmap=’gray’); plt.title(“Grüner Kanal”) plt.subplot(143);plt.imshow(b,cmap=’gray’);plt.title(“Blauer Kanal”) # Sammeln zurück zu BGR imgMerged = cv2.merge(( b,g,r)) # Ergebnis anzeigen plt.subplot(144);plt.imshow(imgMerged[:,:,::-1]);plt.title(“Merged Output”) plt.show() Semikolon im Code…

…nicht erwünscht, aber erlaubt. Es hilft, Code in einer Zeile zu schreiben, und manchmal ist es praktisch!

Übersetzung in andere Farbräume

cv2.cvtColor() – konvertiert ein Bild von einem Farbraum in einen anderen. Bei der Konvertierung von und nach RGB muss die Reihenfolge der Kanäle explizit angegeben werden: RGB oder BGR. Das Standardfarbformat in OpenCV wird oft als RGB bezeichnet, ist aber eigentlich BGR. Das erste Byte in einem standardmäßigen 24-Bit-Farbbild ist die 8-Bit-Blaukomponente, das zweite Byte ist grün und das dritte Byte ist rot. Das vierte, fünfte und sechste Byte ist jeweils das zweite Pixel – blau, grün, rot und so weiter bis zum Ende des Bildes.

BGR-zu-RGB-Konvertierung

img_NZ_rgb = cv2.cvtColor(img_NZ_bgr, cv2.COLOR_BGR2RGB) plt.imshow(img_NZ_rgb) plt.show()

Zum HSV umsteigen

HSV – Farbton, Sättigung, Wert – Ton, Sättigung, Wert.

img_hsv = cv2.cvtColor(img_NZ_bgr, cv2.COLOR_BGR2HSV) # Bild in H-, S-, V-Kanäle aufteilen h,s,v = cv2.split(img_hsv) # Zeichne und zeige sie an plt.figure(figsize=[20,5]) plt.subplot(141);plt.imshow(h,cmap=’gray’);plt.title(“H Channel”) plt.subplot(142);plt.imshow(s,cmap=’gray’); plt.title(“S-Kanal”) plt.subplot(143);plt.imshow(v,cmap=’gray’);plt.title(“V-Kanal”) plt.subplot(144);plt.imshow(img_NZ_rgb );plt.title(“Original”) plt.show()Sie sind wirklich erwachsen geworden: schiefer BildschirmSie sind wirklich erwachsen geworden: schiefer Bildschirm

Individuelle Kanalmodifikation

Willst du blau blau? Es gibt eine Lösung!

img_NZ_bgr = cv2.imread(“New_Zealand_Lake.jpg”,cv2.IMREAD_COLOR) b,g,r = cv2.split(img_NZ_bgr) b = b+50 # blue plt.figure(figsize=[20,5]) plt.subplot(141);plt.imshow(r,cmap=’gray’);plt.title(“Red Channel”) plt.subplot(142);plt.imshow(g,cmap=’gray’); plt.title(“Green Channel”) plt.subplot(143);plt.imshow(b,cmap=’gray’);plt.title(“Blue Channel”) imgMerged = cv2.merge((r,g,b )) # diesmal RGB sammeln plt.subplot(144);plt.imshow(imgMerged);plt.title(“Merged Output”) plt.show()Etwas gemeckertEtwas gemeckert

Bilder speichern

Fast cv2.imread, nur cv2.imwrite. Wir übergeben den Pfad und den Namen als erstes Argument und das Bild als zweites. Beides ist erforderlich. Die OpenCV-Erweiterung wird basierend auf der im Namen angegebenen Erweiterung übernommen. Sie können auch Parameter hinzufügen und beispielsweise die JPG-Qualität festlegen.

cv2.imwrite( Dateiname, img[, params] )

Mehr über imwrite(): Link zum Büro Dokumentation
Mehr zu Parametern: Link zu aus. Dokumentation

Das ist alles! Der erste kleine Schritt in Richtung Mann-Photoshop ist geschafft! Wir sehen uns in den nächsten Folgen.

Similar Posts

Leave a Reply

Your email address will not be published.