OpenCVForUnity(六)图像的对比度和亮度

news2024/11/26 4:36:47

文章目录

  • 前言
  • 公式讲解
  • Unity嵌套循环实现
  • 使用convertTo实现
  • 亮度和对比度调整:
  • 伽马矫正


前言

图片处理中这也是非常常用的功能,下面我们一起来学习一下如何在OpenCVForUnity中修改图像的对比度亮度
图像处理中的常见算子可以将一个或多个输入图像转换为输出图像。这些变换包括点运算符(也称像素变换)和邻域运算符。
像素变换仅取决于相应的输入像素值,例如亮度、对比度和颜色的调整。其中两个常见的点处理运算符是加法和乘法。


公式讲解

一点处理是乘法和加法:
在这里插入图片描述

二参数和\bate通常称为增益和篇章参数;有时候这些参数被分别控制对比度和亮度. α>β
可以视作为源像素, g(x)作为输出图像像素.表达式为 f(x)g(x)
在这里插入图片描述

j表示第i行和第j列.


Unity嵌套循环实现

下面我们用C#在Unity中实现一下,我们使用Imgcodecs加载完图片后,套用上面的公式使用循环嵌套实现一下,代码如下:

//参数α 和 β
float alpha = 2f;
float beta = 0;
//读取图片
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/timg.jpg";
Mat image = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
Mat new_image = new Mat(image.size(), CvType.CV_8UC3);

//三层嵌套结构
for (int rows = 0; rows < image.rows(); rows++)
{
    for (int cols = 0; cols < image.cols(); cols++)
    {
        double[] cur = image.get(rows, cols);
        for (int c = 0; c < cur.Length; c++)
        {
            cur[c] = (alpha * cur[c]) + beta;
        }
        new_image.put(rows, cols, cur);
    }
}
//下面是把两个Mat图片内容展示出来的代码,此处略...

下面看下效果:
在这里插入图片描述
我们能看到,在读取图片后有个三层嵌套循环。一、循环 每一行里的每一列中的每个通道进行计算。
如果只用上面的方式,那就太低效了.于是OpenCV为我们内置了 convertTo 方法.
将有效地执行 new_image = a * image + beta 。但是,我们想告诉你如何访问每个像素。
在任何情况下,两种方法都给出相同的结果,但是convertTo是更优化的,并且工作得更快。


使用convertTo实现

//参数α 和 β
float alpha = 2f;
float beta = 0;
//读取图片
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/timg.jpg";
Mat image = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
Mat new_image = new Mat(image.size(), CvType.CV_8UC3);
image.convertTo(new_image,-1,alpha,beta);

这个与上面的是等效的,这样代码看起来简洁多了,而且更高效。


亮度和对比度调整:

在图像处理中, 通过增加或减少每个像素的常量值来进行亮度和对比度的调整。如果像素值超过0到255的范围,则会被剪裁到该范围内。
在这里插入图片描述
直方图是显示每个颜色级别的像素数量的图表。当添加恒定偏差时,直方图将会向右移动,因为每个像素都添加了固定的偏差。水平参数(alpha)会影响颜色级别的分布。如果alpha小于1,则颜色级别将被压缩,导致对比度减小的图像。
在这里插入图片描述
这些直方图是使用Gimp软件中的“亮度 - 对比度”工具获得的。亮度调整工具与偏置参数类似,但似乎对比度调整工具中的alpha增益不同,输出范围似乎以Gimp为中心(即先前直方图的图形显示)。使用偏置调整可以提高图像的亮度,但是会导致轻微的模糊,对比度下降。增加alpha增益可以降低此效果,但是饱和会导致一些明亮区域的细节丢失。因而我们需要使用伽马矫正技术。


伽马矫正

伽马校正可以用于校正图像的亮度。这是通过对输入值和映射的输出值之间进行非线性变换来实现的。
在这里插入图片描述
当,原始的暗区域会更亮,直方图将向右移动,而\ gamma> 1则会相反。γ<1γ>1

更正曝光不足的图像
在这里插入图片描述
整体亮度得到了改善,但是由于数码饱和的原因,可以看到云层已经非常亮了(即在拍摄时被剪辑掉了)。
以下图像已更正:。γ=0.4
在这里插入图片描述
伽马校正比以前的方法更倾向于减少饱和效应,因为映射是非线性的,并且没有像以前的方法那样的数字饱和。
在这里插入图片描述
左:直方图alpha,β校正; 中心:原始图像的直方图; 右:伽马校正后的直方图


