Проблемы преобразования RGB в YCbCr

Мне нужно преобразовать изображение RGB в цветовое пространство YCbCr, но у меня есть проблемы со сдвигом цвета, я использовал все формулы и получил тот же результат.

Формула в питоне

    cbcr[0] =  int(0.299*rgb[0] + 0.587*rgb[1] + 0.114*rgb[2]) #Y
    cbcr[1] =  int(-0.1687*rgb[0] - 0.3313*rgb[1] + 0.5*rgb[2] + 128) #Cb
    cbcr[2] =  int( 0.5*rgb[0] - 0.4187*rgb[1] - 0.0813*rgb[2] + 128) #Cr

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

http://i.imgur.com/zHuv8yq.png Оригинал

http://i.imgur.com/Ek2WEA1.png Результат

Итак, как я могу получить обычное изображение или преобразовать RGB PNG в YCbCr 4: 2: 2?


person Runnko    schedule 18.10.2013    source источник
comment
Хорошо, у меня новый вопрос. Как я могу сохранить изображение с палитрой YUV? Я имею в виду - я получил значения цвета YUV, но когда я пытаюсь сохранить или объединить изображение, происходит изменение цвета, потому что цвета взяты из палитры RGB, а не YCbCr, и мы получили разные цвета.   -  person Runnko    schedule 20.10.2013


Ответы (1)


Это должно работать (приблизительно)

def _ycc(r, g, b): # in (0,255) range
    y = .299*r + .587*g + .114*b
    cb = 128 -.168736*r -.331364*g + .5*b
    cr = 128 +.5*r - .418688*g - .081312*b
    return y, cb, cr

def _rgb(y, cb, cr):
    r = y + 1.402 * (cr-128)
    g = y - .34414 * (cb-128) -  .71414 * (cr-128)
    b = y + 1.772 * (cb-128)
    return r, g, b

>>> c = _ycc(10, 20, 30)
>>> _rgb(*c)
(10.000005760000002, 20.000681726399996, 29.996457920000005)

См. также Википедию

person embert    schedule 04.12.2013