转换公式
按照如下转换公式利用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通道