1.理论依据
g(i,j) = alpha * f(i,j) + beta
其中i,j表示像素的第i行,第j列。 g(i,j)就是输出图象的像素,alpha是对比度控制系数,beta是亮度控制系数。
当然要改变像素的一些值就需要访问像素值,opencv提供了像素访问的一些方法,对于3通道的图像像素访问
m_srcMat.at(i,j)[0] //B
m_srcMat.at(i,j)[1] //G
m_srcMat.at(i,j)[2] //R
2.核心代码
int m_nContrastValue = 100; //对比度值
int m_nBrightValue = 0; //亮度值
Mat m_srcMat,m_dstMat; //原图像、输出图像
void BrightContrast::changeBrightContrast()
{
double alpha = m_nContrastValue*0.01;
int beta = m_nBrightValue;
int ch = m_srcMat.channels();
qDebug("alpha= %lf,beta= %d",alpha,beta);
#if 0
//m_dstMat(i,j) = alpha*m_srcMat(i,j) + beta
for(int row=0;row<m_srcMat.rows;row++)
{
for(int col=0;col<m_srcMat.cols;col++)
{
if(ch == 3)
{
for(int c=0;c<3;c++)
{
m_dstMat.at<Vec3b>(row,col)[c] = saturate_cast<uchar>(alpha*(m_srcMat.at<Vec3b>(row,col)[c]) + beta);
}
}
}
}
#else
m_srcMat.convertTo(m_dstMat, -1, alpha, beta);
#endif
bgrMat2Image(m_dstMat);
}
这里展示了2种方法:
方法1:用for循环逐个像素进行操作。
方法2:使用函数 void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;
m:表示输出的结果
rtype:-1表示和原图像一样
alpha:尺度变换因子
beta:尺度变换系数偏移量
3.效果展示
我把demo链接贴出来,需要看看的可以参考:
https://download.csdn.net/download/haohaohaihuai/12442739
作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正