算法目的:
将灰度图的亮度设置为原始图片的bright倍, 对比度设为原始图片的contrast倍
算法原理:
1. 首先计算原始图片的像素平均值m
2. 将每个像素点的像素值p减去m得到d (d=p-m)
3. 将d的值放大contrast倍以增加对比度,D=d*contrast
4. 将m的值放大bright倍以增加亮度, M=m*bright
5. 输出像素值为 D+M = d*contrast + m*bright = (p - m) * contrast + m * bright = p*contrast+m*(bright - contrast)
C++实现代码:
void set_brightness_contrast(float bright, float contrast)
{
float diff = bright - contrast;
auto buf_now = (uint8_t*)nowImg.data; auto buf2 = (uint8_t*)resizedImg.data; float nowf;
for (int i = 0; i < pixel_count_now; i++)
{
nowf = *buf2 * contrast + pixel_average*diff; *buf_now = saturate_cast<uint8_t>(nowf); buf_now++; buf2++;
}
bright_now = bright; contrast_now = contrast;
}
如果想要自动调整图片的亮度和对比度到最佳值,可以先设定一个理想的像素平均值,比如200,然后将亮度调整到这个值,
调整亮度以后会导致整体对比度下降,因此要对对比度进行相应的补偿,实现代码如下:
// 将当前图片的亮度和对比度调到最佳
void set_brightness_and_contrast_to_best()
{
float bright = 1.0f * BestAverage / pixel_average; float contrast = (bright > 1.0f ? bright : 1.0f / bright);
set_brightness_contrast(bright, contrast);
}
参考资料:
图像处理------调整亮度与对比度-阿里云开发者社区 (aliyun.com)
https://developer.aliyun.com/article/47970