上图比较了三个图像的直方图,可以看到大多数像素值位于原始图像的直方图的较低部分。
在通过其他方法进行调整后,我们可以看到在255的位置有一个高峰,这是由于数码饱和和右侧的偏移所致。
在使用伽马校正后,直方图向右移动,但是暗区域中的像素比明亮区域中的像素更大偏移(参见伽马曲线图)。
这些都是基本技术,不能完全替代光栅图形编辑器。

以下是实现代码:

// 读取图像
Texture2D inputTexture = (Texture2D)Resources.Load("88");
// 将纹理转换为OpenCV Mat对象
Mat inputMat = new Mat(inputTexture.height, inputTexture.width, CvType.CV_8UC4);
Utils.texture2DToMat(inputTexture, inputMat, true);
// 应用gamma矫正
double gamma = 1.5;
Core.pow(inputMat, gamma, inputMat);
// 调整图像亮度
double alpha = 100.0;
double beta = 50.0;
Core.convertScaleAbs(inputMat, inputMat, alpha, beta);
// 将Mat对象转换回Unity Texture2D对象
Texture2D outputTexture = new Texture2D(inputMat.cols(), inputMat.rows(), TextureFormat.RGBA32, false);
Utils.matToTexture2D(inputMat, outputTexture);
// 在Unity中显示
objA.GetComponent<Renderer>().material.mainTexture = inputTexture;
objB.GetComponent<Renderer>().material.mainTexture = outputTexture;

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

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

相关文章

tdengine超级表创建

tdengine有官网文档&#xff0c;这里就把实际使用的SQL贴出来吧。 创建超级表&#xff1a; CREATE STABLE superTable(time TIMESTAMP, val double) TAGS (point varchar(100));执行SQL后会创建一个叫superTable的超级表。 建完超级表后再创建子表&#xff0c;SQL如下&#…

8、PHP访问权限配置与报错处理:You don‘t have permission to access this resource.

这是由于阿帕奇服务器的权限设置导致的。 解决办法&#xff1a; 1、由于我们之前已经设置了虚拟主机&#xff0c;我们在WAMPserver中&#xff0c;找到添加虚拟主机的配置文件的路径 2、打开这个文件&#xff0c;修改相应的虚拟主机的访问权限&#xff0c;Require后面改为all …

Cesium Terrain Builder (CTB) 简单使用_地形切片

Cesium Terrain Builder (CTB) 简单使用_地形切片 目录 Cesium Terrain Builder (CTB) 简单使用_地形切片 官网地址&#xff1a; winr&#xff08;cmd&#xff09;打开命令提示符工具运行&#xff1a; Create a GDAL Virtual Dataset (optional) Create Cesium Terrain fi…

CentOS系统下Docker安装部署Strapi

Nodejs 16 安装 移除旧版本的 node yum remove -y nodejs npm使用以下命令将存储库添加到系统 curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -配置存储库之后可以安装 yum install -y nodejs查看版本 node -v下载 yarn 包管理 curl -sL https://dl.yar…

数字化时代,智能文件工具让办公升级

无论是在办公室还是在学校&#xff0c;文件管理是我们日常工作中不可或缺的一环。传统的文件整理方式可能需要花费大量的时间和精力&#xff0c;而且常常容易出现混乱和遗漏。然而&#xff0c;随着科技的不断进步&#xff0c;我们现在有幸生活在一个数字化时代&#xff0c;因此…

ELK(elasticsearch+logstash+kibana+beats)

什么是ELK Elasticsearch&#xff1a;Elasticsearch&#xff08;以下简称ES&#xff09; 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够解决不断涌现出的各种用例。 ES是 Elastic Stack 的核心&#xff0c;采用集中式数据存储&#xff0c;可以通过机器学习来…

ylb-接口2首页产品数据和接口3产品列表

总览&#xff1a; 1、service处理&#xff08;分页查询&#xff09; 在api模块下service包&#xff0c;创建一个产品接口ProductService&#xff1a;&#xff08;目前方法为分页查询queryByTypeLimit(Integer pType,Integer pageNo,Integer pageSize)&#xff09; package…

如何破解中小企业数字化转型难点?建议来了!

