0

画像内のピクセル値をカウントする短いスクリプトを作成しました。

import os
import sys
import cv2
import numpy as np

imn = (sys.argv[1])
a = cv2.imread(imn, 0)
b = cv2.imread(imn, 1)
c = cv2.GaussianBlur(cv2.imread(imn, 0), (7,7), 2)

def NC(img):
    y = img.reshape(1, -1)
    numA = (y < 127.5).sum()
    numB = (y > 127.5).sum()
    return ({'less': numA, 'greater': numB})

aa = NC(a)
bb = NC(b)
cc = NC(c)
print "File:  {}".format(imn.split('/')[-1])
print "Image: {} - Set: {}".format('A', aa)
print "Image: {} - Set: {}".format('B', bb)
print "Image: {} - Set: {}".format('C', cc)

そして、それは完全に機能します:

File:  ObamaBidenSituationRoom.jpg
Image: A - Set: {'greater': 480558, 'less': 611282}
Image: B - Set: {'greater': 1441948, 'less': 1833572}
Image: C - Set: {'greater': 471559, 'less': 620281}

しかし、私がそれを展開しようとしたとき:

def NC(img):
    y = img.reshape(1, -1)

    numA = (00.99 < y < 85.00).sum()
    numB = (85.00 < y < 170.0).sum()
    numC = (170.0 < y < 256.0).sum()

    return ({'low': numA, 'middle': numB, 'high': numC})

それは私にエラーを与えました:

Traceback (most recent call last):
  File "Bins--02.py", line 25, in <module>
    aa = NC(a)
  File "Bins--02.py", line 17, in NC
    numA = (00.99 < y < 85.00).sum()
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

少し前にこの画像を取得しましたが、それは使用しなくなった matplotlib ライブラリを使用していました。なぜここに来ているのですか?大なり/小なり記号を間違って境界付けていますか? 私はそれを修正しようとしました

numA = (00.99 < y).sum() and (y < 85.00).sum()

しかし、それは私にランダムな非常に高い値を与えました.

更新 - 10 月 20 日

だから、私はそれを変更しました:

def NC(img):
    x = img.reshape(1, -1)


    numA = x[np.where((00.99 < x) & (x < 85.00))].sum()
    numB = x[np.where((85.00 < x) & (x < 170.0))].sum()
    numC = x[np.where((170.0 < x) & (x < 256.0))].sum()
    numD = x.shape

    return ({'total': numD, 'low': numA, 'middle': numB, 'high': numC})

これで動作するようになりましたが、問題があります。ピクセル数が一致しません。

Image:  lenna.png
Image:  A Set:{'high': 8367459, 'middle': 20278460, 'total': (1, 262144), 'low': 3455619}
Image:  B Set:{'high': 45250935, 'middle': 43098232, 'total': (1, 786432), 'low': 11609051}
Image:  C Set:{'high': 8216989, 'middle': 20633144, 'total': (1, 262144), 'low': 3531090}

測定値はピクセルであり、合計を超えることはできません。200万はどこから?

たとえば、100x100 の青い円の画像で実行しました。

Image:  lightblue.png
Image:  A Set:{'high': 0, 'middle': 1035999, 'total': (1, 10000), 'low': 0}
Image:  B Set:{'high': 1758789, 'middle': 1212681, 'total': (1, 30000), 'low': 417612}
Image:  C Set:{'high': 0, 'middle': 1014135, 'total': (1, 10000), 'low': 31801}

そしてそれは完全に間違っています。

編集 2

テスト配列で実行しました:

i = np.array([[1, 1, 1, 1, 1, 1, 1, 1], [3, 3, 3, 3, 3, 3, 3, 3], [200, 200, 200, 200, 200, 200, 200, 200]])

def NC(img):
    x = img.reshape(1, -1)
    numA = x[np.where((00.99 < x) & (x < 85.00))].sum()
    numB = x[np.where((85.00 < x) & (x < 170.0))].sum()
    numC = x[np.where((170.0 < x) & (x < 256.0))].sum()
    numD = (img.shape[0] * img.shape[1])
    return ({'total': numD, 'low': numA, 'middle': numB, 'high': numC})

aa = NC(i)
bb = NC(i)
cc = NC(i)

print "Image:  {} Set:{}".format('A', aa)
print "Image:  {} Set:{}".format('B', bb)
print "Image:  {} Set:{}".format('C', cc)

そして、それは完全に壊れています:

Image:  A Set:{'high': 1600, 'middle': 0, 'total': 24, 'low': 32}
Image:  B Set:{'high': 1600, 'middle': 0, 'total': 24, 'low': 32}
Image:  C Set:{'high': 1600, 'middle': 0, 'total': 24, 'low': 32}

なぜこれを行うのですか?

4

1 に答える 1