L'histoire d'OpenCV et de PIL. Il y a beaucoup d'informations sur le Web, pas seulement Qiita, mais beaucoup d'articles sont fragmentés et ne se prêtent pas à des comparaisons, alors j'ai essayé de le résumer en gardant cela à l'esprit. Dans le processus, j'ai trouvé quelque chose que mon prédécesseur n'a pas touché (semble-t-il), alors j'espère que vous pourrez le lire.
OpenCV CV est une abréviation de Computer Vision, qui a diverses fonctions autres que le simple traitement d'images. Eh bien, cette fois, il s'agit simplement d'afficher des images plutôt que de traiter des images.
Utilisez cv2.imread (* filename *, * flags *).
Chargement d'image
import cv2
filename = "hoge.png "
imgCV = cv2.imread(filename) #indicateurs omis (valeur par défaut = 1)
Utilisez cv2.imshow (* winname *, * mat *).
Affichage de l'image dans une fenêtre non redimensionnable
cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE) #Cette phrase n'a pas à être
cv2.imshow("image", imgCV)
Affichage de l'image dans une fenêtre redimensionnable
cv2.namedWindow("image", cv2.WINDOW_NORMAL) # cv2.WINDOW_Puisque la valeur de NORMAL est 0, 0 peut être spécifié.
cv2.imshow("image", imgCV)
Pour afficher en plein écran, commencez par modifier la taille de la fenêtre, puis réglez-la en plein écran.
Fonctions qui s'affichent ou non en plein écran
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)
#Exemple d'utilisation
cv2_imshow_fullscreen("fullscreen", img , True) #Vue plein écran
cv2_imshow_fullscreen("window", img , False) #Étalage
J'ai essayé d'écrire une fonction pour les deux, mais si vous ne voulez pas afficher en plein écran, vous pouvez simplement faire cv2.imshow () normalement, il était donc préférable d'en faire une fonction dédiée à l'affichage plein écran qui ne se branche pas avec if ..
Les données d'image sont composées du type de numpy.ndarray. Vous pouvez vérifier les dimensions par forme et il est facile de vérifier le contenu. Notez que ** les couleurs sont stockées dans l'ordre BGR **.
Vérifions à quoi ressemblent les données d'image lorsque l'image est lue en spécifiant des indicateurs.
flags | cv2.IMREAD_COLOR | cv2.IMREAD_GRAYSCALE | cv2.IMREAD_UNCHANGED |
---|---|---|---|
valeur | 1 (デフォルトvaleur) |
0 | -1 |
En traitement | Lire comme une image couleur | Lire en échelle de gris | Lire avec les mêmes spécifications |
Exemple 1 Image RGBA <fontsize="-1">L'arrière-planréelesttransparentplutôtquequadrillé |
shape=(200,182,3) |
shape=(200,182) |
shape=(200,182,4) |
Exemple 2 Image en échelle de gris |
shape=(192,144,3) |
shape=(192,144) |
shape=(192,144) |
Avec cv2.IMREAD_COLOR, le nombre de canaux de couleur est uniformément organisé en 3 canaux, que l'image soit transparente ou en niveaux de gris. Dans le cas de cv2.IMREAD_GRAYSCALE, le nombre de canaux n'est pas de 1, mais il s'agit d'un tableau bidimensionnel sans nombre spécifié de canaux (h, w). cv2.IMREAD_UNCHANGED est [Tutoriel OpenCV-Python "Gestion des images"](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_image_display/py_image_display .html # id3) dit "Lire comme une image comprenant le canal alpha", mais il n'a pas 4 canaux uniformément, et il est correct de lire à partir de l'image originale sans changement. 4 canaux pour les images RGBA, 3 canaux pour les images RVB. Puisqu'il s'agit d'un canal pour une image en niveaux de gris, il renvoie (h, w) au lieu de (h, w, 1). Est-ce compliqué? Non, vous avez dit que depuis le début, cv2.IMREAD _ ** UNCHANGED **.
Données d'image OpenCV avec différentes formes de tableau en fonction du type d'image d'origine. Vous n'avez pas besoin d'utiliser l'instruction if pour séparer les observations afin d'obtenir la hauteur et la largeur. La forme de l'image en échelle de gris obtenue par (hauteur, largeur) et l'image couleur obtenue par (hauteur, largeur, nombre de canaux) sont les mêmes que d'avoir la 0ème hauteur et la 1ère largeur. C'est pourquoi vous devriez décider avec 0 ou 1.
python
#L'un ou l'autre est acceptable
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 () ne peut pas être utilisé dans Google Colab. Il semble que la session Jupyter plante. Au lieu de cela, il offre une alternative pour utiliser la propre méthode de Google Colab appelée cv2_imshow (). Aucun nom de fenêtre n'est requis pour cv2_imshow (), seules les données d'image sont spécifiées. Cela affichera l'image dans la cellule de Colab.
Google Colab
#1 cellule 1 phrase ou tout peut être mis ensemble
import cv2
from google.colab.patches import cv2_imshow
filename = "hoge.png "
imgCV = cv2.imread(filename)
cv2_imshow(imgCV)
Jupyter Notebook n'interdit pas cv2.imshow (), mais il peut toujours planter.
En fait, dans Jupyter Notebook, il peut être affiché correctement en effectuant le traitement correct. Cv2. Après l'avoir affiché avec imshow (), vous pouvez attendre l'entrée de la clé et détruire la fenêtre. Même dans ce cas, n'essayez pas de fermer la fenêtre d'image avec la latte supérieure droite. Après tout, il plante. Même si cela peut être affiché correctement, je déteste mourir si je fais une erreur. Le monde du jeu à lui seul suffit pour cela.
Jupyter Notebook
import cv2
filename = "hoge.png "
imgCV = cv2.imread(filename)
#Faites ce qui suit dans une cellule
cv2.imshow("image",imgCV)
cv2.waitKey(0)
cv2.destroyAllWindows()
J'ai écrit que c'était cv2.imshow () pour afficher l'image, mais certaines personnes ont peut-être déjà trébuché à ce stade. Cela fonctionne bien lorsqu'il est exécuté sur l'environnement de développement IDLE fourni avec Python lorsqu'il est installé. Mais lorsque je double-clique sur le fichier py, cela ne fonctionne pas comme prévu. Pas même VS Code. En effet, dans IDLE, le shell reste actif même après la fin du programme, mais lorsque python.exe est exécuté, la fenêtre d'image se ferme au moment où elle se termine. Il semble que. ** Détruisez une fenêtre créée avec cv2 avec cv2. ** C'est la justice dans ce monde.
PIL(Pillow) Il existe une bibliothèque de traitement d'image appelée PIL (Python Image Library), et le successeur est Pillow. La différence entre les forces et les faiblesses d'OpenCV revient. Même si Pillow est installé, c'est PIL qui est importé lors de son utilisation réelle.
Utilisez-le comme Image.open (nom de fichier). Une erreur se produira si le nom de fichier est incorrect. À proprement parler, il existe également un argument appelé mode et la valeur par défaut est "r", mais je ne suis pas sûr de ce que cela signifie et quelles autres valeurs peuvent être utilisées.
L'image est affichée par show () les données d'image lues. Les images sont affichées en démarrant une visionneuse d'images différente pour chaque système d'exploitation. C'est un peu gênant. Les arguments incluent le titre et la commande, mais les deux peuvent être omis. Inutile de dire que les parenthèses sont obligatoires même s'il n'y a pas d'arguments.
La source
from PIL import Image
filename = "hoge.png "
imgPIL = Image.open(filename) #Chargement d'image
imgPIL.show() #Affichage de l'image
Par exemple, si les données d'image sont une image png, elles sont au format PIL.PngImagePlugin.PngImageFile, et il n'est pas facile de vérifier le contenu. Au lieu de cela, il a divers attributs car il est conscient qu'il s'agit de données d'image.
python
print (imgPIL.mode)
# RGBA #Il existe également RVB L (échelle de gris).
# Image.open()La relation avec le mode de est inconnue.
print (imgPIL.size)
# (182, 200) #Taple, largeur,Par ordre de hauteur
print (imgPIL.width)
# 182
print (imgPIL.height)
# 200
Les images sont souvent affichées sous forme de graphiques matplotlib. L'utilisation détaillée de matplotlib.pyplot n'est pas expliquée ici.
Lorsqu'il est exécuté sur python, un graphique matplotlib interactif apparaît. Vous pouvez agrandir ou modifier la zone d'affichage.
Les graphiques sont affichés sous forme d'images simples sur Google Colab et Jupyter Notebook. Dans Jupyter Notebook, il semble bon de chanter la magie de% matplotlib inline.
e? Ne voyez-vous pas la différence d'afficher une image normalement? Alors que feriez-vous avec une telle image? ← ここにいる Ceci est une image 6x8. Je suis reconnaissant que le graphique de matplotlib agrandisse bien une si petite image.
Puisque l'image PIL ne peut pas être représentée graphiquement telle quelle, il est nécessaire de la rendre numpy.ndarray avec numpy.asarray ().
La source
import numpy as np
from PIL import Image
from matplotlib import pyplot as plt
%matplotlib inline #Affichage en ligne avec Jupyter Notebook
filename = "hoge.png "
imgPIL = Image.open(filename)
arrPIL = np.asarray(imgPIL)
plt.imshow(arrPIL)
plt.show()
Seulement ici, en raison de diverses circonstances, l'image d'exemple n'est pas un peu skimaners.
Ceci est l'image originale.
Numpy.ndarray ainsi que les données d'image OpenCV. Alors plt.imshow doit être fait tel quel? Quand j'essaye.
Oui Non. Vous avez dit que l'image OpenCV est BGR. Comme matplotlib.pyplot est généralement RVB, il est nécessaire de convertir la couleur lors de l'affichage d'une image OpenCV sous forme de graphique avec matplotlib.
Utilisez cv2.cvtColor pour convertir les couleurs. Utilisez cv2.cvtColor (src, code). src est la source. Données d'image d'origine. le code est une constante intégrée pour la conversion des couleurs. BGR est RVB, vice versa, RVB est gris, RVB est RVBA, et ainsi de suite. C'est cv2.COLOR_BGR2RGB qui convertit BGR en RVB. Avec cet effort, les images OpenCV peuvent également être affichées sous forme de graphiques matplotlib.
BGR → RVB n'est rien d'autre que l'ordre inverse de RVB dans la deuxième séquence du tableau de formes (hauteur, largeur, valeur BGR). Vous pouvez également profiter de la Dernière tranche apprise.
La source
import numpy as np
import cv2
from matplotlib import pyplot as plt
filename = "nurse.jpg "
imgCV = cv2.imread(filename)
# cv2.Comment utiliser cvtColor
imgCV_RGB = cv2.cvtColor(imgCV,cv2.COLOR_BGR2RGB)
#Comment utiliser les tranches
# imgCV_RGB = imgCV[:, :, ::-1]
plt.imshow(imgCV_RGB)
plt.show()
Je n'ai pas utilisé l'image png transparente ici car je l'étudierai en détail à l'avenir. Et ce n'est pas parce que je ne pouvais pas le faire, ne vous méprenez pas. Pour preuve, un exemple dans lequel la transparence peut être correctement exprimée sous forme d'image graphique est présenté.
Lors de la synthèse d'une image avec une image, la partie transparente de l'image de premier plan permet de voir l'image derrière. Si vous êtes un joueur dans les années 80, vous effectuerez manuellement un traitement de masque qui vous donnera envie de dire "Oh, sprite".
Enfin, regardons à nouveau le tableau qui affiche des images transparentes avec différents indicateurs. ~~ J'ai fait de mon mieux pour le faire ~~ En guise de préparation.
L'image originale | cv2.IMREAD_COLOR | cv2.IMREAD_GRAYSCALE | cv2.IMREAD_UNCHANGED |
---|---|---|---|
Recommended Posts