打开任何一个搜索引擎&#xff0c;只要输入“中小企业数字化转型”&#xff0c;关于痛点、难处的文章就会铺面而来&#xff0c;难在哪里&#xff0c;其实很好解答&#xff0c;关键在于&#xff0c;如何解决这一个个难处。 PS&#xff1a;给大家整理了一份完整版的《中小企业如…

物理层 ———— 奈氏准则 香农定理

1. 失真的现象----码间串扰 2.奈氏准则 eg: 3.香农定理 eg: 3.两个准则的比较

excel表格设置下拉选项

excel表格设置下拉选项 最后保存&#xff0c;即可设置完成。

RAM Failed to establish a new connection: [Errno 11001] getaddrinfo failed

在跑RAM(​Recognize Anything Model​)的时候报了一个错: Failed to establish a new connection: [Errno 11001] getaddrinfo failed ① 没有帮助我解决&#xff0c;对大家可能有用&#xff1a; 查到别人的解决方案是&#xff1a; 开放C:\Windows\System32\drivers\etc\hos…

和chatgpt学架构02-环境搭建

目录 1 安装vs code2 vs code功能介绍3 安装nodejs4 安装vue5 在vs code打开工程总结 我们在上一篇 技术选型 里咨询了chatgpt前后端的框架选择和数据库的选择。有了框架之后就需要选择合适的开发工具了&#xff0c;继续咨询一下chatgpt 我现在选型&#xff0c;前端使用vue&am…

Kubernetes集群故障排查—审计

Kubernetes 审计&#xff08;Auditing&#xff09; 功能提供了与安全相关的、按时间顺序排列的记录集&#xff0c; 记录每个用户、使用 Kubernetes API 的应用以及控制面自身引发的活动。 审计功能使得集群管理员能够回答以下问题&#xff1a; 发生了什么&#xff1f;什么时候…

跨文化合作:如何解决海外网红营销中的文化差异?

随着社交媒体的快速发展&#xff0c;海外网红营销已成为许多品牌和企业获取国际市场的有效方式。然而&#xff0c;由于不同国家和地区存在着独特的文化差异&#xff0c;如语言、价值观、习俗等&#xff0c;这也给品牌进行海外网红营销带来了一系列挑战。本文Nox聚星将和大家探讨…

linux主机上面使用kubectl连接 Kubernetes 集群

**kubectl连接Kubernetes集群&#xff0c;应用场景在一台linux主机上面可以使用kubectl命令查看k8s集群信息。 1、首先需要在linux或者debain上安装kubectl命令。 官网安装地址&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/#install-kubec…

什么是70v转12v芯片?

问&#xff1a;什么是70v转12v芯片&#xff1f; 答&#xff1a;70v转12v芯片是一种电子器件&#xff0c;其功能是将输入电压范围在9v至100v之间的电源转换为稳定的12v输出电压。这种芯片通常被用于充电器、车载电池充电器和电源适配器等设备中。 问&#xff1a;这种芯片的最大…

回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于ELM-Adaboost极限学…

Flink-端到端精确一次(End-To-End Exactly-Once)

1.总结 目的&#xff1a;想要在故障恢复后不丢数据 输入端 保证可以重复发送数据如果是kafka&#xff0c;Flink负责维护offset&#xff0c;不用kafka维护设置kafka的隔离级别为&#xff1a;读已提交flink 开启检查点采用对齐或者不对齐的精确一次输出端 kafka 幂等事务两阶段…

让你不再疑惑加水印用什么软件

每个人都有自己的独特创意和作品&#xff0c;而在现今互联网时代&#xff0c;分享和传播作品已成为一种普遍现象。然而&#xff0c;随着互联网的发展&#xff0c;越来越多的作品被人恶意盗用和复制&#xff0c;使得原创作者的权益受到了侵害。为了保护自己的作品&#xff0c;加…

每天一道大厂SQL题【Day27】脉脉真题实战(三)连续两天活跃用户

文章目录 每天一道大厂SQL题【Day27】脉脉真题实战(三)连续两天活跃用户每日语录第26题 中级题: 活跃时长的均值1. 需求列表思路分析 答案获取加技术群讨论附表文末SQL小技巧 后记 每天一道大厂SQL题【Day27】脉脉真题实战(三)连续两天活跃用户 大家好&#xff0c;我是Maynor。…