自动伽马校正(Auto Gamma Correction)算法

article/2025/8/18 22:59:59

自动伽马校正(Auto Gamma Correction)算法

微信公众号:幼儿园的学霸

目录

文章目录

  • 自动伽马校正(Auto Gamma Correction)算法
  • 目录
  • 理论
  • 代码实现
  • 参考资料

理论

在对图像进行处理过程中,查找到一篇对图像进行自动gamma校正的论文,论文名称及链接见参考文献1.

文章的核心描述如下:

Average of brightness is simple element that can be computed in the least amount of time. Basic approach in this article present a technique to estimate appropriate gamma based on average brightness. …, We suppose a gamma which changes average of brightness to 1/2, …

其大概意思是:假定一副合理的图像其所有像素(归一化后)的均值应该在0.5左右,那么自动伽马校正的伽马值就要使得目标图像向这个目标前进。
假设X是图像的平均值,那么自动伽马校正所需要的伽马值应该基于下列公式进行计算:
公式
公式描述

根据论文描述:

This paper proposes a method which estimates a power that transport average amount of brightness to center of histogram.

即通过自动gamma校正后图像的灰度直方图将向中心进行偏移。

代码实现

按照上述公式,可以很快实现该算法。代码如下。
1.在实现过程中,采用了查找表的思想,以加快图像处理速度。
2.针对多通道图像,对各通道的gamma再次进行求均值,作为gamma校正的gamma值,以避免多通道图像的偏色现象。该修改在原论中并不存在。

//
// Created by liheng on 11/22/20.
//#include <iostream>
#include <chrono>
#include <opencv2/opencv.hpp>//自动Gamma校正算法
//Input Param:src--输入图像,3 channels or 1channels
//Output Param:dst--归一化后的图像,type as src
//Return:   null
void AutoGammaCorrection(const cv::Mat &src, cv::Mat &dst)
{const int channels = src.channels();const int type = src.type();assert( type==CV_8UC1 || type==CV_8UC3 );//======计算gamma值========//auto mean = cv::mean(src);//求均值mean[0] = std::log10(0.5) / std::log10(mean[0]/255);//gamma = -0.3/log10(X)if( 3==channels ){mean[1] = std::log10(0.5) / std::log10(mean[1]/255);//gamma = -0.3/log10(X)mean[2] = std::log10(0.5) / std::log10(mean[2]/255);//gamma = -0.3/log10(X)//多通道图像,对求得的gamm再次平均,避免偏色现象auto mean3 = (mean[0]+mean[1]+mean[2])/3;mean[0]=mean[1]=mean[2] = mean3;}//=======计算gamma查找表,减少计算量=======////查找表,数组的下标对应图片里面的灰度值//lut(0,10)=(50,60,70)表示通道1灰度值为10的像素其对应的值为50;// 通道2灰度值为10的像素其对应的值为60;// 通道3灰度值为10的像素其对应的值为70cv::Mat lut(1,256,src.type());if( 1==channels ){for(int i=0; i<256;++i)//灰度等级[0,255]{//将灰度值归一化0-1之间float Y = i*1.0f/255;// or Y=i*0.00392;//求该灰度值gamma校正后的值Y = std::pow(Y,mean[0]);lut.at<unsigned char>(0,i) = cv::saturate_cast<unsigned char>(Y*255);}}else if(3==channels){for(int i=0; i<256;++i)//灰度等级[0,255]{//将灰度值归一化0-1之间float Y = i*1.0f/255;// or Y=i*0.00392;//求该灰度值gamma校正后的值auto B = cv::saturate_cast<unsigned char>(std::pow(Y,mean[0])*255);auto G = cv::saturate_cast<unsigned char>(std::pow(Y,mean[1])*255);auto R = cv::saturate_cast<unsigned char>(std::pow(Y,mean[2])*255);lut.at<cv::Vec3b>(0,i) = cv::Vec3b(B,G,R);}}//=========利用查找表进行校正==========//cv::LUT(src,lut,dst);
}int main()
{std::string image_path = "../autogamma.png";cv::Mat src = cv::imread(image_path,cv::IMREAD_COLOR);cv::imshow("src",src);cv::Mat dst1,dst2;AutoGammaCorrection(src,dst1);src.convertTo(src,CV_32FC3,1.0/255);cv::pow(src,0.7,dst2);cv::normalize(dst2,dst2,0,255,cv::NORM_MINMAX);cv::convertScaleAbs(dst2,dst2);cv::imshow("dst1",dst1);cv::imshow("dst2",dst2);cv::waitKey(0);
}

