https://blog.csdn.net/huqiang_823/article/details/80767019

1、算法原理    伽马变换(幂律变换)是常用的灰度变换,是一种简单的图像增强算法。数学公式如下:(1)    式(1)中,r为输入的灰度值,取值范围为[0, 1]。C称为灰度缩放系数,用于整体拉伸图像灰度,通常取值为1。gamma取值灰度输入输出曲线图如下:图(1) gamma曲线图    从图(1)可知:当gamma>1.0时,伽马变换将拉低图像灰度值,图像视觉上变暗;当gamm<1.0时,伽马变换将提高图像的灰度值,图像视觉上变亮。2、算法定义    输入:8位灰度图像。    输出:8位灰度图像。    参数:gamma值、C值。3、算法实现(1)、公式实现//函数名:gammaTransformation//作用:实现灰度变换中的伽马变换//参数://matInput:输入图像//matOutput : 输出图像//fGamma : 伽马值//fC : C值(缩放系数)//返回值:无//注:支持单通道8位灰度图像void gammaTransformation(cv::Mat& matInput, cv::Mat& matOutput, float fGamma, float fC /*= 1.0f*/){ assert(matInput.elemSize() == 1); //构造输出图像 matOutput = cv::Mat::zeros(matInput.rows, matInput.cols, matInput.type());  //循环中尽量避免除法 float fNormalFactor = 1.0f / 255.0f; for (size_t r = 0; r < matInput.rows; r++) {  unsigned char* pInput = matInput.data + r * matInput.step[0];  unsigned char* pOutput = matOutput.data + r * matOutput.step[0];  for (size_t c = 0; c < matInput.cols; c++)  {   //gamma变换   float fOutput = std::pow(pInput[c] * fNormalFactor, fGamma) * fC;   //数值溢出判断   fOutput = fOutput > 1.0f ? 1.0f : fOutput;   //输出   pOutput[c] = static_cast<unsigned char>(fOutput * 255.0f);  } }}(2)、查表加速    几乎所有的灰度变换算法中,都可以使用查表方法进行加速。在【公式实现】中,循环中调用了库函数pow、并进行了一次if判断。这些操作,可以在循环外提提前计算好,循环中查表即可。在嵌入式系统中,查表法使用较多。优化后的代码如下:void gammaTransformation(cv::Mat& matInput, cv::Mat& matOutput, float fGamma, float fC /*= 1.0f*/){ assert(matInput.elemSize() == 1); //构造输出图像 matOutput = cv::Mat::zeros(matInput.rows, matInput.cols, matInput.type());  //循环中尽量避免除法 float fNormalFactor = 1.0f / 255.0f; //构造查询表 std::vector<unsigned char> lookUp(256); for (size_t m = 0; m < lookUp.size(); m++) {  //gamma变换  float fOutput = std::pow(m * fNormalFactor, fGamma) * fC;  //数值溢出判断  fOutput = fOutput > 1.0f ? 1.0f : fOutput;  //输出  lookUp[m] = static_cast<unsigned char>(fOutput * 255.0f); }  for (size_t r = 0; r < matInput.rows; r++) {  unsigned char* pInput = matInput.data + r * matInput.step[0];  unsigned char* pOutput = matOutput.data + r * matOutput.step[0];  for (size_t c = 0; c < matInput.cols; c++)  {   //查表gamma变换   pOutput[c] = lookUp[pInput[c]];  } }}(3)、测试结果
---------------------
作者:图像大师
来源:CSDN
原文:https://blog.csdn.net/huqiang_823/article/details/80767019
版权声明:本文为博主原创文章,转载请附上博文链接!

