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.
Verwenden Sie cv2.imread (* Dateiname *, * Flags *).
Bild wird geladen
import cv2
filename = "hoge.png "
imgCV = cv2.imread(filename) #Flags weggelassen (Standardwert = 1)
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)
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 ..
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.
Ü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 <fontsize="-1">DertatsächlicheHintergrundistehertransparentalskariert |
shape=(200,182,3) |
shape=(200,182) |
shape=(200,182,4) |
Beispiel 2 Graustufenbild |
shape=(192,144,3) |
shape=(192,144) |
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 **.
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
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 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)
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 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()
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.
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.
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
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.
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
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.
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.
e? Können Sie den Unterschied zur normalen Anzeige eines Bildes nicht erkennen? Was würden Sie mit einem solchen Bild machen? ← ここにいる Dies ist ein 6x8 Bild. Ich bin dankbar, dass die Grafik von matplotlib ein so kleines Bild schön vergrößert.
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()
Nur hier ist das Beispielbild aufgrund verschiedener Umstände kein kleines Skimaner.
Dies ist das Originalbild.
Numpy.ndarray sowie OpenCV-Bilddaten. Dann sollte plt.imshow so gemacht werden, wie es ist? Wenn ich es versuche.
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.
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.
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 |
---|---|---|---|