必威体育Betway必威体育官网
当前位置:首页 > IT技术

Gamma校正

时间:2019-07-26 00:10:00来源:IT技术作者:seo实验室小编阅读:88次「手机版」
 

Gamma校正

Gamma校正

gamma校正(幂律变换)是一种重要的非线性变换,其是对输入图像灰度值进行指数变换,进而校正亮度偏差,通常应用于扩展暗调的细节。一般情况下,当Gamma校正的值大于1时,图像的高光部分被压缩而暗调部分被扩展;当Gamma校正的值小于1时,图像的高光部分被扩展而暗调部分被压缩,在最简单的情况下,gamma校正通过以下的幂律表达式来定义:

这里写图片描述

函数图像如下:

这里写图片描述

其中c是常数,输入及输出均为非负值,当r=1时,输入与输出的取值范围为0到1,直线变换;当r<1时,低灰度值区域的动态范围扩大,进而图像对比度增强,高灰度值区域动态范围缩小,图像对比度降低,图像整体灰度值变大;当r>1时,低灰度值区域的动态范围缩小,进而图像对比度降低,高灰度值区域动态范围扩大,图像对比度增加,图像整体灰度值变小。Gamma校正主要运用在图像增强,目标检测及图像分析等领域。

示例代码如下:

#include <OpenCV2/imgproc/imgproc.hpp>  
#include <opencv2/core/core.hpp>        
#include <opencv2/highgui/highgui.hpp> 
#include <iOStream> 
using namespace std;
using namespace cv;
// Gamma变换函数实现
cv::Mat gammaTransform(cv::Mat& srcImage, float kFactor)
{
    // 建立查表文件LUT
    unsigned char LUT[256];
    for( int i = 0; i < 256; i++ )
    {
        // Gamma变换表达式
        LUT[i] = saturate_cast<uchar>(pow( ( float)( 
               i / 255.0 ), kFactor ) * 255.0f );
    }
    cv::Mat resultImage = srcImage.clone();
    // 输入通道为单通道时 直接进行变换
    if(srcImage.channels() == 1)
    {
        cv::MatIterator_<uchar> iterator = 
                 resultImage.begin<uchar>();
        cv::MatIterator_<uchar> iteratorEnd = 
                 resultImage.end<uchar>();
        for( ; iterator != iteratorEnd; iterator ++ )
            *iterator = LUT[(*iterator)];
    }else
    {
        // 输入通道为三通道时 需对每个通道分别进行变换
        cv::MatIterator_<cv::Vec3b> iterator = 
               resultImage.begin<Vec3b>();
        cv::MatIterator_<cv::Vec3b> iteratorEnd = 
               resultImage.end<Vec3b>();
       //  通过查找表进行转换
        for( ; iterator != iteratorEnd; iterator++ )
        {
            (*iterator)[0] = LUT[((*iterator)[0])];
            (*iterator)[1] = LUT[((*iterator)[1])];
            (*iterator)[2] = LUT[((*iterator)[2])];
        }
    }
    return resultImage;
}
int main()
{
     cv::Mat srcImage =  imread("..\\images\\lakeWater.jpg");
     if( !srcImage.data ) 
          return -1;
     // 初始化两种不同参数 对比分析效果
     float kFactor1 =  0.3;
     float kFactor2 =  3.0;
     cv::Mat result1 = gammaTransform(srcImage, kFactor1);
     cv::Mat result2 = gammaTransform(srcImage, kFactor2);
     cv::imshow("srcImage", srcImage);
     cv::imshow("result1", result1);
     cv::imshow("result2", result2);
     cv::waitKey(0);
     return 0;
}

结果如下:

原图:

这里写图片描述

r=0.3:

这里写图片描述

r=3.0:

这里写图片描述

相关阅读

批量大气校正高分2号(GF2)卫星数据

高分数据批量处理可以有下述5种选项。 MSS数据的批量正射校正 MSS数据批量正射校正和大气校正 PAN 数据的批量正射校正 MSS与P

Gamma Correction

Gamma 公式:Vout = Vin ^ gammaGamma 的产生原因:1. 人眼对初始亮度的敏感性和相机对亮度线性检测的冲突          如上图,对

联想笔记本怎么使用电池修复校正延长电池寿命?

笔记本电池是损耗品,但是通过校正修复软件能使用电池的寿命延长,我的联想笔记本电脑使用了两年多电池还能使用两个小时。我每个两个

分享到:

栏目导航

推荐阅读

热门阅读