C++数字图像处理(1)-伽马变换的更多相关文章

  1. 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)

    相信看过冈萨雷斯第三版数字图像处理的童鞋都知道,里面涉及到了很多的基础图像处理的算法,今天,就专门借用其中一个混合空间增强的案例,来将常见的几种图像处理算法集合起来,看能发生什么样的化学反应 首先,通 ...

  2. OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...

  3. 图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)

    一.图像增强算法原理 图像增强算法常见于对图像的亮度.对比度.饱和度.色调等进行调节,增加其清晰度,减少噪点等.图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则 ...

  4. 伽马变换(一些基本的灰度变换函数)基本原理及Python实现

    1. 基本原理 变换形式 $$s=cr^{\gamma}$$ c与$\gamma$均为常数 可通过调整$\gamma$来调整该变换,最常用于伽马校正与对比度增强 2. 测试结果 图源自skimage ...

  5. 对比度增强(二):直方图正规划与伽马变换 cv.normal()函数使用及原理

    直方图正规化: 图像为I,宽为W,高为H,I(r,c)代表I的第r行第c列的灰度值:输出图像记为O,为使得输出图像的灰度值在[Omin,Omax]范围里,可用如下公式:                 ...

  6. FPGA与数字图像处理技术

    数字图像处理方法的重要性源于两个主要应用领域: 改善图像信息以便解释. 为存储.传输和表示而对图像数据进行处理,以便于机器自动理解. 图像处理(image processing): 用计算机对图像进行 ...

  7. MATLAB数字图像处理(一)基础操作和傅立叶变换

    数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中 ...

  8. Win8 Metro(C#)数字图像处理--2.53图像傅立叶变换

    原文:Win8 Metro(C#)数字图像处理--2.53图像傅立叶变换  [函数名称] 1,一维FFT变换函数         Complex[] FFT(Complex[] sourceDat ...

  9. Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测

    原文:Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测  [函数名称] Hough 变换直线检测         HoughLineDetect(WriteableBit ...

随机推荐

  1. C#—接口和抽象类的区别?

    一.接口 接口是指对协定进行定义的引用类型,其他类型实现接口,以保证它们支持某些操作.接口指定必须由类提供的成员或实现它的其他接口.与类相似,接口可以包含方法.属性.索引器和事件作为成员. 1.接口存 ...

  2. xpath定位实列

    这次将讲Xpath定位! 什么是Xpath: Path就是路径,xpath也类似,就像 在DOS中 D:\Auto\jack. Xpath的使用: 1:在火狐下载 FirePath 插件(图1),然后 ...

  3. 【双系统】windows 和 Ubuntu 双系统安装

      本博客主要讲述如何在已安装windows系统的计算机上安装Ubuntu双系统,涉及系统安装和相应磁盘空间分配等问题. 所需环境: 电脑已安装windows系统 下载Ubuntu16.04系统镜像 ...

  4. Vue主要原理最简实现与逻辑梳理

    Vue的主要原理中主要用到了定义的这么几个函数Dep,Watcher,observer.我们来使用这几个函数简单的实现一下vue构造函数数据绑定和相互依赖部分,梳理一下它们之间的关系.省略了编译部分和 ...

  5. vue中的slot理解和使用

    最近被vue 搞得一塌糊涂,理解的比较慢,工作进度进度要求太快,需求理解不明,造成了很大的压力. 在理解Vue中的Slot的时候看了网上的相关内容,看了半天没看到明白说的是什么,然后自己就安装了vue ...

  6. dubbo-dubboAdmin安装(一)

    简介 Dubbo是什么? dubbo是阿里开源的分布式服务治理框架,对服务的负载均衡,权重,监控,路由规则,禁用启用的管理,以及服务的自动注册和发现 分布式架构下面临问题 在分布式架构下,我们会将一个 ...

  7. Ngnix--知识点

    ngnix擅长负载 均衡的反向代理 haproxy擅长高可用的反向代理,这个还支持TCP协议 ngnix只能支持HTTP和Email(这个HTTPS需要核实一下) ngnix和haproxy都需要ke ...

  8. asp.net--常用的数据库链接字符串

    本地连接 privatestring conn_string ="Data Source=localhost;Initial Catalog=SQLtest;Integrated Secur ...

  9. [bzoj1212][HNOI2004]L语言_AC自动机_动态规划

    L语言 bzoj-1212 HNOI-2004 题目大意:给你一个n个单词的集合,然后给你m条字符串.问每条字符串可以被理解的最长前缀.被理解当且仅当存在一种分割使得每一段都是集合里的元素. 注释:$ ...

  10. ThinkPHP模版引擎之变量输出具体解释

    ThinkPHP模版引擎之变量输出具体解释 使用ThinkPHP开发有一定时间了,今日对ThinkPHP的模板引擎变量解析深入了解了一下.做出一些总结,分享给大家供大家參考. 详细分析例如以下: 我们 ...