2015-04-17 6 views
0

В настоящее время я преобразовываю изображение из Формат RGB в YCrCb с использованием функции OpenCV - cvtColor. Я хотел бы выполнить преобразование в одиночку с уравнениями, похожими наПреобразование RGB в YCbCr в OpenCV

//equations for RGB to YUV conversion 
Y' = 0.299 R + 0.587 G + 0.114 B 
U = -0.147 R - 0.289 G + 0.436 B 
V = 0.615 R - 0.515 G - 0.100 B.  

Я не могу понять OpenCV матричную операцию изображения. Я хотел бы получить доступ к значениям пикселей RGB из изображения Mat, чтобы я мог выполнить преобразование самостоятельно. Как я могу получить значения R, G, B из образа, а затем как применить преобразование? Мой текущий код ниже.

int main (int argc, char *argv[]) 
{ 
    // Load in image 
    cv::Mat src = cv ::imread("C:\\openv2410\\frames\\frame_0.png",1); 

    // Create a vector for the channels and split the original image into B G R colour channels. 
    // Keep in mind that OpenCV uses BGR and not RGB images 
    vector<cv::Mat> spl; 
    split(src,spl); 

    // Create an zero pixel image for filling purposes - will become clear later 
    // Also create container images for B G R channels as colour images 
    cv::Mat empty_image = cv::Mat::zeros(src.rows, src.cols, CV_8UC1); 
    cv::Mat empty_channel = cv::Mat::zeros(src.rows, src.cols, CV_8UC1); 

    cv::Mat result_blue(src.rows, src.cols, CV_8UC3); // notice the 3 channels here! 
    cv::Mat result_green(src.rows, src.cols, CV_8UC3); // notice the 3 channels here! 
    cv::Mat result_red(src.rows, src.cols, CV_8UC3); // notice the 3 channels here! 

    // Create blue channel 
    cv::Mat in1[] = { spl[0], empty_image, empty_image }; 
    int from_to1[] = { 0,0, 1,1, 2,2 }; 
    mixChannels(in1, 3, &result_blue, 1, from_to1, 3); 

    // Create green channel 
    cv::Mat in2[] = { empty_channel, spl[1], empty_image }; 
    int from_to2[] = { 0,0, 1,1, 2,2 }; 
    mixChannels(in2, 3, &result_green, 1, from_to2, 3); 

    // Create red channel 
    cv::Mat in3[] = { empty_channel, empty_channel, spl[2]}; 
    int from_to3[] = { 0,0, 1,1, 2,2 }; 
    mixChannels(in3, 3, &result_red, 1, from_to3, 3);  

    imshow("blue channel",result_blue); 
    imshow("green channel",result_green); 
    imshow("red channel",result_red); 

    cv::waitKey(0); 
    return 0;  
}  
+0

может быть, это может помочь: http://stackoverflow.com/a/7903042/3702797 – Kaiido

+0

возможно дубликат [OpenCV получить значение пикселя канала от Mat изображения] (http://stackoverflow.com/questions/7899108/opencv-get-pixel-channel-value-from-mat-image) – Kiran

+0

@Kiran, не уверен, что это действительно обман, вопрос здесь * также * о преобразовании его в YCbCr вручную, а не только о получении пиксельного канала – Kaiido

ответ

1

Образец кода для преобразования из BGR в YCrCb. Источник (1).

//sample input and output 
float data[3][1] = { 98,76,88 }; 
Mat input(1, 1, CV_32FC3, data) ; 
Mat output(1, 1, CV_32FC3); 

//iterate over all pixels 
for(int i = 0; i < input.rows; i++) { 
    for(int j = 0; j < input.cols; j++) { 
     //get bgr pixel 
     Vec3f bgrPixel = input.at<Vec3f>(i, j); 

     float B = bgrPixel[0]; 
     float G = bgrPixel[1]; 
     float R = bgrPixel[2];   

     //actual conversion from BGR to YCrCb 
     float delta = 0.5f; 
     float Y = 0.299f * R + 0.587f * G + 0.114f * B; 
     float Cb = (B - Y) * 0.564f + delta; 
     float Cr = (R - Y) * 0.713f + delta; 

     //store into result image 
     Vec3f yCrCbPixel(Y, Cr, Cb); 
     output.at<Vec3f>(i, j) = yCrCbPixel; 
    } 
} 
+0

Спасибо за помощь. , но когда я пытаюсь заменить данные данных с плавающей запятой [3] [1] = {98,76,88}; с Вход мата = imread (argv [1], 0); он не показывает никакого результата, я добавил std :: cout << "Y Channel =" << Y << std :: endl; , чтобы показать значение Y, но ничего не показывать. – user3805574

+0

@ user3805574 'imread (argv [1], 0)' получает изображение в градациях серого, а не изображение RGB. Я предполагаю, что этот вопрос связан с преобразованием RGB в YCrCb. – Kiran

+0

Да, вопрос заключается в преобразовании RGB в оттенки серого, но когда я пытаюсь заменить вход Mat (1, 1, CV_32FC3, data); с матом img = imread; – user3805574

Смежные вопросы