【问题标题】:How to realize Digital fill light in Opencv如何在Opencv中实现数字补光
【发布时间】:2025-11-28 05:20:02
【问题描述】:

我想用OpenCV实现补光的功能,但是有一些问题。图片黑色部分太暗,照片模糊,不知道怎么优化代码。那我的代码:

V,数值,0~100,增加亮度的幅度。

S,Scope, 0~255, dark 都小于 S。

增加曝光暗部照片的增量,不变,这样可以看到更多的暗部细节。

m_imgOriginal:原图,类型:Mat

m_imgNew:新图像,从 m_imgOriginal 克隆,类型:Mat

int OpenCVClass::AddExposure(int v, int s)

{

int new_r = v*m_mean_val.val[0] / 150;
int new_g = v*m_mean_val.val[1] / 150;
int new_b = v*m_mean_val.val[2] / 150;

for (int y = 0; y < m_imgOriginal.rows; y++)
{
    auto ptr = m_imgOriginal.ptr<uchar>(y);
    auto qtr = m_imgNew.ptr<uchar>(y);
    for (int x = 0; x < m_imgOriginal.cols; x++)
    {

        int mean = (ptr[0] + ptr[1] + ptr[2]) / 3;

        if (mean <= s)
        {



                int r = ptr[0] + new_r;
                qtr[0] = r>255 ? 255 : r;
                int g = ptr[1] + new_g;
                qtr[1] = g>255 ? 255 : g;
                int b = ptr[2] + new_b;
                qtr[2] = b>255 ? 255 : b;
                int newMean = (qtr[0] + qtr[1] + qtr[2]) / 3;
                if (newMean > s)
                {
                    int nr = ptr[0] + (s - mean) ;
                    int ng = ptr[1] + (s - mean) ;
                    int nb = ptr[2] + (s - mean) ;

                    qtr[0] = nr>255 ? 255 : nr;
                    qtr[1] = ng>255 ? 255 : ng;
                    qtr[2] = nb>255 ? 255 : nb;

                }



        }

        else
        {


            qtr[0] = ptr[0];
            qtr[1] = ptr[1];
            qtr[2] = ptr[2];




        }
        ptr += 3;
        qtr += 3;
    }
    RenderBuffer(m_imgNew, m_displayBuffer);
}
return 0;
}

优化前

优化后

【问题讨论】:

    标签: c++ opencv graphics


    【解决方案1】:

    首先,我建议在再次测试“s”时计算每个像素的亮度值。我的意思是用不同的方式计算“mean”(有关如何计算亮度,请参阅此链接): http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/

    其次,您正在处理每通道 8 位的图像,当您使它们“更亮”时,不要期望接近或完美的暗像素有任何额外的细节,它们只会变得灰色或更白。

    第三,在“增加”亮度时,我建议使用像素颜色值的HSL表示并增加亮度。在伪代码中:

    1) Convert pixel color from RGB to HSL.
    2) Increase luminance (or 'lightness').
    3) Convert back pixel color to RGB.
    

    【讨论】: