进行图像处理时,有的物体表面会反光,为了减少光对图像处理的影响,一般会进行白平衡和颜色空间的转换,下面是先进性白平衡,然后将图像由RGB空间转换成HSV、YCrCb空间的小程序。
#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void WhiteBlance(Mat& src)
{
vector<Mat> imageRGB;
split(src, imageRGB);
//求原始图像的RGB分量的均值
double R, G, B;
B = mean(imageRGB[0])[0];
G = mean(imageRGB[1])[0];
R = mean(imageRGB[2])[0];
//需要调整的RGB分量的增益
double KR, KG, KB;
KB = (R + G + B) / (3 * B);
KG = (R + G + B) / (3 * G);
KR = (R + G + B) / (3 * R);
//调整RGB三个通道各自的值
imageRGB[0] = imageRGB[0] * KB;
imageRGB[1] = imageRGB[1] * KG;
imageRGB[2] = imageRGB[2] * KR;
//RGB三通道图像合并
merge(imageRGB, src);
}
int main()
{
Mat pic = imread("测试.jpg");
Mat picWhiteBalance;
Mat picHsv;
Mat picYCrCb;
picWhiteBalance = pic.clone();
//白平衡
WhiteBlance(picWhiteBalance);
//HSV颜色空间转换
cvtColor(picWhiteBalance, picHsv, CV_BGR2HSV);
//YCrCb颜色空间转换
cvtColor(picWhiteBalance, picYCrCb, COLOR_BGR2YCrCb);
imshow("原始图像", pic);
imshow("白平衡", picWhiteBalance);
imshow("HSV", picHsv);
imshow("YCrCb", picYCrCb);
waitKey(0);
return 0;
}
效果图: