5.8幂律变换

news2024/12/26 23:02:59

目录

示例代码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来计算其他形式的幂运算。

运行结果

补充

在OpenCV中,convertTo函数是一个非常有用的函数,它可以用来执行各种类型的数值转换和缩放操作。convertTo函数可以应用于矩阵(图像),并且能够执行基本的数学运算,比如缩放、偏移等。这对于调整图像的对比度和亮度特别有用。


convertTo函数的基本形式如下:
void convertTo(OutputArray r, int rtype, double alpha=1, double beta=0 ) const;

参数解释
dst: 目标矩阵。如果指定为None,则会自动创建一个新的矩阵。
rtype: 指定输出矩阵的数据类型(例如,cv2.CV_8U, cv2.CV_32F等)。
alpha: 缩放因子,用于调整图像的对比度。如果alpha > 1,则对比度增加;如果alpha < 1,则对比度减小。
beta: 偏移量,用于调整图像的亮度。如果beta > 0,则亮度增加;如果beta < 0,则亮度减小。
  

示例代码

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
	// 加载图像
	cv::Mat img = cv::imread("2B.png", cv::IMREAD_GRAYSCALE); // 读取为灰度图像

	if (img.empty())
	{
		std::cout << "Could not open or find the image" << std::endl;
		return -1;
	}

	// 定义变换参数
	double alpha = 1.5; // 对比度增加
	double beta = 10;   // 亮度增加

	// 创建一个空的输出图像
	cv::Mat output;

	// 使用convertTo函数调整图像
	img.convertTo(output, -1, alpha, beta);
//convertTo函数的第一个参数是输出图像,第二个参数-1表示保持输入图像的数据类型不变,第三个参数alpha是缩放因子,第四个参数beta是偏移量。

	//将输出图像转换回8位无符号整型
	//*************可需要 可不要
	//normalize(output, output, 0, 255, cv::NORM_MINMAX);//归一化,将数据归一到0-255之间;


	// 显示结果
	cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
	cv::imshow("Original Image", img);

	cv::namedWindow("Transformed Image", cv::WINDOW_NORMAL);
	cv::imshow("Transformed Image", output);

	cv::waitKey(0);

	return 0;
}

运行结果

实验代码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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集成电路学习:什么是MOSFET(MOS管)

一、MOSFET&#xff1a;MOS管 MOSFET&#xff0c;全称Metal-Oxide-Semiconductor Field-Effect Transistor&#xff0c;即金属-氧化物半导体场效应晶体管&#xff0c;也常被称为MOS管或金氧半场效晶体管。它是一种可以广泛使用在模拟电路与数字电路的场效应晶体管&#xff08;f…

【游戏安全】CheatEngine基础使用——如何对不同类型的数值进行搜索?如何破解数值加密找到想修改的数值?

游戏安全 不同数值类型的搜索破解简单数值加密 不同数值类型的搜索 可以在游戏中看到很精确的物品数量&#xff0c;但是在CE中却什么都扫不到。 这是因为他的数值类型可能并不是四字节的&#xff0c;在游戏中这个数值的机制是一个慢慢增长的数值&#xff0c;所以他很有可能是…

【重学 MySQL】八、MySQL 的演示使用和编码设置

【重学 MySQL】八、MySQL 的演示使用和编码设置 MySQL 的使用演示登录 MySQL查看所有数据库创建数据库使用数据库创建表插入数据查询数据删除表或数据库注意事项 MySQL 的编码设置查看 MySQL 支持的字符集和排序规则服务器级别的编码设置数据库级别的编码设置表级别的编码设置列…

Python3.8绿色便携版嵌入式版制作

Python 的绿色便携版有两种:官方 Embeddable 版本(嵌入式版);安装版制作的绿色版。Embeddable 版适用于需要将 Python 集成到其他应用程序或项目中的情况,它不包含图形界面的安装程序,只提供了 Python 解释器和必要的库文件。安装版包含了 Python 解释器、标准库和其他一些…

基于ssm+vue+uniapp的高校课堂教学管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

8. GIS数据分析师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

Ferrari求解四次方程

参考&#xff1a; 1&#xff09; https://proofwiki.org/wiki/Ferrari’s_Method#google_vignette 2&#xff09;https://blog.csdn.net/qq_25777815/article/details/85206702

【精彩回顾·成都】COC 成都阿里云 CMeet:AIGC 创新应用技术实践!

文章目录 前言一、活动介绍二、精彩分享内容及活动议程2.1、《COC 成都社区情况和活动介绍》2.2、《浅谈 AIGC 商业化》2.3、《通义大模型与 AI 技术在各行业领域的实践与探索》2.4、《话题一&#xff1a;AIGC 在内容创作领域的革新》2.5、《话题二&#xff1a;AIGC 在技术与工…

