web-dev-qa-db-ja.com

画像内の白いピクセルの総数をカウントするとエラーがスローされます

画像 画像の白いピクセルの総数を数えようとしています。しかし、私のコードでは、このエラーが発生します

srcは派手な配列ではなく、スカラーでもありません。

これは私のコードです:

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

Imageが大文字であることに注意してください... PILでは、Imageはクラスです。実際の画像データはクラス内の多くのプロパティの1つであり、PILはnumpy配列を使用しません。したがって、あなたの画像は派手な配列ではありません。 numpy配列に変換したい場合は、単に画像を配列として入れます:

_img = np.array(img)
_

OpenCVで画像を読み取る場合、すでにnumpy配列として提供されています。

_img = cv2.imread(filename)
_

また、PILとOpenCVではチャネルの順序が異なることに注意してください。 PILでは画像はRGB順で読み取られますが、OpenCVではBGR順で読み取られます。したがって、PILで読み取り、OpenCVで表示する場合は、表示する前にチャネルを交換する必要があります。


編集:また、 OpenCV docs for countNonZero() も確認してください。この関数は単一チャネル配列でのみ機能するため、画像をグレースケールに変換するか、ゼロのカウント方法を決定する必要があります。また、np.sum(img == 0)だけでnumpyを使用してゼロ値の数をカウントしたり、np.sum(img > 0)を使用して非ゼロ値をカウントしたりすることもできます。 3チャネル配列の場合、これは各チャネルのすべてのゼロを個別にカウントします。 3つの色すべてでゼロであるものだけを含める場合は、いくつかのことを実行できます-最も簡単なのは、すべてのチャネルを1つの2D配列にまとめてから、上記と同じことです。


Edit2:また、現在のコードは、白ではなくblackピクセルの数をカウントしています。 countNonZero()は、0より大きいすべてのピクセルの数を返します。次に、ピクセルの総数からその数を減算します。これにより、黒いピクセルのみが得られます。白いピクセルの数を数えたいだけなら、np.sum(img == 255)


Edit3:あなたの画像では、このコードはうまくいきます:

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

白のピクセル数:5

ここで、_cv2.IMREAD_GRAYSCALE_は0に等しいことに注意してください。ただし、これはより明確です。

9
alkasm

私はマップデータ構造を使用しています。これは、画像のさまざまなピクセルとその数を提供します。他の任意のデータ構造を使用でき、快適です。

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