画像 画像の白いピクセルの総数を数えようとしています。しかし、私のコードでは、このエラーが発生します
srcは派手な配列ではなく、スカラーでもありません。
これは私のコードです:
img=cv2.imread(filename,1)
TP= width * height
white= TP - cv2.countNonZero(img[1])
print "Dimensions:", img.size, "Total pixels:", TP, "White", white
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に等しいことに注意してください。ただし、これはより明確です。
私はマップデータ構造を使用しています。これは、画像のさまざまなピクセルとその数を提供します。他の任意のデータ構造を使用でき、快適です。
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;
}
}
}