Gamma校正及其实现

Gamma校正及其实现图2中左图为原图,中图为gamma = 1/2.2在校正结果,原图中左半侧的灰度值较高,右半侧的灰度值较低,经过gamma = 1/2.2校正后(中图),左侧的对比度降低(见胡须),右侧在对比度提高(明显可以看清面容),同时图像在的整体灰度值提高。右图为gamma = 2.2在校正结果,校正后,左侧的对比度提高(见胡须),右侧在对比度降低(面容更不清楚了),同时图像在的整体灰度值降低。

大家好,又见面了,我是你们的朋友全栈君。

Gamma校正及其实现

2中左图为原图,中图为gamma = 1/2.2在校正结果,原图中左半侧的灰度值较高,右半侧的灰度值较低,经过gamma = 1/2.2校正后(中图),左侧的对比度降低(见胡须),右侧在对比度提高(明显可以看清面容),同时图像在的整体灰度值提高。

右图为gamma = 2.2在校正结果,校正后,左侧的对比度提高(见胡须),右侧在对比度降低(面容更不清楚了),同时图像在的整体灰度值降低。

 

值得一提的是,人眼是按照gamma < 1的曲线对输入图像进行处理的。

 

参考资料:

[1] http://en.wikipedia.org/wiki/Gamma_correction

[2] http://www.cambridgeincolour.com/tutorials/gamma-correction.htm

[3] https://github.com/bytefish/opencv/blob/master/misc/tan_triggs.cpp

代码:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
 
#include <iostream>
 
using namespace cv;
using namespace std;

// Normalizes a given image into a value range between 0 and 255.
Mat norm_0_255(const Mat& src) {
    // Create and return normalized image:
    Mat dst;
    switch(src.channels()) {
    case 1:
        cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
        break;
    case 3:
        cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC3);
        break;
    default:
        src.copyTo(dst);
        break;
    }
    return dst;
}

int main(int argc, const char *argv[]) {
    // Get filename to the source image:
    if (argc != 2) {
        cout << "usage: " << argv[0] << " <image.ext>" << endl;
        exit(1);
    }
    // Load image & get skin proportions:
    //Mat image = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
	Mat image = imread(argv[1], CV_LOAD_IMAGE_COLOR);
    // Convert to floating point:
    Mat X;
	image.convertTo(X, CV_32FC1);
	//image.convertTo(X, CV_32F);
    // Start preprocessing:
    Mat I;
	float gamma = 1/2.2;
    pow(X, gamma, I);


    // Draw it on screen:
    imshow("Original Image", image);
    imshow("Gamma correction image", norm_0_255(I));
	//imwrite("origin.jpg", image);
	imwrite("gamma_inv2.2.jpg", norm_0_255(I));
    // Show the images:
    waitKey(0);
    // Success!
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150138.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 进程调度有可抢占 哪种开销更大_什么时候用多线程什么时候用多进程

    进程调度有可抢占 哪种开销更大_什么时候用多线程什么时候用多进程线程调度为什么比进程调度更少开销?在对比进程调度与线程调度的开销前,我们需要明白两点:进程与线程的差异任务调度的开销进程与线程的差异我们首先要明白,线程和进程有什么关系?从概念上来讲,线程是进程的一部分,只是任务调度相关的部分,所以我们才说,“线程是调度的最小单位”。进程拥有着资源,这些资源不属于某一个特定线程,因为所有线程共享进程拥有的资源,所以我们才说,“进程是资源分配的最小单位…

    2025年11月11日
    2
  • 六十四卦详细解释_六十四卦断事

    六十四卦详细解释_六十四卦断事文章目录第1卦 乾为天(乾卦) 刚健中正 上上卦第2卦 坤为地(坤卦) 柔顺伸展 上上卦第3卦 水雷屯(屯卦) 起始维艰 下下卦第4卦 山水蒙(蒙卦) 启蒙奋发 中下卦第5卦 水天需(需卦) 守正待机 中上卦第6卦 天水讼(讼卦) 慎争戒讼 中下卦第7卦 地水师(师卦) 行险而顺 中上卦第8卦 水地比(比卦) 诚信团结 上上卦第9卦 风天小畜(小畜卦) 蓄养待进 下下卦第10卦 天泽履(履卦) 脚…

    2022年8月18日
    11
  • 【博弈论】常见总结「建议收藏」

    【博弈论】常见总结「建议收藏」每次看到博弈论的题目就很脑阔疼平衡状态,又称作奇异局势。当面对这个局势时则会失败。任意非平衡态经过一次操作可以变为平衡态。先手能够在初始为非平衡的游戏中取胜,后手能够在初始为平衡的游戏中取胜。SG函数待补两个博客12来源12一、巴仕博弈(BashGame)1堆题目HDU1846有一堆物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光…

    2022年10月15日
    3
  • navicat premium 15 激活码【注册码】[通俗易懂]

    navicat premium 15 激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    62
  • static函数局部变量的使用「建议收藏」

    static函数局部变量的使用「建议收藏」#include&lt;stdio.h&gt;#include&lt;stdint.h&gt;#include&lt;string.h&gt;#include&lt;math.h&gt;#include&lt;stdlib.h&gt;voidstaticFun(void){  static uint8_t data=0;  data++;  data…

    2022年7月16日
    15
  • thinkPHP的优缺点

    thinkPHP的优缺点

    2021年9月2日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号