[PYTHON] Die Geschichte der Anzeige von Bildern mit OpenCV oder PIL (nur)

Einführung

Die Geschichte von OpenCV und PIL. Es gibt viele Informationen im Internet, nicht nur Qiita, sondern viele Artikel sind fragmentiert und nicht zum Vergleich geeignet. Deshalb habe ich versucht, sie in diesem Sinne zusammenzufassen. Dabei habe ich mir etwas ausgedacht, das mein Vorgänger nicht berührt hat (wie es scheint), also hoffe ich, dass Sie es lesen können.

OpenCV CV ist eine Abkürzung für Computer Vision, die neben der einfachen Verarbeitung von Bildern verschiedene andere Funktionen hat. Nun, diesmal geht es nur darum, Bilder anzuzeigen, anstatt Bilder zu verarbeiten.

Bild lesen cv2.imread ()

Verwenden Sie cv2.imread (* Dateiname *, * Flags *).

Bild wird geladen


import cv2

filename = "hoge.png "
imgCV = cv2.imread(filename)  #Flags weggelassen (Standardwert = 1)

Bild anzeigen cv2.imshow ()

Verwenden Sie cv2.imshow (* winname *, * mat *).

Bildanzeige in einem Fenster ohne Größenänderung


cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)  #Dieser Satz muss nicht sein
cv2.imshow("image", imgCV)

Bildanzeige in einem Fenster mit veränderbarer Größe


cv2.namedWindow("image", cv2.WINDOW_NORMAL)  # cv2.WINDOW_Da der Wert von NORMAL 0 ist, kann 0 angegeben werden.
cv2.imshow("image", imgCV)

Nachtrag: Vollbildanzeige

Um im Vollbildmodus anzuzeigen, müssen Sie zuerst die Fenstergröße ändern und dann tatsächlich auf Vollbild einstellen.

Funktionen, die im Vollbildmodus angezeigt werden oder nicht