效果如下:

类别图像直方图
原图原图原直方图
自动gamma校正自动gamma校正自动gamma校正直方图
手动gamma校正手动gamm校正手动校正gamma直方图

可以看到,
1.自动gamma校正通过自动计算gamma值来调整图像,比手工设定gamma值要明显方便很多。
2.经过自动gamma校正后的图像,其直方图的中心相对原图向中心进行了平移。

参考资料

1.自动伽马校正原英文论文 Automatic gamma correction based on average of
brightness



下面的是我的公众号二维码图片,按需关注。
图注:幼儿园的学霸


http://chatgpt.dhexx.cn/article/aXOd3Jcs.shtml

相关文章

图像基础--图像预处理技术(色彩插值、色彩校正、伽马校正、图像增强和白平衡)

1、简介 图像采集的功能由图像传感器实现&#xff0c; 目前图像传感器主要有电荷耦合器件CCD和CMOS传感器&#xff0c;CCD传感器具有高解析度、低噪声、动态范围大等优点&#xff1b;CMOS具备低成本、高的集成度、低功耗等有点。但不论是CCD还是CMOS传感器在将实际景物转换为图…

【Unity3D】伽马校正

1 伽马相关概念 1.1 人眼对亮度变化的感知 人眼对亮度变化的感知不是线性的&#xff0c;如下图&#xff0c;人眼对亮区的亮度变化不太敏感&#xff0c;对暗区的亮度变化较敏感。另外&#xff0c;我们可以想象一下&#xff0c;在一个黑暗的房间里&#xff0c;由 1 根蜡烛到 2 根…

伽马校正(gamma correction)学习笔记

学习HDR和Bloom特效的过程中&#xff0c;接触到了伽马矫正的问题。查阅了不少资料&#xff0c;这一篇讲的最清楚&#xff0c;下面的图片也是来自该文章。 这应该说是一个历史遗留问题&#xff0c;以前的CRT显示器是使用电子显像管&#xff0c;通过控制电流大小来控制显示屏幕上…

sRGB标准与伽马校正 理解

srgb &#xff1a; 颜色值会以非线性的方式存储 如一个颜色值在线性空间中&#xff0c;rgb(1,1,1)&#xff0c; 在gamma空间中&#xff0c;rgb会变为(1的2.2幂次&#xff0c;1的2.2幂次&#xff0c;1的2.2幂次),颜色值会发生改变&#xff0c;这样方便在显示器中显示的时候&am…

伽马校正和颜色空间

一、伽马校正 所谓gamma校正&#xff0c;实际上是一个颜色的非线性变换。下面来解释这个变换曲线存在的原因。 1.1 人眼的非线性视觉效应 为什么要有gamma校正了。一言以蔽之&#xff0c;人眼的生理效应。如下图所示&#xff0c; 第一行是人眼感受到的线性亮度变化&#xf…

伽马校正探究

关于伽马校正的前因后果&#xff0c;在网上有不同版本的说法&#xff0c;由于年代久远的因素&#xff0c;导致原本很简单的事情越说越复杂。今天我们的目标就是抓住伽马的头&#xff0c;而不是摸一下伽马的尾巴。 一&#xff0c;鱼龙混杂的论调 1&#xff0c;CRT 显示器的物理…

图像的伽马校正

图像的伽马校正 图像的伽马校正属于图像增强中幂次增强&#xff0c; γ>1时&#xff0c;使图像变暗&#xff0c;即图像变黑&#xff1b; γ<1时&#xff0c;使图像变亮&#xff0c;即图像变白。 下面是伽马校正的过程&#xff1a; 1&#xff09;将像素值为【0,255】如2…

伽马校正笔记(Gamma Correction)

在数字图像系统中&#xff0c;伽马&#xff08;Gamma&#xff09;是一个重要的但很少被正确理解的特性。它定义了一个像素的数值和对应的实际亮度之间的关系。 人眼感知的亮度和相机“看到”的亮度区别 对于数码相机来说&#xff0c;当检测的光子数增加一倍时&#xff0c;sens…

伽马校正-

伽马校正 问题描述&#xff1a;读取图像&#xff0c;然后对图像进行伽玛校正。 伽马校正 这里是一篇写伽马校正比较好的文章&#xff0c;我觉得可以作为背景知识补充。 伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正。如果图像原样显示在显示器等上&…

图形 2.6 伽马校正

一、Gamma校正 1、颜色空间 图中可以看到&#xff0c;sRGB和Rec.709的色域虚线一样&#xff0c;三原色的位置是相同的&#xff0c;那么它们之间的区别就是&#xff1a;传递函数不同 2.传递函数 定义 知道了颜色的颜色值之后&#xff0c;想要在电子设备上显示&#xff0c;就…

伽马校正(Gamma Correction)与sRGB

文章目录 CRT显示器与人眼视觉非线性显示与渲染伽马校正sRGB 纹理正确的点光衰减补充参考资料 CRT显示器与人眼视觉 过去, 大多数监视器是阴极射线管显示器(CRT). 这些监视器有一个物理特性就是两倍的输入电压产生的不是两倍的亮度. 输入电压产生约为输入电压的 2.2 次幂的亮度…

图形学基础——伽马校正

百人计划学习视频连接&#xff1a;【技术美术百人计划】图形 2.6 伽马校正 颜色空间 具体内容在之前的文章有讲&#xff1a;色彩空间介绍 sRGB&#xff1a;微软在1996年发布的通用颜色标准DCI-P3&#xff1a;数字电影播放的颜色标准Rec-709、PAL&#xff1a;电视行业的颜色标…

伽马校正

注&#xff1a;本文为博主参考书籍和他人文章并加上自己的理解所编&#xff0c;作为学习笔记使用并将其分享出去供大家学习。若涉及到引用您的文章内容请评论区告知&#xff01;如有错误欢迎指正&#xff01; 一、伽马校正简介 射伽马校正是图像预处理阶段经常使用的一个非…

可执行文件的装载,进程和线程,运行时库的入口函数(第六章)

目录 第1步.创建一个独立的虚拟内存空间 第2步.读取可执行文件头&#xff0c;建立虚拟空间和可执行文件之间的映射关系 第3步.将cpu的指令寄存器设置成可执行文件的入口地址&#xff0c;启动运行。 程序开始执行&#xff0c;发生页错误。 随着程序的执行&#xff0c;不停…

疯狂python讲义学习笔记——前十章完结

#第一章&#xff1a;绪论 #单行注释多行注释""" 多行注释 """#dir列出指定类或模块的属性与方法&#xff0c;help查看某个函数或方法的帮助文档 print(dir(str)) print(help(str.title))#第二章&#xff1a;数据类型 a5 print(type(a))#<clas…

嵌入式代码学习心得记录

一、C语言学习心得记录 函数递归 编写顺序 终结条件输入下一级递归参数,调用下一级递归函数.当前递归函数的操作代码,在下一级递归函数执行完成后执行的操作代码. #include <stdio.h> #include <string.h>void revert(char *s, int len) {// 终结条件if(len <…

python 字节流分段_一文掌握CTF中Python全部考点

声明&#xff1a;Tide安全团队原创文章&#xff0c;转载请声明出处&#xff01;文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用&#xff0c;任何人不得将其用于非法用途以及盈利等目的&#xff0c;否则后果自行承担&#xff01; 前 言 一次偶然的机会&#xff0c…

Python课程学习笔记 下

笔记目录 Python 学习笔记 上面向对象和异常面向对象基本理论定义类根据类实例化对象属性相关方法相关类的补充属性补充方法相关补充描述器python对象的生命周期内存管理机制面向对象的三大特性面向对象应当遵循的原则 错误和异常错误和异常的概念常见的系统异常和系统异常类继…

从点击APP图标到首页展示的加载过程

转载链接在这里 iOS 系统架构 Mac系统是基于Unix内核的图形化操作系统&#xff0c;Mac OS 和 iOS 系统架构的对比分析发现&#xff0c;Mac OS和iOS的系统架构层次只有最上面一层不同&#xff0c;Mac是Cocoa框架&#xff0c;而iOS是Cocoa Touch框架&#xff0c;其余的架构层次都…

python os模块

10.3 os模块 os就是“operating system”的缩写&#xff0c;顾名思义&#xff0c;os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块&#xff0c;一方面可以方便地与操作系统进行交互&#xff0c;另一方面页可以极大增强代码的可移植性。如果该模块中…