2016-10-19 6 views
0

я написал короткий скрипт для подсчета значения пикселов в изображении: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} 

Почему он делает это?

ответ

1

Есть пара проблем с вашим подходом.

Когда вы

(y < 85.00).sum() 

Вы фактически суммируя условия истинности. Таким образом, вы заканчиваете подсчет, когда условие оценивается до True.Вы можете легко увидеть это быстрый пример:

In [6]: x = np.arange(10) 

In [7]: x 
Out[7]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [8]: x < 4 
Out[8]: array([ True, True, True, True, False, False, False, False, False, False], dtype=bool) 

In [9]: (x < 4).sum() 
Out[9]: 4 

Теперь, если вы хотите, чтобы получить показатели, когда условие выполнено, вы можете использовать np.where

In [10]: np.where(x < 4) 
Out[10]: (array([0, 1, 2, 3]),) 

И использовать их для суммы

Другая проблема связана с использованием компактной нотации для диапазона, который легко решается, разделяя его на две части: & или np.logical_and()

In [12]: x[np.where((2 < x) & (x < 6))].sum() 
Out[12]: 12 
+0

Хорошо, получилось. Спасибо. – Rich

+0

Эй, у меня все еще есть проблема: количество пикселей постоянно колеблется. – Rich

+0

Подождите, может быть, я не совсем понял, что вы пытаетесь сделать. Вы хотите подсчитать количество элементов массива, которые соответствуют вашему условию, или вы хотите суммировать их содержимое? Если вы хотите, чтобы весь материал 'np.where' не применялся, он не применяется. Вы должны получить правильный результат, просто сделав '((00.99 filippo

 Смежные вопросы

  • Нет связанных вопросов^_^