伽马校正-

伽马校正


问题描述:读取图像,然后对图像进行伽玛校正。

伽马校正

这里是一篇写伽马校正比较好的文章,我觉得可以作为背景知识补充。
伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正。如果图像原样显示在显示器等上,画面就会显得很暗。伽马校正通过预先增大 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)
在这里插入图片描述在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值