彩色色彩校正

通过插值得到RGB三基色齐全的图像后,但传感器响应的这个图像与真实场景之间扔存在差异。这其中存在多方面的原因

,涉及图像传感器中光学器件的光谱性、场景的光源光照条件(如白光、荧光或者钨光)以及色彩滤镜的光谱特性。为了

补偿这种差异,必须对图像进行色彩校正。现描述一下色彩校正的原理。

        色彩校正主要是针对彩色图像在成像过程中的不足而对彩色饱和度和彩色色调进行校正。

一、彩色饱和度校正

彩色饱和度校正(color saturation correction)使得彩色图像的RGB彩色饱和度调整同彩色电视机的彩色控制有相似的

作用。彩色饱和度校正是基于现代彩色电视机的R-Y,G-Y,和B-Y彩色模型。其同R,G和B形式的关系如下:

R-Y=0.70R-0.59G-0.11B
G-Y=-0.30R+0.41G-0.11B
B-Y=-0.30R-0.59G+0.89B

其中:亮度分量Y的定义如下

Y=0.31R+0.59G+0.11B

设饱和度校正系数为Sa(一般指饱和度百分比),则校正后R,G和B各分量为:
R’=(R-Y)Sa+Y
G’=(G-Y)Sa+Y
B’=(B-Y)Sa+Y
其中:R’,G’和B’分别为校正后的彩色分量。

二、彩色色调校正

色调校正同饱和度校正一样是基于现代彩色电视机的R-Y,G-Y,B-Y彩色模型。
设色调校正系数为α(旋转角度α),则校正后R,G和B分量分别为:

R’=(B-Y)SINα+(R-Y)COSα+Y
B’=(B-Y)COSα-(R-Y)SINα+Y
R’=-0.19(B-Y)-0.51(R-Y)+Y

其中: R’,G’和B’分别为校正后的彩色分量。

三、在opencv中实现如下

//对图像进行色彩饱和度校正和色调校正
IplImage* jiaozheng(IplImage* image,IplImage* dst)
{
float ry,by,gy,y,sa=0.99;
int theta=10;
double a=theta*3.1415926/180.0;
IplImage* img_r=cvCreateImage(cvGetSize(image),8,1);
IplImage* img_g=cvCreateImage(cvGetSize(image),8,1);
IplImage* img_b=cvCreateImage(cvGetSize(image),8,1);
cvSplit(image,img_b,img_g,img_r,0);//把RGB图像分成三幅单通道图像
for(int i=0;i<image->width;i++)
{
for(int j=0;j<image->height;j++)
{
ry=0.7*cvGetReal2D(img_r,i,j)-0.59*cvGetReal2D(img_g,i,j)-0.11*cvGetReal2D(img_b,i,j);
gy=(-0.3)*cvGetReal2D(img_r,i,j)+0.41*cvGetReal2D(img_g,i,j)-0.11*cvGetReal2D(img_b,i,j);
by=(-0.3)*cvGetReal2D(img_r,i,j)-0.59*cvGetReal2D(img_g,i,j)+0.89*cvGetReal2D(img_b,i,j);
y=0.31*cvGetReal2D(img_r,i,j)+0.59*cvGetReal2D(img_g,i,j)+0.11*cvGetReal2D(img_b,i,j);
//饱和度校正
ry=ry*sa/100;
gy=gy*sa/100;
by=by*sa/100;

ry+=y;

gy+=y;

by+=y;

//色调校正
ry=by*sin(a)+ry*cos(a)+y;
by=by*cos(a)-ry*sin(a)+y;
gy=-0.19*by-0.51*ry+y;

if(ry<0) ry=0;
if(ry>255) ry=255;

cvSetReal2D(img_r,i,j,ry);


if(gy<0) gy=0;
if(gy>255) gy=255;
cvSetReal2D(img_g,i,j,gy);

if(by<0) by=0;
if(by>255) by=255;
cvSetReal2D(img_b,i,j,by);

}
}
   cvMerge(img_b,img_g,img_r,0,dst);
   return dst;

}
四、结果图

(1)原图


(2)在a=10,sa=0.99,校正后图像为



猜你喜欢

转载自blog.csdn.net/chenyu19880302/article/details/16803235