C++版Opencv3.0 图像色彩变换和图像反插变换

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;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值