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)
上一篇 2022年6月17日 下午11:18
下一篇 2022年6月17日 下午11:18


相关推荐

  • Focal loss 和 GHM

    Focal loss 和 GHMFocalLossfor 是 ICCV2017 的 Beststudentp 文章思路很简单但非常具有开拓性意义 效果也非常令人称赞 GHM gradientharm 发表于 GradientHarm stageDetecto AAAI2019 是基于 Focalloss 的改进 也是个人推荐的一篇深度学习必读文章 1 FocalLossFoc 的引入主要是为了

    2026年3月17日
    2
  • Delphi 教程

    Delphi 教程1.点击Project->View Source 可以看到工程的代码program Project1;uses  Forms,  Unit1 in ‘Unit1.pas’ {Form1};{$R *.res}begin  Application.Initialize;  Application.CreateForm(TForm1, Form1);

    2022年6月29日
    58
  • 润乾报表开发

    润乾报表开发nbsp nbsp nbsp nbsp nbsp 工作中有机会接触到润乾报表 把这几个月的开发经历记录下 以备刚刚接触润乾报表的朋友一点帮助 版本是 nbsp 润乾报表 4 0 先将设计好的报表放到项目的 WEB INF reportFiles 目录下 页面中代码 当然也可以写到 action 中 request setCharacter UTF 8 Stringrepo

    2026年3月26日
    2
  • x86汇编指令集大全(带注释)

    x86汇编指令集大全(带注释)汇编指令集太多 如果不用就会忘记 所以将 i 处理器官方的指令集大全写到博客上 有需要的人可以参考一下 X86 和 X87 汇编指令大全 有注释 一 数据传输指令它们在存贮器和寄存器 寄存器和输入输出端口之间传送数据 1 通用数据传送指令 MOV

    2026年3月26日
    1
  • DDOS工具集

    DDOS工具集1DDoS 攻击 DDoS 攻击是一种可用于执行分布式拒绝服务攻击的工具 此应用程序可以监控来自众多来源的事件日志 以查找和检测 DDoS 活动 特征 此应用程序可以检测与控制服务器和命令的通信 提供实时响应 可以轻松过滤特定的时间范围 IP 或参数 该工具可帮助您检测命令和控制服务器之间的恶意活动 2PRTGPRTG 网络监控软件以其先进的基础设施管理功能而闻名 该工具使用 SNMP WMI 嗅探 RESTAPIS SQL 等技术监控 IT 基础设施 特征 PRTG 可以通过 ping

    2026年3月26日
    1
  • Mariadb源代码编译过程

    Mariadb源代码编译过程

    2022年3月6日
    45

发表回复

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

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