Ein Anfängerleitfaden zur Bildverarbeitung mit OpenCV und Python

Quellknoten: 1074439

Dieser Artikel wurde als Teil des veröffentlicht Data-Science-Blogathon

Einleitung

In einem Bild können viele Informationen verborgen sein, die wir auf verschiedene Weise und aus verschiedenen Perspektiven interpretieren können. Was ist ein Bild und wie geht man mit einem Bild um? In einfachen Worten können wir sagen, dass ein Bild eine visuelle Darstellung von etwas ist und mit Computer Vision (aus der Perspektive des maschinellen Lernens) leicht bearbeitet werden könnte. Was ist mit Videos? Ein Video könnte als Aufnahme eines bewegten Satzes von Bildern oder fortlaufenden Einzelbildern beschrieben werden. Aber wir können uns in einem anderen Blog mit Videos mit Computer Vision beschäftigen! 🙂

Einige von Ihnen kennen vielleicht schon Computer Vision und können diesen Absatz überspringen, aber für diejenigen, die keine Ahnung davon haben, könnte Computer Vision, meist bekannt in der Kurzform 'CV', als ein Feld in Künstliche Intelligenz, die nützliche Informationen aus fast allen Bereichen dieser modernen Ära extrahiert, einschließlich des medizinischen Bereichs, der Automobilindustrie, der Fertigung, der Landwirtschaft usw.

Bildbearbeitung mit OpenCV | Computer Vision

Bild 1

Als Mensch, der gerade diesen Beitrag liest, könntest du zwischen den Dingen oder Elementen unterscheiden, die in einem Bild vorhanden sind. Aber was ist mit Maschinen? Konnten sie es selbst sehen und denken, um es zu unterscheiden? NEIN? Dann lassen Sie es Ihre Maschine tun.

In diesem Blog machen Sie sich mit den Grundlagen der Computer Vision mit Python vertraut.

Ich glaube, Sie haben bereits Python Shell/Jupyter Notebook/PyCharm oder Visual Studio Code (um nur einige zu nennen) installiert, um in Python zu programmieren. Lassen Sie uns zunächst das weit verbreitete Paket (OpenCV) installieren, und wir werden die Codes in jeder Zelle in einem Jupyter-Notebook ausführen.

Installieren des OpenCV-Pakets für die Bildvorverarbeitung

OpenCV ist eine vorgefertigte Open-Source-CPU-only-Bibliothek (Paket), die häufig für Computer Vision, maschinelles Lernen und Bildverarbeitungsanwendungen verwendet wird. Es unterstützt eine Vielzahl von Programmiersprachen, einschließlich Python.

Installieren Sie das OpenCV-Paket mit:

pip installiere opencv-python

OR

pip installiere opencv-contrib-python

Führen Sie einen dieser Befehle auf Ihrem Terminal aus oder wenn Sie Anaconda Navigator – Jupyter Notebook verwenden, können Sie „pip“ mit dem Befehl „conda“ ändern und installieren.

Importieren des Pakets

Was ist ein Paket in Python? Ein Paket in Python ist eine Sammlung von Modulen, die vorgefertigte Skripte enthalten. Diese Pakete helfen uns, Module ganz oder sogar einzeln zu importieren. Wir können das Paket importieren, indem wir das Modul „cv2“ wie folgt aufrufen:

cv2 importieren

Ein Bild lesen

Digitale Bilder könnten klassifiziert werden in; Farbbilder, Graustufenbilder, Binärbilder und Multispektralbilder. Ein Farbbild enthält die Farbinformationen für jedes Pixel. Bilder mit Graustufen als einzige Farbe sind Graustufenbilder, während ein Binärbild genau zwei Farben hat, meist schwarze und weiße Pixel. Multispektrale Bilder sind Bilder, die Bilddaten erfassen, die sich über das elektromagnetische Spektrum innerhalb einer bestimmten Wellenlänge erstrecken.

Kommen wir zurück zum Codierungsteil und lesen ein Bild, zum Beispiel ist das Bild unten gezeigt:

Bild lesen | Bildbearbeitung mit OpenCV

Dies ist ein Bild eines Mandrills. Ich lese gerade das Bild aus meinem lokalen Verzeichnis.

# cv2.imread(path_to_image_with_file_extension, Flag)

Der Nutzungscode sieht wie folgt aus:

img = cv2.imread("mandrill.jpg", 1)

