5.8幂律变换

2024-09-05 00:20
文章标签 变换 5.8 幂律

本文主要是介绍5.8幂律变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

示例代码1

运行结果1

示例代码2

运行结果2

补充示例原理

示例:使用cv::pow进行图像处理

代码

运行结果

​编辑

补充

实验代码3

运行结果3​编辑


在OpenCV中,幂律变换(Power Law Transformations)是一种常用的图像增强技术,尤其适用于调整图像的对比度。这种变换通过应用一个幂函数来调整图像的亮度,使得图像的细节更加明显。幂律变换通常用于增强图像中的暗区域或亮区域,从而提高图像的整体对比度。

OpenCV中的实现方法
虽然OpenCV并没有直接提供幂律变换的函数,但可以通过简单的数学运算来实现这一变换。具体做法是先将图像转换为浮点数类型,然后应用幂律变换,最后再将结果转换回原来的类型。

示例代码1

转换数据类型
如果原始图像的数据类型为CV_8U,可以先将其转换为CV_32F类型,然后再进行幂运算。
最后再将结果转换回CV_8U类型。// 转换为浮点数类型

cv::Mat floatImage;
image.convertTo(floatImage, CV_32F, 1.0 / 255.0);// 应用幂运算
cv::pow(floatImage, power, powImage);// 将结果转换回原始类型
powImage.convertTo(powImage, CV_8U, 255.0);

下面是一个使用OpenCV实现幂律变换的示例代码:

#include "pch.h"#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{// 读取图像Mat img = imread("2.jpeg", IMREAD_COLOR);if (img.empty()){cerr << "无法加载图像,请检查文件路径是否正确。" << endl;return -1;}// 定义灰度矩阵Mat gray;cvtColor(img, gray, COLOR_BGR2GRAY);//转化为灰度图像// 定义目标矩阵Mat imgPowerLawTransformed;// 设置幂律变换的参数double gamma = 0.5; // 使图像变亮double c = 1.0;     // 常数项// 应用幂律变换//转换浮点数类型Mat floatImage;gray.convertTo(floatImage, CV_32F,1.0/255.0); // 将图像转换为32位浮点数pow(floatImage, gamma,imgPowerLawTransformed);      // 应用幂运算imgPowerLawTransformed.convertTo(imgPowerLawTransformed, CV_8U, 255.0); // 将结果转换回8位无符号整数// 显示原始图像和变换后的图像namedWindow("源图像", WINDOW_NORMAL);imshow("源图像", img);namedWindow("灰度图像", WINDOW_NORMAL);imshow("灰度图像", gray);namedWindow("幂指化后图像", WINDOW_NORMAL);imshow("幂指化后图像", imgPowerLawTransformed);waitKey(0); // 等待按键退出return 0;
}代码解释
1.读取图像:使用cv::imread读取输入图像,并确保它是灰度图像。
2.获取幂次方值:可从命令行参数中读取幂次方值。
3.设置幂律变换的参数:定义幂指数 gamma 和常数 c。
4.应用幂律变换:
将图像转换为32位浮点数类型,以避免运算过程中的溢出问题。
转换为浮点数类型:将图像转换为浮点数类型CV_32F,以便进行幂运算。
应用幂律变换 s = c⋅r γ,其中 r 是图像中的像素值。
将结果转换回8位无符号整数类型,以适应图像显示的要求。
4.创建输出图像:创建一个新的cv::Mat对象来存储幂运算后的结果。
5.应用幂运算:使用cv::pow函数对图像矩阵中的每个元素进行幂运算。
6.将结果转换回原始类型:将幂运算后的结果转换回原来的类型CV_8U。
7.显示结果:使用cv::imshow函数显示原始图像和幂运算后的图像,并等待用户按键退出。通过以上步骤,你可以使用cv::pow函数来对图像矩阵中的每个元素进行幂运算,并避免溢出问题。
总结
幂律变换是一种有效的图像增强技术,可以通过调整幂指数𝛾来增强图像的对比度。
在OpenCV中,虽然没有直接提供幂律变换的函数,
但可以通过基本的数学运算和类型转换轻松实现这一变换。
这种方法特别适用于增强图像中的暗区域或亮区域,从而提高图像的整体对比度。

运行结果1

示例代码2

示例代码2下面是一个使用cv::pow函数来计算图像矩阵中每个元素的幂的示例代码