【ubuntu使用笔记】nvme磁盘挂载失败问题记录

no object for d-bus interface 问题 no object for d-bus interface 解决方法 systemctl --user restart gvfs-udisks2-volume-monitor文件格式错误 问题 解决方法 sudo ntfsfix /dev/nvme4 sudo mount /dev/nvme4 soft/

828华为云征文|基于Flexus X实例云服务器的实际场景-等保三级服务器设置

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面3️⃣mysql创建安全管理员、审计管理员✅解决方法增加安全管理员增加审计管理员账户❌问题描述✅解决方法 3️⃣linux登录失败问题❌问题描述✅解决方法 3️…

ARM N2微架构介绍

简介 之前在“ARM V2处理器微架构介绍”一文中介绍了面向服务器、云计算等应用的ARM V2处理器微架构&#xff0c;V系列具有更强性能&#xff0c;N系列强调性能和功耗等方向的平衡&#xff0c;本文就将介绍一下ARM N2处理器微架构相比较前代的一些提升。尽管ARM还具备一代N1/V1…

【论文阅读】CiteTracker: Correlating Image and Text for Visual Tracking

paper&#xff1a;NorahGreen/CiteTracker: [ICCV23] CiteTracker: Correlating Image and Text for Visual Tracking (github.com) code&#xff1a;NorahGreen/CiteTracker: [ICCV23] CiteTracker: Correlating Image and Text for Visual Tracking (github.com) 简介 现有…

我与Linux的爱恋:Linux的基本指令

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 Linux的指令介绍 1.1 pwd pwd用来查看当前目录 1.2 ls指令 ls[选项][目录或文件] 对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息 -a 列出目录下的所有文件,包括以 …

对一个已经运行的LabVIEW VI进行控制

要对一个已经运行的LabVIEW VI进行控制&#xff0c;可以采用多种方法&#xff0c;这取决于你想要控制的内容以及具体的应用场景。以下是几种常见的实现方式&#xff1a; 1. 使用全局变量或功能全局变量&#xff08;FGV&#xff09; 方法: 你可以创建全局变量或功能全局变量&am…

【揭秘】AdaBoost:那些年,我们一起追过的算法

在往期文章机器学习进阶之路&#xff1a;集成学习带你走向巅峰和揭秘Bagging与随机森林&#xff1a;构建更强大预测模型的秘密中&#xff0c;我们总结了集成学习的原理&#xff0c;并展开介绍了集成学习中Bagging和随机森林这一分枝算法&#xff0c;在本篇博客中&#xff0c;我…

BUUCTF—[BJDCTF2020]The mystery of ip

题解 打开环境点击上面的flag可以看到这个IP页面。 抓个包看看有啥东西无&#xff0c;可以看到在返回包有IP。 看到IP就想到X-Forwarded-For这个玩意&#xff0c;我们用X-Forwarded-For随便添加个IP看看。可以看到返回的IP内容变成了123。 X-Forwarded-For:123 推测它会输出我…

Java-数据结构-ArrayList-练习 ψ(*`ー´)ψ

目录&#xff1a; 一、练习一(删除str1中str2出现的元素)&#xff1a; 二、练习二&#xff08;杨辉三角&#xff09;&#xff1a; 三、练习三&#xff08;简单的洗牌算法&#xff09;&#xff1a; 总结&#xff1a; 一、练习一(删除str1中str2出现的元素)&#xff1a; 我们…

Apple 重發iOS 17.6.1 修正版

蘋果又再次替 iPhone 和 iPad 用戶釋出 iOS 17.6.1更新&#xff08;21G101&#xff09;&#xff0c;這次更新與8日所推出的 iOS 17.6.1 正式版相同&#xff0c;官方在更新說明內也沒有提到任何修改&#xff0c;依舊是維持修正進階資料保護的問題 iOS 17.6.1 更新修正版內容重點…

JavaEE-HTTPHTTPS

目录 HTTP协议 一、概念 二、http协议格式 http请求报文 http响应报文 URL格式 三、认识方法 四、认识报头 HTTP响应中的信息 HTTPS协议 对称加密 非对称加密 中间人攻击 解决中间人攻击 HTTP协议 一、概念 HTTP (全称为 "超⽂本传输协议") 是⼀种应⽤…

深度学习应用 - 自然语言处理(NLP)篇

序言 在信息技术的浩瀚星空中&#xff0c;深度学习犹如一颗璀璨的新星&#xff0c;正引领着人工智能领域的深刻变革。作为这一领域的核心分支&#xff0c;自然语言处理&#xff08; NLP \text{NLP} NLP&#xff09;更是借助深度学习的力量&#xff0c;实现了前所未有的飞跃。自…