Полный диапазон YCBCR для RGB и обратно в OpenCV не обратимоC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Полный диапазон YCBCR для RGB и обратно в OpenCV не обратимо

Сообщение Anonymous »

Я пытаюсь преобразовать простой вариант YCBCR в RGB и обратно. Формула, которую я использую на этой странице (от RGB для полного диапазона YCBCR и наоборот). < /P>

inline cv::Mat rgb_to_ycrcb(cv::Mat input) {
cv::Mat output(input.size(), input.type(), cv::Scalar(0, 0, 0));
float rgb_to_ycrcb_data[] = {
0.2990, 0.5870, 0.114,
-0.169, -0.331, 0.500,
0.5000, -0.419, -0.081
};
cv::Mat rgb_to_ycrcb = cv::Mat(3, 3, CV_32FC1, rgb_to_ycrcb_data);

for (int r = 0; r < input.rows; r++) {
for (int c = 0; c < input.cols; c++) {
cv::Vec3f rgb_value;
cv::Mat input_rgb = cv::Mat(input.ptr(r)[c], false);
input_rgb.convertTo(rgb_value, CV_32F);
cv::Vec3f offset(0., 128., 128.);

cv::Mat converted = cv::Mat(offset, false) +
rgb_to_ycrcb * cv::Mat(rgb_value, false);
cv::Vec3b final_vec;
converted.convertTo(final_vec,
CV_8U);
output.ptr(r)[c] = converted;
}
}
return output;
}

inline cv::Mat ycrcb_to_rgb(cv::Mat input) {
cv::Mat output(input.size(), input.type(), cv::Scalar(0, 0, 0));
float ycrcb_to_rgb_data[] = {
1.000, 0.0000, 1.4000,
1.000, -0.343, -0.711,
1.000, 1.7650, 0.000
};
cv::Mat ycrcb_to_rgb = cv::Mat(3, 3, CV_32FC1, ycrcb_to_rgb_data);
for (int r = 0; r < input.rows; r++) {
for (int c = 0; c < input.cols; c++) {
cv::Vec3f ycrcb_value;
cv::Mat(input.ptr(r)[c], false).
convertTo(ycrcb_value, CV_32F);
ycrcb_value[1] -= 128;
ycrcb_value[2] -= 128;
cv::Mat converted = ycrcb_to_rgb * cv::Mat(ycrcb_value, false);
cv::Vec3b final_vec;
converted.convertTo(final_vec,
CV_8U);
output.ptr(r)[c] = converted;
}
}
return output;
}
< /code>

Когда я преобразую изображение в цветовом формате YCRCB, состоящем из кортежа (28, 113, 14) в RGB, я получаю (0, 114, 2). Преобразование этого значения RGB обратно в выходы YCRCB (67, 91, 80). < /P>

Формула для полного диапазона YCRCB указывает, что домен всех компонентов YCRCB [0, 255], и соответствующий кодом компонентов RGB равен [0, 255] тоже. Я неправильно реализовал эту формулу? Если нет, то почему это не обратимо? И если это не обратимо, есть ли еще другая формула, похожая на YUV?

Подробнее здесь: https://stackoverflow.com/questions/385 ... reversible
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»