用yuv转rgb公式 实现yuv420p格式图像转化为rgb格式
时间: 2023-09-20 22:04:10 浏览: 120
对于yuv420p格式的图像转化为rgb格式,可以使用以下公式:
R=Y+1.13983*(V-128)
G=Y-0.39465*(U-128)-0.58060*(V-128)
B=Y+2.03211*(U-128)
其中,Y为亮度值,U和V为色度值。需要注意的是,对于每个像素点,需要将其对应的U和V值放大至与Y值相同的大小,然后再进行转换。
相关问题
yuv422转rgb的公式和yuv420转rgb的公式有什么不同
YUV422 和 YUV420 是两种不同的采样格式,它们的转换公式也不同。下面是它们的转换公式:
YUV422 转 RGB:
R = Y + 1.402 * (Cr - 128)
G = Y - 0.34414 * (Cb - 128) - 0.71414 * (Cr - 128)
B = Y + 1.772 * (Cb - 128)
YUV420 转 RGB:
R = Y + 1.370705 * (Cr - 128)
G = Y - 0.698001 * (Cr - 128) - 0.337633 * (Cb - 128)
B = Y + 1.732446 * (Cb - 128)
可以看到,YUV422 转 RGB 的公式中包含了 Cr 和 Cb 两个色度分量,而 YUV420 转 RGB 的公式只使用了一个 Cr 和一个 Cb。此外,两个公式中的系数也不同,这是因为采样格式不同导致的。
opencv将YVU420SP格式图像转YUV数据格式,然后再将YUV数据转RGB数据格式,最后将RGB数据格式写图片
要将 YVU420SP 格式的图像转换为 YUV 数据格式,然后再将 YUV 数据转换为 RGB 数据格式,并最终将 RGB 数据写入图像文件,您可以使用以下代码:
```cpp
#include <opencv2/opencv.hpp>
int main() {
// 读取 YVU420SP 格式的图像
cv::Mat yvuImage = cv::imread("input.yvu", cv::IMREAD_UNCHANGED);
// 提取 Y 分量
cv::Mat yImage(yvuImage.rows, yvuImage.cols, CV_8UC1);
cv::extractChannel(yvuImage, yImage, 0);
// 提取 U 和 V 分量
cv::Mat uvImage(yvuImage.rows / 2, yvuImage.cols, CV_8UC2);
cv::extractChannel(yvuImage, uvImage, 1);
// 合并 U 和 V 分量,形成 YUV420P 数据
std::vector<cv::Mat> yuvChannels = {yImage, uvImage};
cv::Mat yuvImage;
cv::merge(yuvChannels, yuvImage);
// 将 YUV420P 数据转换为 RGB 数据
cv::Mat rgbImage;
cv::cvtColor(yuvImage, rgbImage, cv::COLOR_YUV2BGR_I420);
// 保存转换后的 RGB 图像
cv::imwrite("output.jpg", rgbImage);
return 0;
}
```
在上述代码中,我们首先使用 `cv::imread` 函数读取一个 YVU420SP 格式的图像(例如,名为 "input.yvu" 的文件)。然后,我们使用 `cv::extractChannel` 函数分别提取 Y、U 和 V 分量。接下来,我们将 U 和 V 分量合并为一个 `cv::Mat` 对象 `yuvImage`,形成 YUV420P 数据。最后,我们使用 `cv::cvtColor` 函数将 YUV420P 数据转换为 RGB 数据,并使用 `cv::imwrite` 函数将转换后的 RGB 图像保存为图像文件(例如,名为 "output.jpg" 的文件)。
请注意,上述代码中的文件路径和名称需要根据实际情况进行修改,并且需要正确安装和链接 OpenCV 库。
阅读全文