Проблема 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, поэтому преобразуйте его, прежде чем манипулировать каналами.
Я был бы второй понятие, что можно хотеть рассмотреть подкласс вместо подхода, который Вы обрисовали в общих чертах. Однако не зная Ваш определенный сценарий, YMMV :-)
То, о чем Вы думаете, является метаклассом. __new__
функция в метаклассе передается полное предложенное определение класса, который это может затем переписать, прежде чем класс создается. Вы можете, в то время, sub конструктор для нового.
Пример:
def substitute_init(self, id, *args, **kwargs):
pass
class FooMeta(type):
def __new__(cls, name, bases, attrs):
attrs['__init__'] = substitute_init
return super(FooMeta, cls).__new__(cls, name, bases, attrs)
class Foo(object):
__metaclass__ = FooMeta
def __init__(self, value1):
pass
Замена конструктора, возможно, немного поразительна, но язык действительно оказывает поддержку для этого вида глубокого самоанализа и динамической модификации.
Кроме вопроса, являются ли декораторы класса правильным решением Вашей проблемы:
В Python 2.6 и выше, существуют декораторы класса с - синтаксис, таким образом, можно записать:
@addID
class Foo:
pass
В более старых версиях можно сделать это иначе:
class Foo:
pass
Foo = addID(Foo)
Обратите внимание однако, что это работает то же что касается функциональных декораторов, и что декоратор должен возвратить новое (или измененный оригинал) класс, который не является тем, что Вы делаете в примере. addID декоратор был бы похож на это:
def addID(original_class):
orig_init = original_class.__init__
# Make copy of original __init__, so we can call it without recursion
def __init__(self, id, *args, **kws):
self.__id = id
self.getId = getId
orig_init(self, *args, **kws) # Call the original __init__
original_class.__init__ = __init__ # Set the class' __init__ to the new one
return original_class
Вы могли затем использовать соответствующий синтаксис для своей версии Python, как описано выше.
Но я соглашаюсь с другими, что наследование лучше подходит, если Вы хотите переопределить __init__
.
Это не хорошая практика и нет никакого механизма, чтобы сделать это из-за этого. Правильным способом выполнить, что Вы хотите, является наследование.
Смотрите в документацию класса.
Немного примера:
class Employee(object):
def __init__(self, age, sex, siblings=0):
self.age = age
self.sex = sex
self.siblings = siblings
def born_on(self):
today = datetime.date.today()
return today - datetime.timedelta(days=self.age*365)
class Boss(Employee):
def __init__(self, age, sex, siblings=0, bonus=0):
self.bonus = bonus
Employee.__init__(self, age, sex, siblings)
Таким образом, у Босса есть все Employee
имеет, с также его собственным __init__
метод и собственные участники.