C++数字图像处理(1)-伽马变换
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)-伽马变换的更多相关文章
- 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)
相信看过冈萨雷斯第三版数字图像处理的童鞋都知道,里面涉及到了很多的基础图像处理的算法,今天,就专门借用其中一个混合空间增强的案例,来将常见的几种图像处理算法集合起来,看能发生什么样的化学反应 首先,通 ...
- OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...
- 图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)
一.图像增强算法原理 图像增强算法常见于对图像的亮度.对比度.饱和度.色调等进行调节,增加其清晰度,减少噪点等.图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则 ...
- 伽马变换(一些基本的灰度变换函数)基本原理及Python实现
1. 基本原理 变换形式 $$s=cr^{\gamma}$$ c与$\gamma$均为常数 可通过调整$\gamma$来调整该变换,最常用于伽马校正与对比度增强 2. 测试结果 图源自skimage ...
- 对比度增强(二):直方图正规划与伽马变换 cv.normal()函数使用及原理
直方图正规化: 图像为I,宽为W,高为H,I(r,c)代表I的第r行第c列的灰度值:输出图像记为O,为使得输出图像的灰度值在[Omin,Omax]范围里,可用如下公式: ...
- FPGA与数字图像处理技术
数字图像处理方法的重要性源于两个主要应用领域: 改善图像信息以便解释. 为存储.传输和表示而对图像数据进行处理,以便于机器自动理解. 图像处理(image processing): 用计算机对图像进行 ...
- MATLAB数字图像处理(一)基础操作和傅立叶变换
数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中 ...
- Win8 Metro(C#)数字图像处理--2.53图像傅立叶变换
原文:Win8 Metro(C#)数字图像处理--2.53图像傅立叶变换 [函数名称] 1,一维FFT变换函数 Complex[] FFT(Complex[] sourceDat ...
- Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测
原文:Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测 [函数名称] Hough 变换直线检测 HoughLineDetect(WriteableBit ...
随机推荐
- WinXP SSH连接不上虚拟机的解决方法
问题现象描述: 在VMWare中安装好linux系统后,选择桥接,从宿主机Windows上使用Putty, SSH Secure Shell等客户端工具连接linux上的ssh服务,客户端一直没有反应 ...
- Matlab数组创建
只用C语言,不用Matlab这种魔咒还是要打破的.Matlab是科学计算的常用工具,既然以前没用过,现在开始学吧...... 1. 向量的创建 1)直接输入: 行向量:a=[1,2,3,4,5] ...
- 请不要继续使用VC6.0了!
很多次和身边的同学交流,帮助同学修改代码,互相分享经验,却发现同学们依然在使用老旧的VC6.0作为编程学习的软件,不由得喊出:“请不要继续使用VC6.0了!”. VC6.0作为当年最好的IDE(集成开 ...
- eclipse中导入maven项目:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.proje
org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter) 解决方法为:更新eclipse中的maven插件 1.help ...
- python tips:小整数对象池与字符串intern
本文为is同一性运算符的详细解释.is用于判断两个对象是否为同一个对象,具体来说是两个对象在内存中的位置是否相同. python为了提高效率,节省内存,在实现上大量使用了缓冲池技术和字符串intern ...
- VS 2017 统计项目代码总行数
编辑 → 查找和替换 → 在文件中的查找,打开查找窗口 填入正则表达式 ^b*[^:b#/]+.*$ 查找范围选“整个解决方案”,勾选上“使用正则表达式” 如果要限制文件类型,就填上要查找的文件类型 ...
- 小程序组件 Vant Weapp 安装
文件夹的名称必须是英文 第一步:npm init -y 第二步:npm i vant-weapp -S --production
- Linux 僵尸进程如何处理
Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...
- SQL中的条件判断语句(case when zhen if,ifnull)用法
简介: case具有两种格式.简单case函数和case搜索函数.这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式.还有 ...
- Centos 修改主机名称
Centos 配置主机名称: 1.首先查询一下当前的主机名称 [root@localhost~]# hostnamectl status Static hostname: ****** //永久主机名 ...