【C++】pow函数实现的伽马变换详解和示例

2023-11-21 13:20

本文主要是介绍【C++】pow函数实现的伽马变换详解和示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文通过原理和示例对伽马变换进行详解,并通过改变变换系数展示不同的效果,以帮助大家理解和使用。

原理

伽马变换是一种用于图像增强的技术,它可以用来提高或降低图像的对比度,常用于医学图像处理和计算机视觉等领域。伽马变换是通过将图像像素值映射到一个新的值,以达到对比度增强的效果。

伽马变换步骤具体可分为:
(1)图像转为灰度或自身便为灰度图像。
(2)像素值归一化到0-1之间
(3)计算像素值的gam此幂的值,使用pow函数,得到的值便为新图像的像素值。
pow()函数示例如下:

在头文件#include <cmath>中,函数原型:
double pow (double base, double exponent);
它接受两个参数:base(基数)和exponent(指数)。返回结果是基数的指数次幂。注意,pow函数可以用于浮点数和整数。对于整数,返回的结果也是整数,且只返回最接近的整数。示例:
pow(2,3)表示2的3次幂,输出结果为8

运行示例

#include <opencv2/opencv.hpp>
#include <cmath>using namespace cv;
using namespace std;void gammaTransform(Mat& img, Mat& result, double gamma) {result = img.clone();for (int y = 0; y < img.rows; y++) {for (int x = 0; x < img.cols; x++) {int index = y * img.cols + x;double pixel = img.at<uchar>(y, x);double transformed = pow((pixel / 255.0), gamma);result.at<uchar>(y, x) = round(transformed * 255.0);}}
}int main() {// 读取图像Mat img = imread("ceshi.jpg", IMREAD_GRAYSCALE);if (img.empty()) {cout << "Could not open or find the image" << endl;return -1;}// 创建目标图像Mat result;// 应用伽马变换,通过改变gam的值改变效果double gam = 0.5;gammaTransform(img, result,gam);// 显示和保存结果namedWindow("Source Image", WINDOW_NORMAL);imshow("Source Image", img);waitKey(0);destroyAllWindows();namedWindow("Gamma Transformed Image", WINDOW_NORMAL);imshow("Gamma Transformed Image", result);waitKey(0);destroyAllWindows();imwrite("grayceshi.jpg", img); // 保存结果图像imwrite("output0.5.jpg", result); // 保存结果图像return 0;
}

在这段代码中,我们首先使用OpenCV库中的imread函数读取输入图像。然后,我们创建一个新的Mat对象来存储伽马变换后的图像。接着,我们定义了一个名为gammaTransform的函数,该函数接受一个Mat对象(用于读取和写入图像数据)、一个Mat对象(用于存储结果图像)以及一个gamma系数。在函数内部,我们对每个像素应用伽马变换,并将结果存储在结果图像中。最后,我们在主函数中调用gammaTransform函数,显示源图像和变换后的图像,并保存结果图像。
下面我们通过改变gam的系数值来看具体的变换效果。
在这里插入图片描述
上面的为原图(灰度图),下面为改变系数的效果图。

系数为0.2

在这里插入图片描述

系数为0.5

在这里插入图片描述

系数为0.8

在这里插入图片描述

系数为2

在这里插入图片描述

系数为5

在这里插入图片描述

总结

伽马系数γ=1时,图像不变。如果图像整体或者感兴趣区域较暗,则令0<γ<1,可以增加图像对比度;相反,如果图像整体或者感兴趣区域较亮,则令1<γ可以降低图像对比度。
通过不同系数值的效果展示也可以看出,系数值在0和1之间时,值越小图像越亮。系数值大于1时,值越大图像越暗。

这篇关于【C++】pow函数实现的伽马变换详解和示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/402601

相关文章

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小