Как справиться с преобразованием RGB в YUV

Формула говорит:

Y = 0.299 * R + 0.587 * G + 0.114 * B;

U = -0.14713 * R - 0.28886 * G + 0.436 * B;

V = 0.615 * R - 0.51499 * G - 0.10001 * B;

Что если, например, переменная U станет отрицательной?

U = -0.14713 * R - 0.28886 * G + 0.436 * B;

Предположим, что максимальные значения для R и G (единицы) и B = 0. Итак, я заинтересован в реализации этой функции преобразования в OpenCV. Итак, как поступать с отрицательными значениями? Использование плавающего изображения? в общем, объясните мне, может я чего-то не понимаю..


person maximus    schedule 25.05.2010    source источник


Ответы (3)


Вы можете преобразовать RGB‹->YUV в OpenCV с помощью cvtColor, используя code CV_YCrCb2RGB для YUV->RGB и CV_RGBYCrCb для RGB->YUV.

void cvCvtColor(const CvArr* src, CvArr* dst, int code)

Преобразует изображение из одного цветового пространства в другое.

person Jacob    schedule 25.05.2010
comment
Спасибо!! Я искал такую ​​функцию и думал, что YCrCb — это нечто иное, чем YUV... - person maximus; 25.05.2010
comment
Без проблем. Обратите внимание, что вы также можете конвертировать 3-канальные изображения. Если вам нужно объединить компоненты Y, U и V, вы можете сделать это с помощью merge, который принимает объект vector<Mat>. - person Jacob; 25.05.2010
comment
@maximus - строго говоря, так и есть. YUV - стандарт аналогового телевидения, YCrCb - цифровой, цветовое пространство другое. Но только очень слегка - person Martin Beckett; 17.01.2012
comment
В C++: cv::cvtColor(image, yuv_image, CV_RGB2YCrCb); - person Lucas W; 15.03.2015
comment
Имейте в виду, что в настоящее время в opencv 2.4.* есть ошибка, которая вызывает некорректное преобразование из RGB в YUV. Красный и Синий каналы переставлены местами в реализованной формуле. code.opencv.org/issues/4227 - person Temak; 27.04.2015
comment
Посмотрите подробный пост об ошибке здесь stackoverflow.com/a/29890941/1351629 - person Temak; 27.04.2015

Y, U и V могут быть отрицательными при представлении десятичными знаками в соответствии с цветовой плоскостью YUV.

Цветовое пространство YUV

person Dolph    schedule 25.05.2010

для плоских форматов OpenCV не подходит для этой работы. Вместо этого вам лучше использовать ffmpeg. Например

static void rgbToYuv(byte* src, byte* dst, int width,int height)
{

    byte* src_planes[3] = {src,src + width*height, src+ (width*height*3/2)};
    int src_stride[3] = {width, width / 2, width / 2};
    byte* dest_planes[3] = {dst,NULL,NULL};
    int dest_stride[3] = {width*4,0,0};
    struct SwsContext *img_convert_ctx = sws_getContext(
        width,height,
        PIX_FMT_YUV420P,width,height,PIX_FMT_RGB32,SWS_POINT,NULL,NULL,NULL);
        sws_scale(img_convert_ctx, src_planes,src_stride,0,height,dest_planes,dest_stride); 
    sws_freeContext(img_convert_ctx);
}

преобразует изображение YUV420 в RGB32

person Yaur    schedule 02.08.2013
comment
Интересный подход :) - person maximus; 04.08.2013