Я реализовал RGB-> YCrCb и ycrcb-> RGB преобразование с использованием формул преобразования JPEG из
http://www.w3.org/Graphics/JPEG/jfif3.pdf
(то же самое на: http://en.wikipedia.org/wiki/YCbCr (преобразования JPEG)).JPEG: YCrCb <-> RGB точность преобразования
При проверке правильности результатов (оригинал-> YCrCb-> RGB) некоторые пиксели отличаются друг от друга, например, 201-> 200.
Средний процент ошибок точности составляет 0,1%, поэтому он не критичен.
/// converts RGB pixel to YCrCb using { en.wikipedia.org/wiki/YCbCr: JPEG conversion }
ivect4 rgb2ycrcb(int r, int g, int b)
{
int y = round(0.299*r + 0.587*g + 0.114*b) ;
int cb = round(128.0 - (0.1687*r) - (0.3313*g) + (0.5*b));
int cr = round(128.0 + (0.5*r) - (0.4187*g) - (0.0813*b));
return ivect4(y, cr, cb, 255);
}
/// converts YCrCb pixel to RGB using { en.wikipedia.org/wiki/YCbCr: JPEG conversion }
ivect4 ycrcb2rgb(int y, int cr, int cb)
{
int r = round(1.402*(cr-128) + y);
int g = round(-0.34414*(cb-128)-0.71414*(cr-128) + y);
int b = round(1.772*(cb-128) + y);
return ivect4(r, g, b, 255);
}
Я использую круглую формулу:
этажа ((х) + 0,5)
При использовании других типов округления, например, float (int) или std :: ceil(), результаты еще хуже.
Итак, Есть ли способ сделать YCrCb < -> Преобразование RGB без потери точности?
В описании HSV указано, что есть обработка этих случаев, но в YCrCb это не описано. –
Способ использования этой ситуации в YCbCr - использовать самый близкий цвет. Вы получите значения компонентов вне диапазона 0-255 в преобразовании. Вы зажимаете их до диапазона. – user3344003