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


相关推荐

  • 使用XSLT转换XML

    使用XSLT转换XMLSLT1.0是W3C标准,主要用于对XML文档的转换,包括将XML转换成HMTL,TEXT或者另外格式的XML文件.XSLT1.0可以与XPATH1.0标准一起使用,XPATH会告诉你要转换的节点而

    2022年7月2日
  • Webstorm的一些常用快捷键

    Webstorm的一些常用快捷键下面是Webstorm的一些常用快捷键:1.ctrl+shift+n:打开工程中的文件,目的是打开当前工程下任意目录的文件。2.ctrl+j:输出模板3.ctrl+b:跳到变量申明处4.ctrl+alt+T:围绕包裹代码(包括zencoding的WrapwithAbbreviation)5.ctrl+[]:匹配{}[]6

    2022年6月12日
  • 网站优化怎样的外链能轻松收录,网站外链优化攻略「建议收藏」

    网站优化怎样的外链能轻松收录,网站外链优化攻略「建议收藏」有些事情,让你感到很无奈,网站外链优化也是如此,往往那些很容易发布网站外链的地方,价值不大,而不容易发布外链的地方,一旦发布上去了,效果胜过几十条甚至更多的外链,而且可以轻松让搜索引擎收录,网站优化怎样让网站外链轻松被收录呢?<ignore_js_op>一、善于寻找我们运营的是网站,发布外链的地方也是网站,除了内容有差异之外,权重高低也有差别,我们要找的自然是高于我们权重的网站,…

    2022年7月21日
  • 快速理解线程锁

    快速理解线程锁线程锁线程锁真的好麻烦啊!!!找了几篇博客发现写的都不一样相关联内容太多不容易理解所以现在需要理清什么是线程锁应用场景怎么用优缺点1.什么是线程锁机制多线程可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!so,不使用线程锁,可能导致错误啰嗦两句:比如你在银行取钱的同时你女朋友用支付宝取钱…

    2022年6月21日
  • mysql中使用show table status 查看表信息

    mysql中使用show table status 查看表信息

    2021年10月14日
  • jQuery遮罩层登录对话框

    用户登录是许多网站必备的功能。有一种方式就是不管在网站的哪个页面,点击登录按钮就会弹出一个遮罩层,显示用户登录的对话框。这用方式比较灵活方便。而现在扫描二维码登录的方式也是很常见,例如QQ、微信、百度

    2021年12月28日

发表回复

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

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