2015-11-30 1 views
0

Я новичок в Python, много сделал MATLAB, и теперь я борюсь с самыми легкими вещами. Моя проблема заключается в следующем: У меня есть изображение синтетической сцены. Определенные объекты имеют предопределенное значение rgb. Теперь я хочу извлечь эти объекты. Я объявляю значения RGB плюс некоторое смещение, и поэтому я могу создать маску, содержащую только пиксели, принадлежащие объекту, а все остальное - 0 (= черный).Маскировка объектов с определенными значениями RGB в изображениях


В течение краткого примера, предположим, что цвет нужного объекта в RGB-значений г = 255, B = 0, г = 60 со смещением = 5 для каждого цвета. Пока мой код выглядит следующим образом:

import cv2 
import numpy as np 
# read image_file 
color_frame = cv2.imread(image_file,1) 
# split the channles 
b_ch,g_ch,r_ch = cv2.split(color_frame) 
# mask the different channels seperately 
color_frame[np.where((b_ch < b-offset) | (b_ch > b+offset))] = 0 
color_frame[np.where((g_ch < g-offset) | (g_ch > g+offset))] = 0 
color_frame[np.where((r_ch < r-offset) | (r_ch > r+offset))] = 0 
# show the extracted image 
cv.imshow('Extracted Object',color_frame) 
cv.waitKey(0) 
cv.destroyAllWindows() 

До сих пор это все работает нормально, но я хотел бы решить «маскировку» в более быстрый/более эффективным способом. Есть ли возможность назначить что-то вроде всех 3 ограничений в одной строке? Что-то вроде color_frame[((b_ch < b-offset) | (b_ch > b+offset)) & ... & ((r_ch < r-offset) | (r_ch > r+offset)))] = 0 (это не работает) или мое решение уже самое эффективное?

+0

вы также можете использовать np.logical_and (b_ch <б-смещение, b_ch> Ь + смещение) вместо np.where –

ответ

1

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

color_frame[np.where(((b_ch < b-offset) | (b_ch > b+offset)) & ((g_ch < g-offset) | (g_ch > g+offset)) & ((r_ch < r-offset) | (r_ch > r+offset)))] = 0 
+0

Эй Мартин, спасибо за ваш ответ, к сожалению, это не решает проблема. Сам Python не вызывает ошибки, но результат неверен. Если я использую это только для 2-х каналов (например, красного и синего), а позже добавьте зеленое ограничение, оно будет работать. Почему-то я понятия не имею. Даже дополнительные скобки внутри 'np.where()' для объединения двух условий не изменяют результат. Странно ... – Martin

+0

Я думаю, это потому, что ваш исходный код на самом деле логичен ИЛИ. Таким образом, вы можете изменить '&' на '|'. :-) –

+1

Awesome: D работает сейчас! Это была глупая ошибка, так как я меняю пиксели, я НЕ хочу 0. – Martin