#include "pch.h"#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{// 读取图像Mat img = imread("1.png", IMREAD_COLOR);if (img.empty()){cerr << "无法加载图像,请检查文件路径是否正确。" << endl;return -1;}// 定义灰度矩阵Mat gray;cvtColor(img, gray, COLOR_BGR2GRAY);//转化为灰度图像// 定义目标矩阵Mat imgPowerLawTransformed;// 设置幂律变换的参数double power = 2; // 使图像变亮//此处数值为0.5 1.5等会报错,请勘探此问题// 应用幂律变换pow(gray, power, imgPowerLawTransformed);// 显示原始图像和变换后的图像namedWindow("源图像", WINDOW_NORMAL);imshow("源图像", img);namedWindow("灰度图像", WINDOW_NORMAL);imshow("灰度图像", gray);namedWindow("幂指化后图像", WINDOW_NORMAL);imshow("幂指化后图像", imgPowerLawTransformed);waitKey(0); // 等待按键退出return 0;
}//代码解释
1.读取图像:使用cv::imread读取输入图像,并确保它是灰度图像。
2.获取幂次方值:获取幂次方值。
3.创建输出图像:创建一个新的cv::Mat对象来存储幂运算后的结果。
4.应用幂运算:使用cv::pow函数对图像矩阵中的每个元素进行幂运算。
5.显示结果:使用cv::imshow函数显示原始图像和幂运算后的图像,并等待用户按键退出。//注意事项
1.数据类型:确保输入图像的数据类型适合进行幂运算。通常情况下,灰度图像的数据类型为CV_8U(无符号8位整型)。如果需要进行浮点数运算,可以将图像转换为CV_32F或CV_64F类型。
2.溢出问题:由于原始图像的数据类型为CV_8U,在进行幂运算时可能会发生溢出。为了避免溢出,可以在进行幂运算前将图像转换为浮点数类型,然后在计算完成后将结果转换回原来的类型。

运行结果2

补充示例原理

在OpenCV中,你可以使用cv::pow函数来计算图像矩阵中每个元素的幂。这个函数可以在OpenCV的core模块中找到,用于对矩阵中的每个元素进行幂运算。

cv::pow函数的基本语法如下:

void pow(InputArray src, double power, OutputArray dst);
参数说明:src:输入矩阵。
power:指数值。
dst:输出矩阵,与输入矩阵具有相同的大小和类型。使用cv::pow函数可以帮助你实现各种基于幂运算的图像处理任务,
例如对图像进行伽马校正或其他需要幂运算的图像增强技术。

示例:使用cv::pow进行图像处理

假设你想对图像进行伽马校正,这是一个常见的图像增强技术,可以通过调整图像的亮度和对比度来改善图像质量。伽马校正的基本公式是:

下面是一个使用cv::pow函数进行伽马校正的例子:

代码

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() 
{// 读取图像Mat img = imread("A1.jpeg", IMREAD_GRAYSCALE);if (img.empty()) {cerr << "无法加载图像,请检查文件路径是否正确。" << endl;return -1;}// 设置伽马值double gamma = 0.5; // 增加对比度double c = 1.0;     // 比例常数// 将图像转换为浮点类型Mat imgFloat;img.convertTo(imgFloat, CV_32F, c / 255.0);// 伽马校正Mat imgGammaCorrected;pow(imgFloat, gamma, imgGammaCorrected);imgGammaCorrected *= c * 255.0; // 调整亮度// 转换回8位图像imgGammaCorrected.convertTo(imgGammaCorrected, CV_8U);// 显示原始图像和伽马校正后的图像namedWindow("原图像", WINDOW_NORMAL);imshow("原图像", img);namedWindow("伽马校正后图像", WINDOW_NORMAL);imshow("伽马校正后图像", imgGammaCorrected);waitKey(0); // 等待按键退出return 0;
}在这个示例中,我们首先将图像转换为浮点类型,
然后使用cv::pow函数对图像进行伽马校正。
注意,伽马校正后的图像需要再次转换回8位整数类型,以便于显示或保存。如果你需要对图像进行其他基于幂运算的操作,
如对数变换等,也可以使用类似的方法。
对于对数变换,可以直接使用cv::log函数来计算自然对数,
然后再使用cv::pow来计算其他形式的幂运算。

运行结果

补充

convertTo函数详解

实验代码3


#include "pch.h"
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace cv;  //所有opencv类都在命名空间cv下
using namespace std;
//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 int main()
{Mat src;src = imread("018.jpeg");if(src.empty()) //检验是否成功导入数据;{cout<<"not open successed!" <<endl;return -1;}//namedWindow("input",0);namedWindow("原图", WINDOW_NORMAL);imshow("原图",src); // 显示输入的图像src;cvtColor(src, src, COLOR_RGB2GRAY);Mat grayimg;grayimg.create(src.size(),src.type()); //创建一个大小类型相同的图像矩阵序列,也可以用clone()函数;int height = src.rows;int width = src.cols;for(int i=0;i<height;i++)for(int j=0;j<width;j++){int gray = src.at<uchar>(i,j);grayimg.at<uchar>(i,j) = pow(gray, 0.5);//将灰度值开方;}normalize(grayimg,grayimg,0,255,NORM_MINMAX);//归一化,将数据归一到0-255之间;namedWindow("目标图像", WINDOW_NORMAL);imshow("目标图像",grayimg);//显示图像grayimg;waitKey(0);return 0;
}

运行结果3

这篇关于5.8幂律变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 - Kerberos的整合

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! Kerberos简介 之前非常担心的一件事就是如果有人拿到了hdfs超级管理员帐号,直接把数据rm -rf怎么办?有了Kerberos,就可以轻松防止这样的事情发生。Kerberos 协议实现了比“质询-响应”模式协议更高的安全性:第一,在身份验证过程中,所有的数据都使用不同的密码进行加密

【数字信号处理】一文讲清FFT(快速傅里叶变换)

目录 快速傅里叶变换(Fast Fourier Transform,FFT)FFT的背景快速傅里叶变换(Fast Fourier Transform,FFT)DFT的数学表达实际计算重要性和应用频谱泄露、频谱混叠奈奎斯特采样定理参考链接 快速傅里叶变换(Fast Fourier Transform,FFT) FFT的背景 1、为什么要时域→频域频率?50Hz+频率120Hz

傅里叶变换家族

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

齐次变换矩阵的原理与应用

齐次变换矩阵的原理与应用 通过齐次变换矩阵,可以描述机械臂末端执行器(法兰)在三维空间中的平移和旋转操作。该矩阵结合了旋转和平移信息,用于坐标变换。 1. 齐次变换矩阵的基本形式 一个齐次变换矩阵 T是一个 4x4 矩阵,表示刚体的旋转和平移: T = [ R t 0 1 ] = [ r 11 r 12 r 13 x r 21 r 22 r 23 y r 31 r 32 r 33 z 0

MATLAB分析图像的离散余弦变换(DCT)

1. MATLAB的介绍以及所需函数的说明:  1.1 MATLAB  MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks 公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设

PyTorch Demo-4 : 数据变换Transforms

Transforms的函数有很多,每次都是直接copy已有的代码,但是不知道具体是什么样子,在这里记录一下 Transforms常用方法的具体说明参考链接1,链接2,或者官方文档。 原始图像采用图像处理经典的Lena: Python代码 from PIL import Imagefrom torchvision import transforms as tfimport ma

【Get深一度】小波变换通俗解释 -算法与数学之美

链接:http://www.zhihu.com/question/22864189/answer/40772083 文章推荐人:杨晓东 从傅里叶变换到小波变换,并不是一个完全抽象的东西,可以讲得很形象。小波变换有着明确的物理意义,如果我们从它的提出时所面对的问题看起,可以整理出非常清晰的思路。     下面就按照傅里叶-->短时傅里叶变换-->小波变换的顺序,讲一下为什么会出现小波这个东

【Get深一度】信号处理(二)——傅里叶变换与傅里叶级数的区别与联系

1.傅里叶级数和傅里叶变换:  傅里叶级数对周期性现象做数学上的分析 傅里叶变换可以看作傅里叶级数的极限形式,也可以看作是对周期现象进行数学上的分析。 除此之外,傅里叶变换还是处理信号领域的一种很重要的算法。要想理解傅里叶变换算法的内涵,首先要了解傅里叶原理的内涵。 傅里叶原理表明:对于任何连续测量的数字信号,都可以用不同频率的正弦波信号的无限叠加来表示。     傅里叶变

【C】快速傅里叶变换(FFT)讲解及实现

引言基2FFT 1.引言 人类的求知欲是永无止境的,自1965年 T. W. Cooley 和 J. W. Tuky 在《Math. Computation, Vol, 19, 1965》发表了著名的《 An algorithm for the machine calculation of complex Fourier series 》,人们对 有关傅里叶变换的改进和创新就从未止步。1