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. Python学习①. 基础语法

    Python 简介 Python 是一种解释型,面向对象的语言.特点是语法简单,可跨平台 Python 基础语法 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编 ...

  2. vue小白学习笔记

    <div id="div"> <h2>{{ key }}</h2> </div> new Vue ({ el : "#di ...

  3. Python 文件操作 day2

    一.打开文件的模式1:读.写.追加 1.r读:读模式,只能读,不能写,打开不存在的文件会报错:可省略'r',因为不写默认是读模式 f = open('filename',encoding='utf-8 ...

  4. [luogu1155 NOIP2008] 双栈排序 (二分图染色)

    传送门 Description Input 第一行是一个整数 n . 第二行有 n 个用空格隔开的正整数,构成一个 1−n 的排列. Output 共一行,如果输入的排列不是"可双栈排序排列 ...

  5. Problem 25

    Problem 25 The Fibonacci sequence is defined by the recurrence relation: Fn = Fn−1 + Fn−2, where F1 ...

  6. 渗透实战(周一):VMmare Fusion安装Kali Linux和win7虚拟机

    高配笔记本电脑i5/8G/265G .VMware Fusion .Kali Linux镜像 .Win7镜像  第一:下载软件 1.如果你是苹果系统,建议下载最新VMware Fusion 11.0. ...

  7. Atcoder AGC031B Reversi (DP计数)

    简单的计数题.(总算做出一道AGC的B题了,然而这场比赛我忘记打了233333) 题目链接: https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: ...

  8. BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)

    手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csdn.net/suncongbo/article/details/78819470 URL: (Lu ...

  9. Tyvj - 1286 - 校门外的树2

    描述 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1 ...

  10. Spark MLlib LDA 基于GraphX实现原理及源代码分析

    LDA背景 LDA(隐含狄利克雷分布)是一个主题聚类模型,是当前主题聚类领域最火.最有力的模型之中的一个,它能通过多轮迭代把特征向量集合按主题分类.眼下,广泛运用在文本主题聚类中. LDA的开源实现有 ...