将RGB图像转为YCbCr,并显各通道图片
发布时间
阅读量:
阅读量
该文本介绍了利用OpenCV将BGR颜色空间转换为YCbCr颜色空间的过程,并提供了完整的代码实现及结果展示。具体来说:
目标:通过自定义函数BGR2YCbCr将输入的BGR图像转换为YCbCr格式
方法:
- 计算每个像素的Y(亮度)、Cb(蓝色差)和Cr(红色差)值
- 使用权重系数进行线性变换
- 复制原图像并进行处理后保存为ycbcr矩阵
运行环境:基于Windows 10的操作系统,使用OpenCV版本号2.4.9和Visual Studio 2015开发环境
结果展示:- 原图及其转换后的YCbCr图像
- 分割后的Y、Cb、Cr三个通道的独立显示
该过程完整地展示了颜色空间变换的基本实现方法及其在图像处理中的应用。
转换公式
按照如下转换公式利用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通道

全部评论 (0)
还没有任何评论哟~
