я написал короткий скрипт для подсчета значения пикселов в изображении:Python скрипт для подсчета значений пикселов не будет работать на менее чем/больше, чем сравнение
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()
Но это просто дал мне случайные супер высокие значения.
ОБНОВЛЕНИЕ - Oct20
Итак, я изменил его:
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}
Измерения - это пиксели, их не может быть больше общего. Откуда я получу 2 миллиона?
Например, я побежал на 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}
и это совершенно неправильно.
Edit Два
Я просто побежал на тестовом массиве:
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}
Почему он делает это?
Хорошо, получилось. Спасибо. – Rich
Эй, у меня все еще есть проблема: количество пикселей постоянно колеблется. – Rich
Подождите, может быть, я не совсем понял, что вы пытаетесь сделать. Вы хотите подсчитать количество элементов массива, которые соответствуют вашему условию, или вы хотите суммировать их содержимое? Если вы хотите, чтобы весь материал 'np.where' не применялся, он не применяется. Вы должны получить правильный результат, просто сделав '((00.99
filippo