Проверьте, содержится ли пиксель (RGB или HSV) в диапазоне цветовой шкалы, как

Мне нужно проверить, содержится ли пиксель (RGB) в цветовой шкале от очень светло-розового до темно-фиолетового. Используя схему RGB, я могу сделать такую ​​​​проверку:

IF image [x, y] [R]> threshold and image [x, y] [G]> threshold image [x, y] [B]> threshold and \
     image [x, y] [R] <threshold and image [x, y] [G] < threshold image [x, y] [B] <threshold THAN ...

?

Если нет, у меня также есть возможность иметь пиксель в HSV.

Спасибо!


person originof    schedule 01.03.2011    source источник


Ответы (3)


Вы, вероятно, захотите работать в HSV, потому что он гораздо более интуитивно понятен человеческому восприятию, чем RGB. Если вы заставите человека пометить цвета как «в пределах диапазона» или «вне диапазона» и отобразите их в HSV, вы сможете найти границу значений H, S и V, которая указывает на вход и выход.

Затем вы можете использовать простую проверку диапазона, как вы описали, чтобы определить, входит ли цвет или нет. Если вам нужна помощь Python с преобразованием цветового пространства, модуль стандартной библиотеки colorsys сделает это за вас.

person Ned Batchelder    schedule 01.03.2011

Использование значений отсечки для каждого канала эквивалентно назначению выровненного по оси прямоугольного блока в цветовом пространстве RGB. Коробка имеет неприятную форму - вам, вероятно, придется включить некоторые области, которые вам действительно не нужны (в углах), чтобы избежать исключения областей, которые вам нужны (в центре граней).

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

Что-то типа

def colorRange(ax, ay, az, bx, by, bz, dist):
    def testPixel(cx, cy, cz):
        return (
            (cx-ax)**2 + (cy-ay)**2 + (cz-az)**2
            + (cx-bx)**2 + (cy-by)**2 + (cz-bz)**2
        ) < dist**2
    return testPixel

isPurple = colorRange(140,0,140, 255,75,255, 230)
isPurple(203,46,195)  # -> True
person Hugh Bothwell    schedule 01.03.2011

Если вы говорите о целочисленных значениях RGB, вы можете поместить все значения в set, а затем просто сделать if color in set:

Если ваш «цветовой диапазон» определен сложным образом, определение конкретного набора цветов может быть единственным способом.

person tkerwin    schedule 01.03.2011
comment
Это будет большой набор! :) - person Ned Batchelder; 01.03.2011
comment
Все зависит от того, как определен цветовой диапазон. Цвет от очень светло-розового до темно-фиолетового недостаточно точен, чтобы угадать. - person tkerwin; 02.03.2011
comment
Если вы предполагаете, что это 5% объема 24-битного цветового куба, вы видите около 850 000 дискретных значений. - person Hugh Bothwell; 02.03.2011