Numpy np.any диапазон или порог

На ваш второй вопрос был дан ответ, но что касается вашего первого:

, что точно фиксирует захват?

blockquote>

Scoping in Python является динамическим и лексический. Закрытие всегда будет помнить имя и область действия переменной, а не объект, на который она указывает. Поскольку все функции в вашем примере создаются в одной области и используют одно и то же имя переменной, они всегда ссылаются на одну и ту же переменную.

EDIT: Что касается вашего другого вопроса о том, как преодолеть это, способы, которые приходят на ум:

  1. Наиболее кратким, но не строго эквивалентным способом является , рекомендованный Адриеном Плиссоном . Создайте лямбда с дополнительным аргументом и установите значение по умолчанию для дополнительного аргумента для объекта, который вы хотите сохранить.
  2. Немного более подробный, но менее хакерский - это создать новую область при каждом создании лямбда:
    >>> adders = [0,1,2,3]
    >>> for i in [0,1,2,3]:
    ...     adders[i] = (lambda b: lambda a: b + a)(i)
    ...     
    >>> adders[1](3)
    4
    >>> adders[2](3)
    5
    
    Область здесь создается с использованием новой функции (лямбда, для краткости), которая связывает ее аргумент и передает значение, которое вы хотите связать в качестве аргумента. Однако в реальном коде вы, скорее всего, будете иметь обычную функцию вместо лямбда для создания новой области:
    def createAdder(x):
        return lambda y: y + x
    adders = [createAdder(i) for i in range(4)]
    

1
задан taras 22 March 2019 в 07:48
поделиться

2 ответа

Проблема 1: Вы можете создать маску и установить красный канал на False, чтобы сохранить значение 255, если вы хотите настроить таргетинг только на белые пиксели

mask_bg = (image == [255, 255, 255])
mask_bg[:, :, 0] = False  # set red channel mask to false (leave 255 value)

image[mask_bg] = 0  # set all white pixels to [255, 0, 0]

Если вы хотите найти все значения в диапазоне, который вы можете использовать cv2.inRange:

mask = cv2.inRange(image, (230, 230, 230), (255, 255,255))

Проблема 2: OpenCV использует BGR по умолчанию вместо RGB, вы можете конвертировать из BGR в RGB с помощью:

new_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow('BGR Image', new_image )
[ 118] Имейте в виду, что если вы откроете изображение с помощью OpenCV, это будет BGR, поэтому преобразуйте его, прежде чем манипулировать каналами.

0
ответ дан dzang 22 March 2019 в 07:48
поделиться

Проблема 1: Пиксели, на которые вы планируете ориентироваться, могут не иметь точного значения (255, 255, 255). Следовательно, лучше преобразовать изображение в двоичную форму, задав диапазон значений пикселей. Вы можете найти точный диапазон, создавая трекбары и настраивая их вручную. Вы можете найти больше информации о реализации трекбаров в OpenCV здесь .

Проблема 2: Это происходит потому, что по умолчанию OpenCV использует цветовое пространство BGR или (Blue, Green, Red). Вы можете изменить цветовое пространство на RGB или (Red, Green, Blue), используя cv2.cvtColor(image, cv2.COLOR_BGR2RGB) перед сохранением.

0
ответ дан Soumik Rakshit 22 March 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: