Opencv attire numpy.les zéros comme une image en nuances de gris
J'ai du mal à comprendre comment opencv interprète des tableaux numpy.
import cv2
import numpy as np
if __name__ == '__main__':
size = (w, h, channels) = (100, 100, 1)
img = np.zeros(size, np.int8)
cv2.imshow('result', img), cv2.waitKey(0)
cv2.destroyAllWindows()
Gris noir 100x100 l'image de droite?
Non, c'est en me montrant le gris! Pourquoi?
OriginalL'auteur Vanuan | 2013-09-22
Vous devez vous connecter pour publier un commentaire.
Ok, la partie cruciale est dtype. J'ai choisi
np.int8
. Lorsque j'utilisenp.uint8
, il est noir.Curieusement, lorsque
dtype=np.int8
, des zéros sont interprétées comme des 127(128)!Je m'attend à ce que le zéro est toujours égale à zéro, peu importe s'il est signé ou non signé.
int8
était noir, comment voulez-vous représenter blanc?Je pensais que uint8(-1) = 255. Semble comme opencv ne pas faire n'importe quel type de coulée et interprète les entiers signés et non signés différemment.
Rappelons que tout nombre est juste un tableau de bits, et le type de données nous montre comment interpréter ce tableau. OpenCV aussi ne voit que peu de tableaux et utilise dtype de l'information à l'interprétation d'une image. Quand il voit
uint8
il pense qu'il est en niveaux de gris de l'image à niveaux de gris de 0 à 127 (à partir de la plus basse à la plus haute valeur possible). Lorsque OpenCV voitint8
, il interprète l'image en niveaux de gris avec des niveaux de gris de -128 à 127 (encore une fois, de la plus basse à la plus élevée). Pixels en virgule flottante image normalement avoir des valeurs entre 0 et 1. Donc, dtype est juste une façon d'interpréter un tableau de bits, et OpenCV est-il assez intuitive 😉Il aurait été plus intuitive, si elle a toujours typecased à uint8, depuis
np.uint8(np.array([-1], np.int8)) == array([255], dtype=uint8)
. Mon intuition dit que 0 est un pixel noir (pas de lumière), 255 est un pixel blanc (max light). Une lumière négative n'a pas de sens pour moi, donc il devrait être typecasted non signé (ou produire une erreur). Virgule flottante interprétation est irrelavant, puisque nous parlons abount signé / non signé problème ici. Comment voulez-vous traiter "-0.5 de couleur"? En suivant votre intuition, si le type estint32
, un zéro doit être aussi gris, mais il n'est pas! En fait,uint32
produire une erreur.Ce que j'essaie de dire, c'est que
imshow
utilise des règles particulières pour interpréter les matrices de types de données particulier, et ces règles sont tout à fait indépendants les uns des autres. Si vous aviez seulementint8
et pas deunit8
, comment voulez-vous interpréter les valeurs? Pour moi, c'est assez intuitif à utiliser un minimum de valeur (-128) en noir et valeur maximale (+127), comme le blanc, bien que vous pouvez être en désaccord avec moi. De toute façon, c'est la façon dont il est mis en œuvre. Notez, cependant, que c'est spécifique à OpenCV. Dans PIL ou Matplotlib, par exemple, les zéros deuint8
,int8
etfloat32
va tous être interprété comme noir.OriginalL'auteur Vanuan
Pour un BGR image,
OriginalL'auteur Mateen Ulhaq