Использование значений отсечки для каждого канала эквивалентно обозначению выровненного по оси прямоугольника в цветовом пространстве 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