EDIT 2: теперь он возвращает те же результаты, что и код Пола, как и должно ...
import numpy, scipy
image = scipy.misc.imread("test.png") / 255.0
r, g, b = image[:,:,0], image[:,:,1], image[:,:,2]
m, M = numpy.min(image[:,:,:3], 2), numpy.max(image[:,:,:3], 2)
d = M - m
# Chroma and Value
c = d
v = M
# Hue
h = numpy.select([c ==0, r == M, g == M, b == M], [0, ((g - b) / c) % 6, (2 + ((b - r) / c)), (4 + ((r - g) / c))], default=0) * 60
# Saturation
s = numpy.select([c == 0, c != 0], [0, c/v])
scipy.misc.imsave("h.png", h)
scipy.misc.imsave("s.png", s)
scipy.misc.imsave("v.png", v)
, что дает оттенок от 0 до 360, насыщенность от 0 до 1 и значение от 0 до 1Я посмотрел на результаты в формате изображения, и они кажутся хорошими.
Я не был уверен, прочитав ваш вопрос, было ли это только "значение", как в V из HSV, которое вас заинтересовало. Еслиэто так, тогда вы можете обойти большую часть этого кода.
Затем вы можете выбрать пиксели на основе этих значений и установить их в 1 (или белый / черный), используя что-то вроде:
newimage = (v > 0.3) * 1