Я пытаюсь конвертировать BGR в YUV с cvCvtColor
метод И затем получить ссылку на каждый компонент.
Исходное изображение (IplImage1
) имеет следующие параметры:
Конвертировать и получить компоненты после преобразования:
IplImage* yuvImage = cvCreateImage(cvSize(1620, 1220), 8, 3);
cvCvtColor(IplImage1, yuvImage, CV_BGR2YCrCb);
yPtr = yuvImage->imageData;
uPtr = yPtr + height*width;
vPtr = uPtr + height*width/4;
У меня есть метод, который преобразует YUV обратно в RGB и сохраняет в файл. Когда я создаю компоненты YUV вручную (я создаю синее изображение), это работает, и когда я открываю изображение, оно действительно синее. Но когда я создаю компоненты YUV, используя метод выше, я получаю черное изображение. Я думаю, что, возможно, я неправильно получаю ссылку на компоненты YUV
yPtr = yuvImage->imageData;
uPtr = yPtr + height*width;
vPtr = uPtr + height*width/4;
В чем может быть проблема?
Если вы действительно должны использовать IplImage (например, в устаревшем коде или C), тогда используйте cvSplit
IplImage* IplImage1 = something;
IplImage* ycrcbImage = cvCreateImage(cvSize(1620, 1220), 8, 3);
cvCvtColor(IplImage1, ycrcbImage, CV_BGR2YCrCb);
IplImage* yImage = cvCreateImage(cvSize(1620, 1220), 8, 1);
IplImage* crImage = cvCreateImage(cvSize(1620, 1220), 8, 1);
IplImage* cbImage = cvCreateImage(cvSize(1620, 1220), 8, 1);
cvSplit(ycrcbImage, yImage, crImage , cbImage, 0);
Современный подход состоит в том, чтобы избежать устаревшего API и использовать Mats:
cv::Mat matImage1(IplImage1);
cv::Mat ycrcb_image;
cv::cvtColor(matImage1, ycrcb_image, CV_BGR2YCrCb);
// Extract the Y, Cr and Cb channels into separate Mats
std::vector<cv::Mat> planes(3);
cv::split(ycrcb_image, planes);
// Now you have the Y image in planes[0],
// the Cr image in planes[1],
// and the Cb image in planes[2]
cv::Mat Y = planes[0]; // if you want
В то время как RGB представляет цвет как красный, зеленый и синий; цветовая модель YCbCr представляет цвет как яркость и два цветоразностных сигнала. В YCbCr Y — яркость (яркость), Cb — синий минус яркость (B-Y), а Cr — красный минус яркость (R-Y).
Вот код для того же самого в случае, если вы используете OpenCV 3.0.0:
import numpy as np
import cv2
#Obtaining and displaying the image
x = 'C:/Users/524316/Desktop/car.jpg'
img = cv2.imread(x, 1)
cv2.imshow("img",img)
#converting to YCrCb color space
YCrCb = cv2.cvtColor(a, cv2.COLOR_BGR2YCrCb)
cv2.imshow("YCrCb",YCrCb)
#splitting the channels individually
Y, Cr, Cb = cv2.split(YCrCb)
cv2.imshow('Y_channel', Y)
cv2.imshow('Cr_channel', Cr)
cv2.imshow('Cb_channel', Cb)
cv2.waitKey(0)
cv2.destroyAllWindows()
Исходное изображение:
YCrCb изображение:
Y — канал:
Это так же, как изображение в градациях серого
Cr — канал:
Cb — канал: