Qt+opencv图片亮度调节和对比度调节

Qt+opencv图片亮度调节和对比度调节

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
转载请注明出处,如有不当欢迎指正

猜你喜欢

转载自blog.csdn.net/haohaohaihuai/article/details/106254431