伽马校正
问题描述:读取图像,然后对图像进行伽玛校正。
伽马校正
这里是一篇写伽马校正比较好的文章,我觉得可以作为背景知识补充。
伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正。如果图像原样显示在显示器等上,画面就会显得很暗。伽马校正通过预先增大 RGB 的值来排除显示器的影响,达到对图像修正的目的。
由于下式引起非线性变换,在该式中,
x
x
x被归一化,限定在
[
0
,
1
]
[0,1]
[0,1]范围内。
c
c
c是常数,
g
g
g为伽马变量(通常取
2.2
2.2
2.2):
x
′
=
c
I
i
n
g
x' = c\ {I_{in}}^ g
x′=c Iing
因此,使用下面的式子进行伽马校正:
I
o
u
t
=
1
c
I
i
n
1
g
I_{out} ={\frac{1}{c}\ I_{in}} ^ {\frac{1}{g}}
Iout=c1 Iing1
显示屏上的图像显示 | γ \gamma γ修正值 |
---|---|
![]() | ![]() |
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <math.h>
cv::Mat gamma_correction(cv::Mat img, double c, double g)
{
int row = img.rows;
int col = img.cols;
int channel = img.channels();
cv::Mat new_image = cv::Mat::zeros(row, col, CV_8UC3);
double val;
// gamma_correction
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
for (int chan = 0; chan < channel; chan++)
{
val = (double)img.at<cv::Vec3b>(i, j)[chan] / 255;
new_image.at<cv::Vec3b>(i, j)[chan] = (uchar)(pow(val / c, 1 / g) * 255);
}
}
}
return new_image;
}
int main(){
// read image
cv::Mat img = cv::imread("../imori_gamma.jpeg", cv::IMREAD_COLOR);
// histogram_normalization
cv::Mat new_image = gamma_correction(img, 1, 2.2);
cv::imwrite("../1-10/imori_gamma_correction.jpeg", new_image);
cv::imshow("vv", new_image);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
输入图像 (imori_dark.jpeg) | 输出图像 (histogram_transform.jpeg) |
---|---|
![]() | ![]() |