将RGB图像转为YCbCr,并显各通道图片

转换公式

按照如下转换公式利用opencv编写代码。
运行环境win10+opencv2.4.9+VS2015
在这里插入图片描述

#include "stdafx.h"
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<math.h>
#include<complex>
using namespace std;
using namespace cv;

Mat BGR2YCbCr(Mat img, Mat out)
{
	int width = img.rows;
	int height = img.cols;

	//cv::Mat out = cv::Mat::zeros(height, width, CV_32F);

	for (int j = 0; j < width    ; j++) {
		for (int i = 0; i < height; i++) {
			// Y
			out.at<cv::Vec3b>(j, i)[0] = (int)((float)img.at<cv::Vec3b>(j, i)[0] * 0.114 + 
				(float)img.at<cv::Vec3b>(j, i)[1] * 0.5870 + 
				(float)img.at<cv::Vec3b>(j, i)[2] * 0.299);

			// Cb
			out.at<cv::Vec3b>(j, i)[1] = (int)((float)img.at<cv::Vec3b>(j, i)[0] * 0.5 + 
				(float)img.at<cv::Vec3b>(j, i)[1] * (-0.3323) + 
				(float)img.at<cv::Vec3b>(j, i)[2] * (-0.1687) + 128);

			// Cr
			out.at<cv::Vec3b>(j, i)[2] = (int)((float)img.at<cv::Vec3b>(j, i)[0] * (-0.0813) + 
				(float)img.at<cv::Vec3b>(j, i)[1] * (-0.4187) + 
				(float)img.at<cv::Vec3b>(j, i)[2] * 0.5 + 128);
		}
	}
	return out;
}

int main()
{
	Mat img = imread("2.jpg", cv::IMREAD_COLOR);
	imshow("齐宝宝", img);
	waitKey(0);
	int width = img.rows;
	int height = img.cols;
	/*Mat ycbcr = Mat::zeros(width,height,  CV_32FC3);*/
	/*cv::Mat out = cv::Mat::zeros(height, width, CV_8UC3);*/
	
	Mat ycbcr = img.clone();
	ycbcr = BGR2YCbCr(img, ycbcr);
	/*ycbcr = process(ycbcr);*/
	imshow("转换后", ycbcr);
	waitKey(0);
	Mat Y,Cb,Cr;
	vector<Mat> Ychannel, Cbchannel, Crchannel, channels;
	
	split(ycbcr, channels);
	Mat Yimage = channels.at(0);
	Mat Cbimage= channels.at(1);
	Mat Crimage = channels.at(2);
	imshow("Yimg", Yimage);
	imshow("Cbimage", Cbimage);
	imshow("Crimage", Crimage);
	waitKey(0);

结果

原图
在这里插入图片描述
转换后
在这里插入图片描述
Y通道
在这里插入图片描述
Cb通道
在这里插入图片描述
Cr通道
在这里插入图片描述

原创文章 92 获赞 58 访问量 3848

猜你喜欢

转载自blog.csdn.net/weixin_42076938/article/details/106070813
今日推荐