web-dev-qa-db-fra.com

Compter le nombre total de pixels blancs dans une image génère une erreur

Image J'essaie de compter le nombre total de pixels blancs dans une image. Mais avec mon code, je reçois cette erreur

src n'est pas un tableau numpy, ni un scalaire.

Voici mon code:

img=cv2.imread(filename,1)
TP= width * height
white= TP - cv2.countNonZero(img[1])
print "Dimensions:", img.size, "Total pixels:", TP, "White", white
4
pixelthread

Notez que Image est en majuscule ... dans PIL, Image est une classe. Les données d'image réelles sont l'une des nombreuses propriétés à l'intérieur de la classe et PIL n'utilise pas de tableaux numpy. Ainsi, votre image n'est pas un tableau numpy. Si vous souhaitez convertir en un tableau numpy, mettez simplement l'image sous forme de tableau:

img = np.array(img)

Si vous lisez l'image avec OpenCV, elle est déjà fournie sous forme de tableau numpy.

img = cv2.imread(filename)

Notez également que l'ordre des canaux est différent dans PIL qu'OpenCV. En PIL, les images sont lues en ordre RVB, tandis qu'en OpenCV, elles sont en ordre BGR. Donc, si vous lisez avec PIL mais affichez avec OpenCV, vous devrez échanger les canaux avant l'affichage.


Edit: vérifiez également les documents OpenCV pour countNonZero() . Cette fonction ne fonctionne que sur des tableaux à canal unique, vous devrez donc convertir l'image en niveaux de gris ou décider comment vous voulez compter un zéro. Vous pouvez également utiliser numpy simplement par np.sum(img == 0) pour compter le nombre de valeurs nulles ou np.sum(img > 0) pour compter les valeurs non nulles. Pour une matrice à trois canaux, cela comptera tous les zéros de chaque canal indépendamment. Si vous souhaitez inclure uniquement ceux qui sont nuls dans les trois couleurs, vous pouvez faire un certain nombre de choses --- le plus simple est probablement d'ajouter tous les canaux ensemble dans un tableau 2D, puis de faire la même chose que ci-dessus.


Edit2: aussi, votre code compte actuellement le nombre de pixels noirs , pas blancs. countNonZero() renverra le nombre de pixels supérieur à 0. Ensuite, vous soustrayez cela du nombre total de pixels ... ce qui vous donnera uniquement les pixels noirs. Si vous voulez juste compter le nombre de pixels blancs, np.sum(img == 255).


Edit3: Donc avec votre image, ce code fonctionne très bien:

import cv2
import numpy as np

img = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)
n_white_pix = np.sum(img == 255)
print('Number of white pixels:', n_white_pix)

Nombre de pixels blancs: 5

Notez ici que cv2.IMREAD_GRAYSCALE Est juste égal à 0, mais c'est plus explicite.

9
alkasm

J'utilise la structure des données cartographiques, cela vous donnera différents pixels d'une image et également leur nombre. Vous pouvez utiliser n'importe quelle autre structure de données avec laquelle vous êtes à l'aise.

map<Vec3b, int> palette;
for (int y = 0; y<im.rows; y++) {

for (int x = 0; x<im.cols; x++)
    {
        Vec3b color = im.at<Vec3b>(Point(x, y));
        if (palette.count(color) == 0)
        {
            palette[color] = 1;
        }
        else
        {
            palette[color] = palette[color] + 1;
        }
    }
}
2
Muskan Agarwal