opencv 图像亮度增强, 伽马变换

2020年02月06日 270点热度 1人点赞 0条评论

本来准备自己写的,但是OpenCV 的文档就很详细,并且提供了python 和C++的实现,优雅高效。珠玉在前,觉得没有重复造轮子的必要,把链接粘贴在下面:
https://docs.opencv.org/3.4/d3/dc1/tutorial_basic_linear_transform.html
这个文档详细结合代码和图像详细介绍了校正图像亮度的方法,包括亮度对比度调整和伽马变换。

亮度对比度调整

g(x) = \alpha f(x) + \beta

f(x) 是输入图像的像素值,对于多通道的图是各个通道的像素值;

  • $\alpha$ 称为增益,控制了图像的对比度;$\alpha > 1$ 将会提高对比度, $\alpha < 1$时将会收窄对比度。
  • $\beta$ 称为偏置。

不足:在 g(x) >255 时, 像素值需要截断为255 ,这样会丢失亮部的细节。

对于提高图像亮度,有个不丢失信息的变换, Gamma 变换。

伽马变换

g(x) = {(\frac{f(x)}{255})}^\gamma* 255

即对各个像素做非线性变换, 变换的范围仍然在0~255之间,不会丢失信息;
此外,可以用“查找表”的办法高效地进行 gamma 变换。

C++ 代码


cv::Mat lookUpTable(1, 256, CV_8U); uchar* p = lookUpTable.ptr(); for( int i = 0; i < 256; ++i) p[i] = saturate_cast<uchar>(pow(i / 255.0, gamma_) * 255.0); cv::Mat res = img.clone(); cv::LUT(img, lookUpTable, res);

Python实现


def gamma_transform(img_original, gamma): lookUpTable = np.empty((1,256), np.uint8) for i in range(256): lookUpTable[0,i] = np.clip(pow(i / 255.0, gamma) * 255.0, 0, 255) res = cv.LUT(img_original, lookUpTable) return res

具体细节,参考OpenCV教程 https://docs.opencv.org/3.4/d3/dc1/tutorial_basic_linear_transform.html

Charles

Stay hungry, stay foolish.

文章评论