Hier verwenden wir die Methode "imread" des cv2-Pakets, um das Bild zu lesen, und der erste Parameter entspricht dem Pfad des Bildes mit seinem Dateinamen und seiner Erweiterung, und der zweite ist das Flag, das Sie setzen können, das den Weg angibt. wie man im Bild liest. Wenn Sie möchten, können Sie hier den absoluten Pfad zum Bild ersetzen und versuchen, es von Ihrem lokalen Computer oder sogar aus dem Internet zu lesen! Wenn das Image in Ihrem aktuellen Arbeitsverzeichnis vorhanden ist, müssen Sie nur den Imagenamen mit seinem Erweiterungstyp angeben.

Was den zweiten Parameter betrifft, wenn Sie es als Graustufenbild lesen möchten, können Sie den Parameter auf 0, -1 festlegen, um das Bild unverändert zu lesen (liest das Bild als Alpha- oder Transparenzkanal, falls vorhanden) und standardmäßig ist es 1 als Farbbild. Sie können auch andere Parameter über diesen Link ausprobieren:

https://docs.opencv.org/4.5.2/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80

unter den ImreadModes.

Eigenschaften eines Bildes

Form:

Jedes Bild hat eine Form. Die Länge der Grenzen, die das Bild zeigt, kann als Form bezeichnet werden, dh als Höhe und Breite. Nun, da Sie wissen, wie man ein Bild liest, wie wäre es, wenn wir die Form des Bildes überprüfen?

Drucken (Bildform)

ist die grundlegende Methode, um die Form des Bildes zu drucken, aber wir können die Form wie folgt extrahieren:

h, w, c = img.shape print("Die Abmessungen des Bildes sind:nnHeight:", h, "pixelsnWidth:", w, "pixelsnNumber of Channels:", c)

um ein besseres Verständnis zu bekommen.

Für den Farb- und den unveränderten Modus würden 3 Werte zurückgegeben, einschließlich der Höhe, Breite und der Anzahl der im Bild vorhandenen Kanäle. Wenn Sie den Graustufenmodus verwendet haben, wäre die Form 2, was die Höhe und Breite des Bildes zurückgibt, aber dann müssen Sie nur die h- und w-Variablen verwenden (außer „c“), sonst erhalten Sie möglicherweise ein Wertfehler mit der Meldung "Nicht genügend Werte zum Entpacken (erwartet 3, erhalten 2)".

Typ:

Wir können den Typ des Bildes mit der Methode „type“ ermitteln. Die Verwendung dieser Methode hilft uns zu wissen, wie die Bilddaten dargestellt werden. Führen Sie den Code wie folgt aus:

Drucken (Typ (Bild))

Das Ergebnis könnte so aussehen:

als Bildtyp. Es ist ein mehrdimensionaler Behälter mit Gegenständen derselben Art und Größe. Weitere Informationen zum N-dimensionalen Array finden Sie unter dem folgenden Link:

https://numpy.org/doc/stable/reference/arrays.ndarray.html

Der Datentyp des gerade gelesenen Bildes:

Da das Bild ein N-dimensionales Array ist, können wir den Datentyp des Bildes überprüfen:

print(img.dtype)

Bildpixelwerte:

Wir können uns ein Bild als eine Reihe kleiner Muster vorstellen. Diese Abtastwerte werden Pixel genannt. Versuchen Sie zum besseren Verständnis, ein Bild so weit wie möglich zu vergrößern. Wir können dasselbe in verschiedene Quadrate unterteilt sehen. Dies sind die Pixel und wenn sie miteinander kombiniert werden, ergeben sie ein Bild.

Eine der einfachen Möglichkeiten, ein Bild darzustellen, ist die Form einer Matrix. Wir können sogar ein Bild mit einer Matrix erstellen und speichern! Wie das geht, zeigen wir dir später in diesem Beitrag. Schauen Sie sich dieses Bild unten an:

Bildpixelwerte | Bildbearbeitung mit OpenCV

Bild 2

Dieses Bild ist eher ein Beispiel dafür, wie die Matrixdarstellung eines Bildes aussieht. Links ein Bild von Lincoln, in der Mitte sind die Pixelwerte mit Zahlen von 0 bis 255 beschriftet, die ihre Intensität bzw. Helligkeit bezeichnen und rechts die Zahlen in Matrixform selbst. Jeder Wert in der Matrix entspricht einem Pixel, dem kleinsten Informationselement in einem Bild. Überprüfen Sie die Bildpixelwerte, indem Sie einfach die Variable drucken, mit der Sie das Bild geladen haben!

drucken (img)

Bildauflösung:

Die Bildauflösung könnte als die Anzahl der Pixel definiert werden, die in einem Bild vorhanden sind. Die Qualität des Bildes steigt mit zunehmender Pixelanzahl. Wir haben zuvor die Form des Bildes gesehen, die die Anzahl der Zeilen und Spalten angibt. Dies könnte als die Auflösung dieses Bildes bezeichnet werden. Einige der Standardauflösungen sind, die fast jeder kennt, 320 x 240 Pixel (meistens geeignet für Geräte mit kleinem Bildschirm), 1024 x 768 Pixel (geeignet für die Anzeige auf Standard-Computermonitoren), 720 x 576 Pixel (gut zu sehen auf Standard-Definition-Fernsehern) Sets mit 4:3-Seitenverhältnis), 1280 x 720 Pixel (für die Anzeige auf Breitbildmonitoren), 1280 x 1024 Pixel (gut für die Anzeige auf der Vollbildgröße auf LCD-Monitoren mit 5:4-Seitenverhältnis), 1920 x 1080 Pixel (zum Betrachten auf HD-Fernsehern) und jetzt haben wir sogar 4K-, 5K- und 8K-Auflösungen, die 3840 x 2160 Pixel, 5120 x 2880 Pixel und 7,680 x 4,320 Pixel betragen, die von Ultra-High-Definition-Monitoren und -Fernsehern unterstützt werden.

Wenn wir die Anzahl der Spalten und die Anzahl der Zeilen multiplizieren, erhalten wir die Gesamtzahl der im Bild vorhandenen Pixel. In einem 320 x 240-Bild beträgt die Gesamtzahl der darin enthaltenen Pixel beispielsweise 76,800 Pixel.

Anzeigen des Bildes

Sehen wir uns an, wie das Bild in einem Fenster angezeigt wird. Dazu müssen wir ein GUI-Fenster erstellen, um das Bild auf dem Bildschirm anzuzeigen. Der erste Parameter muss der Titel des GUI-Fensters sein, angegeben im String-Format. Wir können das Bild mit der Methode cv2.imshow() in einem Popup-Fenster anzeigen. Wenn Sie jedoch versuchen, es zu schließen, fühlen Sie sich möglicherweise im Fenster stecken geblieben. Um dem entgegenzuwirken, können wir eine einfache „waitKey“-Methode verwenden. Probieren Sie diesen Codeteil in einer neuen Zelle aus:

cv2.imshow('Mandrill', img) k = cv2.waitKey(0) if k == 27 or k == ord('q'): cv2.destroyAllWindows()

Hier haben wir im „waitKey“ den Parameter '0' angegeben, um das Fenster geöffnet zu halten, bis wir es schließen. (Sie können die Zeit auch in Millisekunden anstelle von 0 angeben, um anzugeben, wie lange es geöffnet werden soll.) Danach können wir die Variable zuweisen, um das Fenster zu schließen, wenn wir die Taste 'ESC' oder die Taste ' Q'. Die Methode cv2.destroAllWindows() wird zum Schließen oder Löschen der GUI-Fenster vom Bildschirm/Speicher verwendet.

Speichern des Bildes

Wie wäre es vor dem Speichern des Bildes, das Bild in Graustufen zu konvertieren und dann zu speichern? Konvertieren Sie das Bild in Graustufen mit:

grau = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Jetzt können wir das Bild speichern:

cv2.imwrite('Mandrill_grey.jpg', grau)

und überprüfen Sie das Bild, das im aktuellen Arbeitsverzeichnis gespeichert wird. Der erste Parameter entspricht dem Namen der Datei, in der das Bild gespeichert werden soll und der zweite Parameter ist die Variable, die das Bild enthält (Pixelinformationen).

Extrahieren der Bildbitebenen und Rekonstruieren dieser

Wir können ein Bild in verschiedene Ebenen von Bitebenen unterteilen. Unterteilen Sie beispielsweise ein Bild in 8-Bit-Ebenen (0-7), wobei die letzten Ebenen die meisten Informationen für ein Bild enthalten.

Bit-Pläne

Bild 3

Dazu können wir zwei weitere Pakete importieren:

import matplotlib.pyplot als plt import numpy als np

Wenn beim Importieren eines der Pakete ein Fehler auftritt, können Sie es folgendermaßen installieren:

conda install -c conda-forge matplotlib conda install -c anaconda numpy

Jetzt definieren wir eine Funktion, um jede der 8 Bitebenen des Bildes zu extrahieren.

