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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 将HTML5 Canvas的内容保存为图片建议收藏

    主要思想是借助Canvas自己的API-toDataURL()来实现,整个实现HTML+JavaScript的代码很简单。代码如下:12344849505152SaveI

    2021年12月21日
    44
  • quotename()函数 

    quotename()函数 请教quotename函数的理解,我已经看了很多帮助,储如以下示例 QUOTENAME(Transact-SQL)返回带有分隔符的Unicode字符串,分隔符的加入可使输入的字符串成为有效的MicrosoftSQLServer2005分隔标识符。Transact-SQL语法约定语法QUOTENAME(‘character_string'[,’q…

    2022年7月25日
    9
  • 深度相机 结构光_结构光三维成像原理

    深度相机 结构光_结构光三维成像原理版权声明:本文为博主原创文章,未经博主允许不得转载。违者必究。 https://blog.csdn.net/electech6/article/details/78707839 &lt;/div&gt; &lt;linkrel="styles…

    2025年7月20日
    3
  • 初探js逆向「建议收藏」

    初探js逆向「建议收藏」转载自三尾先生博客初探js逆向在开始之前想先说下阅读完三尾先生这篇文章的一点个人理解,文章写得挺好的,很值得新手学习了解,首先谈下逆向激活成功教程思路1.需要逆向的时候一般是遇到了加密问题,加密情况有参数加密,有结果加密。但不管怎样的加密只要页面能正常显示,那就有解密过程!2.先找到加密的字段名,通过字段名在sources全局搜索3.在含有这些字段的位置打断点,一般sources里看到的会是一行的压缩代码,我们可以通过点击左下角的双大括号格式化js代码然后通过断点一步步查看参数在哪一步骤发生了变

    2022年6月22日
    44
  • Tomcat日志管理(一)[通俗易懂]

    Tomcat日志管理(一)[通俗易懂]官方文档地址:http://tomcat.apache.org/tomcat-7.0-doc/logging.htmlTomcatJULITomcat的日志管理功能是借助于ApacheCommonsLogging库来实现的,该库对当今几个流行的日志框架的精简和封装,从而使得Tomcat日志管理不必依赖于某一个具体的日志框架。从Tomcat6.0开始,Tomcat内的Apache…

    2022年5月22日
    38
  • 平均数、中位数和众数及它们之间的关系

    平均数、中位数和众数及它们之间的关系迁移到:http://www.bdata-cap.com/newsinfo/1741421.html本文内容平均数中位数众数参考资料演示最近大BOSS“迷上”了一个网络游戏(什么游戏就

    2022年7月2日
    34

发表回复

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

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