def cv2_imshow_fullscreen(winname, img, flag_fullscreen):
    if flag_fullscreen:
        cv2.namedWindow(winname, cv2.WINDOW_NORMAL)
        cv2.setWindowProperty(winname, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
    cv2.imshow(winname, img)

#Anwendungsbeispiel
cv2_imshow_fullscreen("fullscreen", img , True) #Vollbildansicht
cv2_imshow_fullscreen("window", img , False) #Fensteranzeige

Ich habe versucht, eine Funktion für beide zu schreiben, aber wenn Sie nicht im Vollbildmodus anzeigen möchten, können Sie cv2.imshow () normal ausführen. Daher ist es besser, sie zu einer Funktion für die Vollbildanzeige zu machen, die nicht mit if verzweigt ..

Informationen zu OpenCV-Bilddaten

Die Bilddaten setzen sich aus dem Typ numpy.ndarray zusammen. Sie können die Abmessungen nach Form überprüfen und den Inhalt leicht überprüfen. Beachten Sie, dass ** Farben in der BGR-Reihenfolge ** gespeichert sind.

Bildform

Überprüfen Sie anhand der Flags, wie die Bilddaten beim Lesen des Bildes aussehen.

flags cv2.IMREAD_COLOR cv2.IMREAD_GRAYSCALE cv2.IMREAD_UNCHANGED
Wert 1
(デフォルトWert)
0 -1
wird bearbeitet Als Farbbild lesen In Graustufen lesen Lesen Sie mit den gleichen Spezifikationen
Beispiel 1
RGBA-Bild

original.png
<fontsize="-1">DertatsächlicheHintergrundistehertransparentalskariert
3.png
shape=(200,182,3)
1.png
shape=(200,182)
4.png
shape=(200,182,4)
Beispiel 2
Graustufenbild

reiwa.png
r3.png
shape=(192,144,3)
r1.png
shape=(192,144)
r4.png
shape=(192,144)

Mit cv2.IMREAD_COLOR wird die Anzahl der Farbkanäle gleichmäßig in 3 Kanälen angeordnet, unabhängig davon, ob das Bild transparent oder grau ist. Im Fall von cv2.IMREAD_GRAYSCALE ist die Anzahl der Kanäle nicht 1, sondern ein zweidimensionales Array ohne angegebene Anzahl von Kanälen (h, w). cv2.IMREAD_UNCHANGED ist [OpenCV-Python-Tutorial "Umgang mit Bildern"](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_image_display/py_image_display .html # id3) sagt "Als Bild einschließlich des Alphakanals lesen", aber es hat nicht 4 Kanäle einheitlich und es ist korrekt, ohne Änderung aus dem Originalbild zu lesen. 4 Kanäle für RGBA-Bilder, 3 Kanäle für RGB-Bilder. Da es sich um einen Kanal für ein Graustufenbild handelt, wird (h, w) anstelle von (h, w, 1) zurückgegeben. Ist es kompliziert? Nein, das hast du von Anfang an gesagt, cv2.IMREAD _ ** UNCHANGED **.

Holen Sie sich Größe

OpenCV-Bilddaten mit unterschiedlichen Arrayformen, abhängig vom Typ des Originalbilds. Sie müssen die if-Anweisung nicht verwenden, um Fälle zu trennen, um die Höhe und Breite zu ermitteln. Die Form des Graustufenbildes, das durch (Höhe, Breite) erhalten wird, und des Farbbildes, das durch (Höhe, Breite, Anzahl der Kanäle) erhalten wird, sind die gleichen wie bei der 0. Höhe und der 1. Breite. Deshalb sollten Sie sich mit 0 oder 1 entscheiden.

python


#Beides ist akzeptabel

def getSize1(imgCV):
    h = imgCV.shape[0]
    w = imgCV.shape[1]
    return h, w

def getSize2(imgCV):
    h, w = imgCV.shape[:2]
    return h, w

Für Google Colab

Cv2.imshow () kann in Google Colab nicht verwendet werden. Es scheint, dass die Jupyter-Sitzung abstürzt. Stattdessen bietet es eine Alternative zur Verwendung der Google Colab-eigenen Methode cv2_imshow (). Für cv2_imshow () ist kein Fenstername erforderlich, es werden nur Bilddaten angegeben. Dadurch wird das Bild in der Zelle von Colab angezeigt.

Google&nbsp;Colab


#1 Zelle 1 Satz oder alle können zusammengesetzt werden
import cv2
from google.colab.patches import cv2_imshow

filename = "hoge.png "
imgCV = cv2.imread(filename)

cv2_imshow(imgCV)

Für Jupyter Notebook

Jupyter Notebook verbietet cv2.imshow () nicht, kann aber dennoch abstürzen.

Tatsächlich kann es in Jupyter Notebook durch Ausführen der korrekten Verarbeitung korrekt angezeigt werden. Cv2. Nachdem Sie es mit imshow () angezeigt haben, können Sie auf die Tasteneingabe warten und das Fenster zerstören. Versuchen Sie auch in diesem Fall nicht, das Bildfenster mit der oberen rechten Latte zu schließen. Immerhin stürzt es ab. Selbst wenn es richtig angezeigt werden kann, hasse ich es zu sterben, wenn ich einen Fehler mache. Dafür reicht die Spielwelt allein.

Jupyter&nbsp;Notebook


import cv2

filename = "hoge.png "
imgCV = cv2.imread(filename)

#Gehen Sie in einer Zelle wie folgt vor
cv2.imshow("image",imgCV)
cv2.waitKey(0)
cv2.destroyAllWindows()

Was bedeutet korrekte Verarbeitung?

Ich habe geschrieben, dass es cv2.imshow () ist, um das Bild anzuzeigen, aber einige Leute sind zu diesem Zeitpunkt möglicherweise bereits gestolpert. Es funktioniert gut, wenn es in der Entwicklungsumgebung IDLE ausgeführt wird, die bei der Installation mit Python geliefert wird. Aber wenn ich auf die py-Datei doppelklicke, funktioniert es nicht wie erwartet. Nicht einmal VS Code. Dies liegt daran, dass in IDLE die Shell auch nach dem Ende des Programms am Leben bleibt. Wenn jedoch python.exe ausgeführt wird, wird das Bildfenster in dem Moment geschlossen, in dem es endet. Es scheint so als. ** Zerstöre das von cv2 mit cv2 erstellte Fenster. ** Das ist Gerechtigkeit in dieser Welt.

PIL(Pillow) Es gibt eine Bildverarbeitungsbibliothek namens PIL (Python Image Library), und der Nachfolger ist Pillow. Der Unterschied zwischen den Stärken und Schwächen von OpenCV kommt wieder. Selbst wenn Pillow installiert ist, wird PIL importiert, wenn es tatsächlich verwendet wird.

Bild laden Image.open ()

Verwenden Sie es als Image.open (Dateiname). Ein Fehler tritt auf, wenn der Dateiname falsch ist. Genau genommen gibt es auch ein Argument namens mode und der Standardwert ist "r", aber ich bin nicht sicher, was dies bedeutet und welche anderen Werte verwendet werden können.

Bild anzeigen show ()

Das Bild wird durch show () der gelesenen Bilddaten angezeigt. Bilder werden angezeigt, indem für jedes Betriebssystem ein anderer Bildbetrachter gestartet wird. Es ist ein wenig unpraktisch. Zu den Argumenten gehören Titel und Befehl, aber beide können weggelassen werden. Es ist unnötig zu erwähnen, dass Klammern erforderlich sind, auch wenn keine Argumente vorhanden sind.

Quelle


from PIL import Image

filename = "hoge.png "
imgPIL = Image.open(filename)  #Bild wird geladen

imgPIL.show()  #Bildschirm

Informationen zu PIL-Bilddaten

Wenn es sich bei den Bilddaten beispielsweise um ein PNG-Bild handelt, haben sie das Format PIL.PngImagePlugin.PngImageFile und es ist nicht einfach, den Inhalt zu überprüfen. Stattdessen weist es verschiedene Attribute auf, da bekannt ist, dass es sich um Bilddaten handelt.

Holen Sie sich Größe

python


print (imgPIL.mode)
# RGBA  #Es gibt auch RGB L (Graustufen).
# Image.open()Die Beziehung zum Modus von ist unbekannt.

print (imgPIL.size)
# (182, 200)  #Taple, Breite,In der Reihenfolge der Höhe

print (imgPIL.width)
# 182

print (imgPIL.height)
# 200

Wird als Matplotlib-Diagramm angezeigt

Bilder werden häufig als Matplotlib-Diagramme angezeigt. Die detaillierte Verwendung von matplotlib.pyplot wird hier nicht erläutert.

Bei der Ausführung unter Python wird ein interaktives Matplotlib-Diagramm angezeigt. Sie können den Anzeigebereich vergrößern oder ändern. uchuhikoushi_pil_graph.png

Grafiken werden in Google Colab und Jupyter Notebook als einfache Bilder angezeigt. In Jupyter Notebook scheint es gut zu sein, die Magie von% matplotlib inline zu singen.

uchuhikoushi_pil_graph_web.png

e? Können Sie den Unterschied zur normalen Anzeige eines Bildes nicht erkennen? Was würden Sie mit einem solchen Bild machen? dot-e.png  ← ここにいる Dies ist ein 6x8 Bild. Ich bin dankbar, dass die Grafik von matplotlib ein so kleines Bild schön vergrößert. smallpic_pil_graph_web.png

Für PIL-Bilder

Da das PIL-Bild nicht so dargestellt werden kann, wie es ist, muss es mit numpy.asarray () numpy.ndarray erstellt werden.

Quelle


import numpy as np
from PIL import Image
from matplotlib import pyplot as plt
%matplotlib inline  #Inline mit Jupyter Notebook anzeigen

filename = "hoge.png "
imgPIL = Image.open(filename)
arrPIL = np.asarray(imgPIL)
plt.imshow(arrPIL)
plt.show()

Für OpenCV

Nur hier ist das Beispielbild aufgrund verschiedener Umstände kein kleines Skimaner.

Dies ist das Originalbild. nurse.jpg

Numpy.ndarray sowie OpenCV-Bilddaten. Dann sollte plt.imshow so gemacht werden, wie es ist? Wenn ich es versuche. nurse_miss.png

Ja Nein. Sie sagten, das OpenCV-Image sei BGR. Da matplotlib.pyplot normalerweise RGB ist, muss die Farbe konvertiert werden, wenn ein OpenCV-Bild als Diagramm mit matplotlib angezeigt wird.

Verwenden Sie cv2.cvtColor, um Farben zu konvertieren. Verwenden Sie cv2.cvtColor (src, code). src ist die Quelle. Originalbilddaten. Code ist eine integrierte Konstante für die Farbkonvertierung. BGR ist RGB, umgekehrt, RGB ist grau, RGB ist RGBA und so weiter. Es ist cv2.COLOR_BGR2RGB, das BGR in RGB konvertiert. Mit diesem Aufwand können OpenCV-Bilder auch als Matplotlib-Diagramme angezeigt werden.

nurse_good.png

BGR → RGB ist nichts anderes als die umgekehrte Reihenfolge von RGB in der zweiten Folge des Arrays von Formen (Höhe, Breite, BGR-Wert). Sie können auch [Last Learned Slice] nutzen (https://qiita.com/mo256man/items/ed8ea21bd0ae94e5ed48).

Quelle


import numpy as np
import cv2
from matplotlib import pyplot as plt

filename = "nurse.jpg "
imgCV = cv2.imread(filename)

# cv2.Verwendung von cvtColor
imgCV_RGB = cv2.cvtColor(imgCV,cv2.COLOR_BGR2RGB)

#Wie man Scheiben benutzt
# imgCV_RGB = imgCV[:, :, ::-1]

plt.imshow(imgCV_RGB)
plt.show()

Ich habe das transparente PNG-Bild hier nicht verwendet, da ich es in Zukunft detailliert untersuchen werde. Und es ist nicht, weil ich es nicht konnte, versteh mich nicht falsch. Als Beweis wird ein Beispiel gezeigt, in dem Transparenz korrekt als Grafik dargestellt werden kann. uchuhikoushi_cv_graph_color.png

Vorschau beim nächsten Mal

Wenn Sie Bilder miteinander kombinieren, ermöglicht der transparente Teil des Vordergrundbilds, dass das dahinterliegende Bild durchschaut wird. Wenn Sie in den 80ern ein Spieler sind, führen Sie manuell eine Maskenverarbeitung durch, bei der Sie "Oh, Sprite" sagen möchten.

Schauen wir uns zum Schluss noch einmal die Tabelle an, in der transparente Bilder mit verschiedenen Flags angezeigt werden. ~~ Ich habe mein Bestes gegeben, um es zu schaffen ~~ Als Vorbereitung.

Das Originalbild cv2.IMREAD_COLOR cv2.IMREAD_GRAYSCALE cv2.IMREAD_UNCHANGED
original.png 3.png 1.png 4.png

Recommended Posts

Die Geschichte der Anzeige von Bildern mit OpenCV oder PIL (nur)
Die Geschichte des tiefen Lernens mit TPU
Wavelet-Konvertierung von Bildern mit PyWavelets und OpenCV
Die Geschichte der Lernmethode, mit der LinuC Level 1 nur mit ping -t erworben wurde
Die Geschichte des Stoppens des Produktionsdienstes mit dem Befehl hostname
Die Geschichte des Teilens der Pyenv-Umgebung mit mehreren Benutzern
Versuchen Sie, die Bildkonvertierung mit OpenCV mit Python zu projizieren
Visualisieren Sie mit OpenCV den Wertschätzungsstatus von Kunstwerken
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Die Geschichte des Baus von Zabbix 4.4
Die Geschichte der Implementierung des Themas Facebook Messenger Bot mit Python
Die Geschichte eines Rubinisten, der mit Python :: Dict-Daten mit Pycall kämpft
Schätzen Sie die Haltung des AR-Markers mit Python + OpenCV + Drohne
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Die Geschichte, dass man mit Pycharm kein Pygame spielen kann
Der 14. März ist der Tag des Umfangsverhältnisses. Die Geschichte der Berechnung des Umfangsverhältnisses mit Python
Die Farbextraktion mit Python + OpenCV löste das Rätsel des grünen Hintergrunds
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Die Geschichte, wie man Python ausführt und die Ergebnisse anzeigt, ohne vim zu schließen
Die Geschichte der Ausgabe des Planetarium-Meisters im PDF-Format mit Pycairo
Die Geschichte der Visualisierung beliebter Qiita-Tags mit Bar Chart Race
Verwenden von PhantomJS mit AWS Lambda bis zur Anzeige des HTML-Codes der Website
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Der schnellste Weg, um regelmäßig Kamerabilder mit Pythons OpenCV zu erhalten
Die Geschichte von Python und die Geschichte von NaN
Die Geschichte der Teilnahme an AtCoder
Mit OpenCV die einfachsten Fehler finden
Die Geschichte des "Lochs" in der Akte
Laden Sie das GIF-Bild mit Python + OpenCV
Versuchen Sie, das Bild mit opencv2 zu verwischen
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Die Geschichte des Exportierens eines Programms
Zeichnen Sie Figuren mit OpenCV und PIL
Grundlegendes Studium von OpenCV mit Python
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
Lesen Sie das Diagrammbild mit OpenCV und ermitteln Sie die Koordinaten des Endpunkts des Diagramms
Versuchen Sie, nur den Kohlenstoff am Ende der Kette mit SMARTS zu reagieren
Die Geschichte einer Soundkamera mit Touch Designer und ReSpeaker
Erhalten und schätzen Sie die Form des Kopfes mit Dlib und OpenCV mit Python
Erläuterung zum Erstellen einer Anwendung zum Anzeigen von Bildern und Zeichnen mit Python
Die Geschichte des Versuchs, SSH_AUTH_SOCK mit LD_PRELOAD auf dem Bildschirm veraltet zu halten
Die Geschichte der Verwendung von mysqlclient, da PyMySQL nicht mit Django 2.2 verwendet werden kann
python> print> Wird es erst am Ende des Prozesses umgeleitet?> Mit -u ausführen
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
Die Geschichte des Versuchs, den Client wieder zu verbinden
Multi-Class Multi-Label-Klassifizierung von Bildern mit Pytorch
Die Geschichte eines Fehlers in PyOCR
Richten Sie die Größe der Farbleiste an der Matplotlib aus
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Überprüfen Sie die Existenz der Datei mit Python
Versuchen Sie, die Kamera mit Pythons OpenCV zu verwenden
Bilder mit Pupil, Python und OpenCV aufnehmen