def Extract_bit_plane(cd): # Extrahieren aller Bits nacheinander # vom 1. bis 8. in der Variablen # von c1 bis c8 bzw. c1 = np.mod(cd, 2) c2 = np.mod(np.floor(cd/2) , 2) c3 = np.mod(np.floor(cd/4), 2) c4 = np.mod(np.floor(cd/8), 2) c5 = np.mod(np.floor(cd/16 ), 2) c6 = np.mod(np.etage(cd/32), 2) c7 = np.mod(np.etage(cd/64), 2) c8 = np.mod(np.etage(cd/ 128), 2) # Bild erneut kombinieren, um ein Äquivalent zum ursprünglichen Graustufenbild zu bilden cc = 2 * (2 * (2 * c8 + c7) + c6) # Bild mit 3 höchstwertigen Bitebenen rekonstruieren to_plot = [cd, c1, c2 , c3, c4, c5, c6, c7, c8, cc] fig, axis = plt.subplots(nrows=2, ncols=5,figsize=(10, 8), subplot_kw={'xticks': [], ' yticks': []}) fig.subplots_adjust(hspace=0.05, wspace=0.05) für ax, i in zip(axes.flat, to_plot): ax.imshow(i, cmap='gray') plt.tight_layout() plt.show() return cc

Jetzt können wir die Funktion aufrufen.

rekonstruiertes_Bild = Extract_bit_plane (grau)

Wir haben das Bild (fast ähnlich) unter Verwendung der letzten drei Bitebenen rekonstruiert, dh der sechsten, siebten und achten Ebene. Und das Ergebnis sieht so aus:

Bild rekonstruieren | Bildbearbeitung mit OpenCV

Wie wäre es, wenn wir uns selbst ein kleines Bild konstruieren? Versuchen wir es jetzt!

Konstruieren eines kleinen synthetischen Bildes

Wir können versuchen, ein synthetisches Bild zu erzeugen, das vier konzentrische Quadrate mit vier verschiedenen Pixelintensitätswerten enthält,

40, 80, 160 und 220.

con_img = np.zeros([256, 256]) con_img[0:32, :] = 40 # obere Zeile con_img[:, :32] = 40 #linke Spalte con_img[:, 224:256] = 40 # rechte Spalte con_img[224:, :] = 40 # untere Zeile con_img[32:64, 32:224] = 80 # obere Zeile con_img[64:224, 32:64] = 80 # linke Spalte con_img[64:224, 192: 224] = 80 # rechte Spalte con_img[192:224, 32:224] = 80 # untere Zeile con_img[64:96, 64:192] = 160 # obere Zeile con_img[96:192, 64:96] = 160 # linke Spalte con_img[96:192, 160:192] = 160 # rechte Spalte con_img[160:192, 64:192] = 160 # untere Zeile con_img[96:160, 96:160] = 220 plt.imshow(con_img)

Das resultierende Bild würde so aussehen:

Möglichkeiten für das Ausgangssignal:

Wir können uns die Verwendung verschiedener Filter und Transformationen für Bilder in einem anderen Artikel ansehen.

Vielen Dank, dass Sie den Artikel gelesen haben.

meme

Bild 4

Fühlen Sie sich frei, Ihre Vorschläge unter den Kommentaren hinzuzufügen und zu teilen, wenn Ihnen dieser Artikel gefällt. Der vollständige Python-Programmiercode in Jupyter Notebook, der in diesem Artikel erwähnt wird, ist in meinem Github-Repository verfügbar:

https://github.com/jissdeodates/Beginner-s-Guide-to-Computer-Vision

References:

  1. Bild 1 – https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. Bild 2- https://towardsdatascience.com/everything-you-ever-wanted-to-know-about-computer-vision-heres-a-look-why-it-s-so-awesome-e8a58dfb641e
  3. Image 3- https://nptel.ac.in/content/storage2/courses/117104069/chapter_8/8_13.html
  4. Bild 4- https://memegenerator.net/instance/21508026/willy-wonka-oh-so-you-created-a-computer-vision-algorithm-you-must-never-lose-the-remote

https://docs.opencv.org/4.5.2/d1/dfb/intro.html

https://docs.opencv.org/4.5.2/db/deb/tutorial_display_image.html

Die in diesem Artikel gezeigten Medien sind nicht Eigentum von Analytics Vidhya und werden nach Ermessen des Autors verwendet.

Quelle: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

Zeitstempel:

Mehr von Analytics-Vidhya