【发布时间】:2019-06-23 15:05:19
【问题描述】:
我正在尝试手动将图像从 RBG(OpenCV 中的 BGR)转换为 YCbCr 颜色空间。
我的图像是png 彩色图像,宽度为 800,高度为 600,3 通道,16 位深度。
这是我尝试解决此问题的方法。
cv::Mat convertToYCbCr(cv::Mat image) {
// converts an RGB image to YCbCr
// cv::Mat: B-G-R
std::cout << "Converting image to YCbCr color space." << std::endl;
int i, j;
for (i = 0; i <= image.cols; i++) {
for (j = 0; j <= image.rows; j++) {
// R, G, B values
auto R = image.at<cv::Vec3d>(j, i)[2];
auto G = image.at<cv::Vec3d>(j, i)[1];
auto B = image.at<cv::Vec3d>(j, i)[0];
// Y'
auto Y = image.at<cv::Vec3d>(j,i)[0] = 0.299 * R + 0.587 * G + 0.114 * B + 16;
// Cb
auto Cb = image.at<cv::Vec3d>(j,i)[1] = 128 + (-0.169 * R -0.331 * G + 0.5 * B);
// Cr
auto Cr = image.at<cv::Vec3d>(j,i)[2] = 128 + (0.5 * R -0.419 * G -0.081 * B);
std::cout << "At conversion: Y = " << Y << ", Cb = " << Cb << ", "
<< Cr << std::endl;
}
}
std::cout << "Converting finished." << std::endl;
return image;
}
我收到的图像如下所示:
我期待的是这个(使用 OpenCV 方法):
垂直线暗示着什么?我的循环错了吗?我什至可以用 YCbCr 值“替换”RGB 值并期望图像看起来像示例吗? typeid() 为两个图像返回相同的值,N2cv3MatE。
【问题讨论】:
-
Vec3d 是 3x64 位。你有什么理由使用这种类型吗?您是否尝试过 Vec3b?
-
这确实解决了问题,谢谢!是的,出于某种原因,我只是假设它是双重类型。您可以将此作为答案发布,我会接受。
-
@mneumann,如果您说图像具有 16 位深度,使用
Vec3b是如何解决您的问题的?Vec3b用于 8 位图像。