1.色彩空间理解
关于色彩空间理解和色彩空间转换参考了很多博客找到了一个介绍很详细的文章,转载下来
https://blog.csdn.net/asahinokawa/article/details/80596655
2.RGB色彩空间向YUV色彩空间转换公式
具体转换公式参见下面的博客内容
https://blog.csdn.net/xiaoyafang123/article/details/82153279
3.yuv420p在AVFrame中的结构保存
https://blog.csdn.net/lanxiaziyi/article/details/74139729
4.C++应用
#include<iostream>
#include<opencv2/opencv.hpp>
#include<math.h>
using namespace cv;
using namespace std;
//图像色彩转换
int main(int argc, char*argv[]){
Mat src, grayimage;
src = imread("F:/opencv练习/C++Test/1-data image process/2-图像卷积/test.jpg");
if (!src.data)
{
cout << "It could not load image " << endl;
return -1;
}
namedWindow("original image", WINDOW_AUTOSIZE);
imshow("original image", src);
//图像色彩转换
cvtColor(src, grayimage,COLOR_BGR2GRAY);//将rgb图像转换成灰度图像
namedWindow("converted image", WINDOW_AUTOSIZE);
imshow("converted image", grayimage);
Mat dst;
cvtColor(src, dst, COLOR_BGR2YUV);//将rgb图像转换成YUV图像
namedWindow("yuv image", WINDOW_AUTOSIZE);
imshow("yuv image", dst);
cout << "原图像通道数=" << "" << src.channels() << endl;
cout << "灰度图像通道数=" << "" << grayimage.channels() << endl;
cout << "YUV图像通道数=" << "" << dst.channels() << endl;
//单通道图像反插操作;
int cols = grayimage.cols;
int rows = grayimage.rows;
/*for (int i = 0; i < rows;i++)
{
for (int j = 0; j < cols;j++)
{
int convertimage = grayimage.at<uchar>(i, j);
grayimage.at<uchar>(i, j) = convertimage - 255;//反插过程
}
}
namedWindow("invert image", WINDOW_AUTOSIZE);
imshow("invert image", grayimage);*/
//多通道图像反插操作
Mat image1;
image1=src.clone();//创建一个与原图像大小、类型相同的图像,即将原图像复制,
int width = src.rows;
int height = src.cols;
int nc = src.channels();
for (int i = 0; i < width;i++)
{
for (int j = 0; j < height;j++)
{
if (nc==1)
{
int convertimage = grayimage.at<uchar>(i, j);
grayimage.at<uchar>(i, j) = convertimage - 255;//反插过程
}else if (nc==3)
{
int b = src.at<Vec3b>(i, j)[0];
int g = src.at<Vec3b>(i, j)[1];
int r = src.at<Vec3b>(i, j)[2];
image1.at<Vec3b>(i, j)[0]=255-b;
image1.at<Vec3b>(i, j)[1]=255-g;
image1.at<Vec3b>(i, j)[2]=255-r;
}
}
}
namedWindow("invert image", WINDOW_AUTOSIZE);
imshow("invert image", image1);
//自建一个Mat类图像矩阵,自己填充颜色
Mat image2 = Mat::zeros(src.size(), src.type());
image2 = Scalar(123, 225, 0);
namedWindow("create image2", WINDOW_AUTOSIZE);
imshow("create image2", image2);
waitKey(0);
system("pause");
return 0;
}