[PYTHON] L'histoire de l'affichage d'images avec OpenCV ou PIL (uniquement)

introduction

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.

Lire l'image cv2.imread ()

Utilisez cv2.imread (* filename *, * flags *).

Chargement d'image


import cv2

filename = "hoge.png "
imgCV = cv2.imread(filename)  #indicateurs omis (valeur par défaut = 1)

Afficher l'image cv2.imshow ()

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)

Postscript: affichage plein écran

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 ..

À propos des données d'image OpenCV

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 **.

Forme de l'image

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

original.png
<fontsize="-1">L'arrière-planréelesttransparentplutôtquequadrillé
3.png
shape=(200,182,3)
1.png
shape=(200,182)
4.png
shape=(200,182,4)
Exemple 2
Image en échelle de gris

reiwa.png
r3.png
shape=(192,144,3)
r1.png
shape=(192,144)
r4.png
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 **.

Obtenir la taille

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

Pour Google Colab

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&nbsp;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)

Pour Jupyter Notebook

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&nbsp;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()

Que signifie un traitement correct?

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.

Charger l'image Image.open ()

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.

Afficher l'image show ()

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

À propos des données d'image PIL

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.

Obtenir la taille

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

S'affiche sous forme de graphique matplotlib

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. uchuhikoushi_pil_graph.png

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.

uchuhikoushi_pil_graph_web.png

e? Ne voyez-vous pas la différence d'afficher une image normalement? Alors que feriez-vous avec une telle image? dot-e.png  ← ここにいる Ceci est une image 6x8. Je suis reconnaissant que le graphique de matplotlib agrandisse bien une si petite image. smallpic_pil_graph_web.png

Pour les images PIL

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()

Pour OpenCV

Seulement ici, en raison de diverses circonstances, l'image d'exemple n'est pas un peu skimaners.

Ceci est l'image originale. nurse.jpg

Numpy.ndarray ainsi que les données d'image OpenCV. Alors plt.imshow doit être fait tel quel? Quand j'essaye. nurse_miss.png

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.

nurse_good.png

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é. uchuhikoushi_cv_graph_color.png

Aperçu de la prochaine fois

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
original.png 3.png 1.png 4.png

Recommended Posts

L'histoire de l'affichage d'images avec OpenCV ou PIL (uniquement)
L'histoire de l'apprentissage profond avec TPU
Conversion en ondelettes d'images avec PyWavelets et OpenCV
L'histoire de la méthode d'apprentissage qui a acquis LinuC Niveau 1 avec seulement ping -t
L'histoire de l'arrêt du service de production avec la commande hostname
L'histoire du partage de l'environnement pyenv avec plusieurs utilisateurs
Essayez de projeter la conversion d'image en utilisant OpenCV avec Python
Visualisez le statut d'appréciation des œuvres d'art avec OpenCV
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
L'histoire de la construction de Zabbix 4.4
L'histoire de la mise en œuvre du sujet Facebook Messenger Bot avec python
L'histoire du rubyiste aux prises avec Python :: Dict data with pycall
Estimer la posture du marqueur AR avec Python + OpenCV + drone
L'histoire de la création d'un bot de boîte à questions avec discord.py
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
L'histoire de ne pas pouvoir exécuter pygame avec pycharm
Le 14 mars est le jour du rapport de circonférence. L'histoire du calcul du ratio de circonférence avec python
L'extraction de couleur avec Python + OpenCV a résolu le mystère du fond vert
L'histoire de la création d'un pilote standard pour db avec python.
L'histoire de l'exécution de python et de l'affichage des résultats sans fermer vim
L'histoire de la sortie du maître de planétarium au format pdf avec Pycairo
L'histoire de la visualisation des balises Qiita populaires avec Bar Chart Race
Utilisation de PhantomJS avec AWS Lambda jusqu'à l'affichage du html du site Web
Je veux vérifier la position de mon visage avec OpenCV!
L'histoire de la création d'un module qui ignore le courrier avec python
Le moyen le plus rapide d'obtenir régulièrement des images de caméra avec opencv de python
L'histoire de Python et l'histoire de NaN
L'histoire de la participation à AtCoder
Trouver les erreurs les plus simples avec OpenCV
L'histoire du "trou" dans le fichier
Charger une image gif avec Python + OpenCV
Essayez de brouiller l'image avec opencv2
L'histoire du remontage du serveur d'application
L'histoire de l'exportation d'un programme
Dessinez des figures avec OpenCV et PIL
Etude de base d'OpenCV avec Python
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
Comment couper la partie inférieure droite de l'image avec Python OpenCV
Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique
Essayez de ne faire réagir que le carbone en bout de chaîne avec SMARTS
L'histoire de la création d'une caméra sonore avec Touch Designer et ReSpeaker
Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
Explication de la création d'une application pour afficher des images et dessiner avec Python
L'histoire de la tentative de pousser SSH_AUTH_SOCK obsolète avec LD_PRELOAD à l'écran
L'histoire de l'utilisation de mysqlclient car PyMySQL ne peut pas être utilisé avec Django 2.2
python> print> Est-il redirigé uniquement à la fin du processus?> Exécuter avec -u
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
L'histoire d'essayer de reconnecter le client
Classification multi-étiquette d'images multi-classes avec pytorch
L'histoire d'une erreur dans PyOCR
Alignez la taille de la barre de couleurs avec matplotlib
J'ai vérifié les options de copyMakeBorder d'OpenCV
L'histoire de la mise en place de MeCab dans Ubuntu 16.04
Vérifier l'existence du fichier avec python
Essayez d'utiliser l'appareil photo avec OpenCV de Python
Capturer des images avec Pupil, python et OpenCV