亮度和对比度调节公式,其中alpha负责对比度,beta负责亮度。
O(x,y) = alpha * I(x,y) + beta
如果想要自动调节亮度和对比度,意味着自动调节 alpha 和 beta
假如想要将最小值变到0,最大值变为255,则计算公式如下。
input range = max(I) - min(I)
wanted output range = 255;
alpha = output range / input range = 255 / ( max(I) - min(I) )
min(O) = alpha * min(I) + beta
beta = -min(I) * alpha
直方图剪枝平移
- 平移 -> 亮度
- 剪枝 -> 重定义直方图的范围
下面的图以供理解
代码实现
这里我增加了两个参数,用以调节亮度最低值和直方图的范围
// clipHistPercent 剪枝(剪去总像素的多少百分比)
// histSize 最后将所有的灰度值归到多大的范围
// lowhist 最小的灰度值
void BrightnessAndContrastAuto(const cv::Mat &src, cv::Mat &dst, float clipHistPercent=0, int histSize = 255, int lowhist = 0)
{
CV_Assert(clipHistPercent >= 0);
CV_Assert((src.type() == CV_8UC1) || (src.type() == CV_8UC3) || (src.type