图像处理算法之Gamma校正

article/2025/10/16 0:25:06

文章目录

  • 1 使用场景
  • 2 原理
  • 3 实现步骤
  • 4 实现
  • 5 效果

1 使用场景

当一张图片出现过亮或者过暗的时候导致图像对比度较差,可以使用Gamma校正来处理

2 原理

在这里插入图片描述
如上图所示,为函数 f ( I ) = I γ f(I) = I^γ f(I)=Iγ的曲线表示:
γ < 1 γ<1 γ<1时,为图中上方的虚线曲线,图中 γ = 1 / 2.2 γ=1/2.2 γ=1/2.2
γ = 1 γ=1 γ=1时,为图中间的直线,也就是 f ( I ) = I f(I)=I f(I)=I
γ > 1 γ>1 γ>1时, 为图中下方的曲线实线,图中 γ = 2.2 γ=2.2 γ=2.2

γ ! = 1 γ!=1 γ!=1时,会将对I进行非线性的变换,对0,1两端的变换最小,对中间的变换最大。如果把图像0-255像素值,归一化到0-1, 带入进来,通过该变换,则可达到一定的效果:
1)当 γ < 1 γ<1 γ<1时,图像中最亮(1)或者最暗(0)的像素保持不变,整体亮度会发生提升,像素值中间的部分效果最明显,用来处理比较暗的图片非常好
2)当 γ > 1 γ>1 γ>1时,图像中最亮(1)或者最暗(0)的像素保持不变,整体亮度会发生降低,像素值中间的部分效果最明显,用来处理比较亮的图片非常好

最后x255即可

3 实现步骤

假设图像中有一个像素,值是 200 ,那么对这个像素进行校正必须执行如下步骤:

1. 归一化 :将像素值转换为 0 ~ 1 之间的实数。 算法如下 : ( i + 0. 5)/256 这里包含 1 个除法和 1 个加法操作。对于像素 A 而言 , 其对应的归一化值为 0. 783203 。

2. 预补偿 :根据公式 , 求出像素归一化后的 数据以 1 /gamma 为指数的对应值。这一步包含一个 求指数运算。若 gamma 值为 2. 2 , 则 1 /gamma 为 0. 454545 , 对归一化后的 A 值进行预补偿的结果就 是 0. 783203 ^0. 454545 = 0. 894872 。

3. 反归一化 :将经过预补偿的实数值反变换为 0 ~ 255 之间的整数值。具体算法为 : f*256 - 0. 5 此步骤包含一个乘法和一个减法运算。续前 例 , 将 A 的预补偿结果 0. 894872 代入上式 , 得到 A 预补偿后对应的像素值为 228 , 这个 228 就是最后送 入显示器的数据。

如上所述如果直接按公式编程的话,假设图像的分辨率为 800*600 ,对它进行 gamma 校正,需要执行 48 万个浮点数乘法、除法和指数运算。效率太低,根本达不到实时的效果。

针对上述情况,提出了一种快速算法,如果能够确知图像的像素取值范围 , 例如 , 0 ~ 255 之间的整数 , 则图像中任何一个像素值只能 是 0 到 255 这 256 个整数中的某一个 ; 在 gamma 值 已知的情况下 ,0 ~ 255 之间的任一整数 , 经过“归一 化、预补偿、反归一化”操作后 , 所对应的结果是唯一的 , 并且也落在 0 ~ 255 这个范围内。

如前例 , 已知 gamma 值为 2. 2 , 像素 A 的原始值是 200 , 就可求得 经 gamma 校正后 A 对应的预补偿值为 228 。基于上述原理 , 我们只需为 0 ~ 255 之间的每个整数执行一次预补偿操作 , 将其对应的预补偿值存入一个预先建立的 gamma 校正查找表 (LUT:Look Up Table) , 就可以使用该表对任何像素值在 0 ~ 255 之 间的图像进行 gamma 校正。

4 实现

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
Mat gammaTransform(Mat &srcImage, float kFactor)
{unsigned char LUT[256];for (int i = 0; i < 256; i++){float f = (i + 0.5f) / 255;f = (float)(pow(f, kFactor));LUT[i] = saturate_cast<uchar>(f*255.0f - 0.5f);}Mat resultImage = srcImage.clone();if (srcImage.channels() == 1){MatIterator_<uchar> iterator = resultImage.begin<uchar>();MatIterator_<uchar> iteratorEnd = resultImage.end<uchar>();for (; iterator != iteratorEnd; iterator++){*iterator = LUT[(*iterator)];}}else{MatIterator_<Vec3b> iterator = resultImage.begin<Vec3b>();MatIterator_<Vec3b> iteratorEnd = resultImage.end<Vec3b>();for (; iterator != iteratorEnd; iterator++){(*iterator)[0] = LUT[((*iterator)[0])];//b(*iterator)[1] = LUT[((*iterator)[1])];//g(*iterator)[2] = LUT[((*iterator)[2])];//r}}return resultImage;
}

5 效果

老胡拉来尝试一把:

γ = 1 / 2.2 γ=1/2.2 γ=1/2.2 的提亮效果
在这里插入图片描述


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

相关文章

Gamma 校正

问题&#xff1a;什么是Gamma曲线矫正&#xff1f;Gamma曲线矫正是什么意思&#xff1f; Gamma曲线是一种特殊的色调曲线&#xff0c;当Gamma值等于1的时候&#xff0c;曲线为与坐标轴成45的直线&#xff0c;这个时候表示输入和输出密度相同。高于1的Gamma值将会造成输出…

opengl高级光照之gamma校正

官方文章 gamma校正 gamma校正概念 一个渐变的效果 通过以下网站调整Gamma值可以观察到效果 色彩管理网 gamma校正 Gamma校正(Gamma Correction)的思路是在最终的颜色输出上应用监视器Gamma的倒数。回头看前面的Gamma曲线图&#xff0c;你会有一个短划线&#xff0c;它是监…

gama校正算法matlab,Gamma校正及其FPGA实现(一)

最近在做一个千兆以太网传输的项目&#xff0c;里面用到了Gama校正算法&#xff0c;本来想使用Altera 的IP核Gamma Corrector&#xff0c;但Quartus16.0把Gamma Corrector的IP核集成到了QSYS里面了&#xff0c;还得研究qsys怎么用&#xff0c;与自己本来的方案不符合&#xff0…

Gamma Correction/Gamma校正/灰度校正/亮度校正 - 部分 DCC 中的线性工作流配置

文章目录 也可以简单参考 SIGGRAPH 2010 的 PBS 的 Gamma-CorrectUnity 中的 gamma、linear 工作流Unity BRP 管线中的 shaderlab 提供的 gamma2linear, linear2gammaUnity中线性空间配置DCC 中的 gamma 值是怎么计算的&#xff1f;Photoshop 的线性工作流方式1方式2验证 Photo…

光栅投影中Gamma校正

学习 郑东亮 达飞鹏 《提高数字光栅投影测量系统精度的gamma校正技术》一文后&#xff0c;对其中的关键技术进行了解析。 摄像机获得的实际灰度图像&#xff1a; 其中是整个系统的gamma值&#xff0c;是预编码值&#xff08;需要根据实验进行选择&#xff09;&#xff0c;是幅…

java opencv gamma_Gamma校正及其OpenCV实现

一、什么是Gamma校正&#xff1f; Gamma校正是对输入图像灰度值进行的非线性操作&#xff0c;使输出图像灰度值与输入图像灰度值呈指数关系&#xff1a; [2] 这个指数即为Gamma. 经过Gamma校正后的输入和输出图像灰度值关系如图1所看到的&#xff1a;横坐标是输入灰度值&#x…

gamma校正 matlab,Gamma校正 ——图像灰度变化 OpenCV (十)

Gamma校正(C++、OpenCV实现) 1.作用: Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: 伽玛校正由以下幂律表达式定义: 2.函数原型 void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, Out…

图像Gamma(伽玛)校正的原理及OpenCV代码实现

什么是Gamma校正&#xff1f; Gamma校正是对输入图像灰度值进行的非线性操作&#xff0c;使输出图像灰度值与输入图像灰度值呈指数关系。 Gamma校正的原理表达式如下&#xff1a; 上面中的指数γ即为Gamma。这就是Gamma校正的名称来历。 其中的取值范围是0~1&#xff0c;最重…

Gamma校正

下面是自己所整理的一些gamma校正的东西如有侵权请联系删除。 Gamma矫正&#xff1a; 伽马矫正也称幂律变换&#xff0c;一般用于平滑的扩展暗调的细节。 进行伽马矫正的原因是人类的眼睛在感知光线时&#xff0c;眼睛对亮度的感知遵循近似的幂函数&#xff08;如图&#xf…

图像Gamma校正

1. gamma校正的起因&#xff1a;人眼感知光线的特殊性 对于现实世界的光的强度来说&#xff0c;描述光的强弱&#xff0c;是根据光子在单位面积上的光子数量来描述的&#xff0c;这是物理规则&#xff0c;这是没错的&#xff0c;光的亮度&#xff08;强度&#xff09;是和光子数…

Gamma校正原理及实现

gamma校正原理&#xff1a;   假设图像中有一个像素&#xff0c;值是 200 &#xff0c;那么对这个像素进行校正必须执行如下步骤&#xff1a;   1. 归一化 &#xff1a;将像素值转换为 0 &#xff5e; 1 之间的实数。 算法如下 : ( i 0. 5)/256 这里包含 1 个除法和 1…

python手撕分水岭算法

python手撕分水岭算法 1 分水岭算法实现 主要思路就是&#xff1a; 利用一个优先队列与有序队列&#xff08;有序队列其实可以不用&#xff09;。优先队列是按像素的灰度值排列的&#xff0c;灰度值低的先被淹。通过统计像素的附近的点的标记种类个数来确认当前像素点的标记…

分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry)&#xff0c;它属于立体视觉(stereo vision)几何学&#xff0c;立体视觉是计算机视觉的一个分支&#xff0c;它从同一物体的两张不同图像提取三维信息。 极几何的工作原理&#x…

分水岭算法-python-opencv

分水岭算法简单原理&#xff1a; 对于一个图像的灰度值&#xff0c;将图像放平&#xff0c;可以看成是类似与山谷与山顶的图像&#xff0c;灰度值小的就是山底。先找到若干个山底&#xff0c;同时加水&#xff0c;当加到一定程度时候&#xff0c;某些山顶会被淹没&#xff0c;…

分水岭算法解析[halcon]

分水岭算法 分水岭算法是根据分水岭的构成来考虑图像的分割&#xff0c; 它是—种基于拓扑理论的数学形态学的分割方法。 首先&#xff0c; 把一幅图像看作起伏的地形&#xff0c; 图像的每像素灰度值作为这个地形的高度&#xff0c; 极小值是盆地&#xff0c; 极大值为山脊。…

opencv-分水岭算法图像分割

分水岭算法图像分割 目标   本节我们将要学习   • 使用分水岭算法基于掩模的图像分割   • 函数&#xff1a;cv2.watershed()    原理   任何一副灰度图像都可以被看成拓扑平面&#xff0c;灰度值高的区域可以被看成是山峰&#xff0c;灰度值低的区域可以被看成是山…

分水岭算法的python实现及解析

1 算法简介 分水岭算法的原理很容易查到&#xff0c;但是很多文章都是直接用的opencv或matlab函数&#xff0c;看不到具体实现方法&#xff0c;这篇文章希望能对大家有点帮助。 分水岭算法就是往山谷中注水&#xff0c;把不同湖水接触的位置称作分水岭&#xff0c;这么做的结…

opencv28:分水岭算法的图像分割

目标 在本章中&#xff0c;将学习 使用分水岭算法实现基于标记的图像分割函数&#xff1a;cv2.watershed() 理论 任何灰度图像都可以看作是一个地形表面&#xff0c;其中高强度的像素表示山峰&#xff0c;低强度表示山谷。可以用不同颜色的水(标签)填充每个孤立的山谷(局部…

OpenCV-分水岭算法

文章目录 分水岭算法cv2.watershed示例 分水岭算法 任何灰度图像都可以看作是一个地形表面&#xff0c;其中高强度表示山峰&#xff0c;低强度表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水位的上升&#xff0c;根据附近的山峰(坡度)&#xff…

【OpenCV】- 分水岭算法

文章目录 什么是图像分割分水岭算法1、实现分水岭算法&#xff1a;watershed()函数2、处理流程&#xff08;视频&#xff09;3、示例程序&#xff08;书中&#xff09; 什么是图像分割 将图像中像素根据一定的规则分为若干个cluster集合&#xff0c;每个集合包含一类对象 如下…