Random Sprays Retinex 传统的图像增强算法RSR

文章目录

  • 前言
  • 1、Random Sprays Retinex 概况
  • 2、Random Sprays Retinex 具体实现
    • 2.1、喷雾的生成
    • 2.2、径向密度函数的确定
    • 2.3、像素的选择
    • 2.4、亮度的计算
    • 2.5、参数的调整
  • 3、Random Sprays Retinex 算法效果的表现
  • 4、Random Sprays Retinex 现存的问题


前言

  Random Spray Retinex 即 “随机喷雾Retinex” ,简称RSR。是一种基于 Retinex 理论的图像处理方法,它通过随机分布的像素喷雾来模拟图像的局部特性。
  该算法用2D像素喷雾(2-D pixel sprays)替换路径,通过调整喷雾密度,以控制RSR参数进行空间调查,进而通过用户面板测试验证其方法的性能优于原有基于路径的方法。


1、Random Sprays Retinex 概况

论文名称:
Random spray retinex A new retinex implementation to investigate the local properties of the model
作者:
Edoardo Provenzi, Massimo Fierro, Alessandro Rizzi, Luca De Carli, Davide Gadia, and Daniele Marini

  这篇论文提出了一种名为“随机喷雾Retinex”(Random Spray Retinex,简称RSR)的新实现方法,用于研究Retinex模型的局部特性,以解决传统基于路径的Retinex实现中存在的问题,如路径几何的强烈依赖性、高计算成本和采样噪声。RSR通过使用2D像素喷雾(pixel sprays)代替传统的路径(paths)来扫描图像中的色度信息。其通过基于定量测量的无监督方法完成参数的控制,以执行空间的调查。

2、Random Sprays Retinex 具体实现

2.1、喷雾的生成

  喷雾(spray)的生成作为RSR算法的一个关键步骤,涉及到在目标像素周围创建一个随机分布的像素集合,用于后续的光亮度值的计算。作为RSR方法中模拟局部颜色感知的基础,喷雾(spray)允许RSR算法在保持图像局部特性的同时,对图像进行全局的亮度和颜色调整。
①确定喷雾半径:
  为每个目标像素确定一个喷雾半径R,该半径定义了喷雾覆盖的区域大小。实践表明建议,喷雾半径选择为图像对角线长度的某个比例,以确保喷雾能够覆盖足够的周围像素。
②生成随机角度:
  对喷雾中的每个像素,生成一个随机角度θ。该角度决定了像素在喷雾中的位置。通常,角度是[0,2π]的均匀分布随机数。
③计算喷雾像素坐标:
x ′ = x + ρ ∗ c o s ( θ ) x' = x+ ρ * cos(\theta) x=x+ρcos(θ) y ′ = y + ρ ∗ s i n ( θ ) y' = y+ ρ * sin(\theta) y=y+ρsin(θ)
④调整径向密度:
  同时可以根据径向密度函数 f ( ρ ) f(ρ) f(ρ)调整喷雾中像素的密度。在计算坐标时,根据距离目标像素的距离来调整角度的采样密度。
x ′ = x + f ( ρ ) ∗ c o s ( θ ) x' = x+ f(ρ) * cos(\theta) x=x+f(ρ)cos(θ) y ′ = y + f ( ρ ) ∗ s i n ( θ ) y' = y+ f(ρ) * sin(\theta) y=y+f(ρ)sin(θ)
⑤限制喷雾范围:
  在实际应用中,喷雾中的像素坐标可能会超出图像边界。这时,为确保生成的坐标在图像的有效范围内,可将其限制在边界内,或简单地忽略这些界外坐标。
⑥生成喷雾集合:
  对于图像中的每个像素,重复上述步骤,即可生成一个喷雾的集合。

/**Creates random sprays that are used for determining the neighbourhood.创建用于确定邻域的随机喷雾。生成一组随机的喷雾点,以确定领域。通过这些随机的喷雾点,可以实现对图像的局部区域的采样。@param[in]	spraysCount Number of sprays to create.@param[in]	spraySize Size of individual spray in pixels.@return Returns the pointer to the created sprays.*/
cv::Point2i** CreateSprays(int spraysCount, int n, int R) {cv::RNG random;cv::Point2i** sprays = new cv::Point2i * [spraysCount];for (int i = 0; i < spraysCount; ++i) {sprays[i] = new cv::Point2i[n];for (int j = 0; j < n; ++j) {double angle = 2 * CV_PI * random.uniform(0.0, 1.0);double r = R * random.uniform(0.0, 1.0);sprays[i][j].x = r * cos(angle);sprays[i][j].y = r * sin(angle);}}return sprays;
}

2.2、径向密度函数的确定

  径向密度函数(radial density function)决定了喷雾(spray)中像素的分布密度,即随着距离目标像素(中心)的增加,喷雾中像素的密度该如何变化。当然,径向密度函数的选择和调整是一个迭代过程,需要结合理论和实验结果来不断优化。其目标是找到一个能够模拟人类视觉系统对颜色感知的局部性,同时在图像处理中产生自然和高质量的结果的函数。
①理解视觉距离效应:
  人类视觉系统(HVS)对周围环境的颜色感知随着距离的增加而减弱。即距离目标像素较近的区域对颜色感知的影响更大。
②选择基本函数:
  选择一个基本的数学函数来模拟距离的依赖性。常见的函数包括幂律函数(如 f ( ρ ) = ρ n f(ρ) = ρ^n f(ρ)=ρn,)、指数函数、对数函数或双曲函数等。
在这里插入图片描述
③调整函数参数:
  需要调整参数 n(或其他相关参数)以匹配人类视觉的特性。通常通过实验和用户反馈来完成。例如,如果 n 的值较大,喷雾在中心区域的密度会更高,可能导致过度的局部化效果;如果 n 的值较小,喷雾则更为分散,可能无法捕捉到足够的局部信息。
④进行实验测试:
  使用不同的径向密度函数对一组测试图像进行处理,并收集用户反馈或使用定量评估指标(如CIELab色差、结构相似性指数SSIM等)来评估图像质量。用户反馈可以通过问卷调查、评分系统等方式收集,而定量评估则可以通过计算处理前后图像的差异来实现。
⑤优化径向密度函数:
  分析测试结果,确定哪个径向密度函数提供了最佳的图像处理效果。其中可能涉及到对函数参数的微调,以找到最佳的局部化程度和全局一致性的平衡点。
⑥验证和应用:
  在确定最优的径向密度函数后,将其应用于实际的图像处理任务中。在应用过程中,可能需要进一步的验证和调整,以确保在不同类型和条件下的图像上都能获得满意的结果。

2.3、像素的选择

  在喷雾区域内,遍历所有像素,比较它们的强度值,找到具有最高强度值的像素,将作为局部亮度的参考。强度值通常是基于像素的RGB通道计算得出的,可以通过简单的加权平均或其他方法来计算。而后记录并更新最大强度值及其对应的像素坐标。

cv::Vec3d max = cv::Vec3d(0, 0, 0);for (int j = 0; j < n; ++j) {int newRow = row + sprays[selectedSpray][j].y;int newCol = col + sprays[selectedSpray][j].x;if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols) {cv::Vec3d& newPoint = input[newRow * cols + newCol];for (int k = 0; k < 3; ++k) {if (max[k] < newPoint[k]) {max[k] = newPoint[k];}}}
}

2.4、亮度的计算

  将喷雾中的最高像素值作为局部亮度的参考,基于Retinex理论(假设人类视觉系统通过比较局部区域的亮度来感知颜色)进行亮度的计算。其中使用最高强度像素的强度值 I m a x ( x , y ) Imax(x,y) Imax(x,y)来归一化目标像素的强度值,将强度值映射到一个标准化的区间 [0, 1] 。而根据Retinex理论,目标像素的亮度 L ( x , y ) L(x,y) L(x,y)计算则是: L ( x , y ) = I ( x , y ) / I m a x ( x , y ) L(x,y)=I(x,y)/Imax(x,y) L(x,y)=I(x,y)/Imax(x,y)

			finalPoint = cv::Vec3d(0, 0, 0);for (int i = 0; i < N; ++i) {int selectedSpray = random.uniform(0, spraysCount);cv::Vec3d max = cv::Vec3d(0, 0, 0);for (int j = 0; j < n; ++j) {int newRow = row + sprays[selectedSpray][j].y;int newCol = col + sprays[selectedSpray][j].x;if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols) {cv::Vec3d& newPoint = input[newRow * cols + newCol];for (int k = 0; k < 3; ++k) {if (max[k] < newPoint[k]) {max[k] = newPoint[k];}}}}for (int k = 0; k < 3; ++k) {finalPoint[k] += currentPoint[k] / max[k];}}finalPoint /= N;for (int i = 0; i < 3; ++i) {if (finalPoint[i] > 1) {finalPoint[i] = 1;}}

2.5、参数的调整

  在确定喷雾半径(R)、径向密度函数( f ( ρ ) f(ρ) f(ρ))、喷雾数量(N)以及每个喷雾中的像素数量(n)的参数范围后,采用所谓的无监督方法进行参数的调整,虽然可以在没有明确指导的情况下自动调整RSR算法的参数,以达到最佳的图像处理效果。但这种方法依赖于对大量图像的处理和评估,以及对用户反馈的分析,以确保参数调整能够满足实际应用的需求。(Emmm,好像就是暴力+运气?仅个人观点)

3、Random Sprays Retinex 算法效果的表现

  因为RSR算法减少了对路径几何形状的依赖,并且只需要进行比较和除法操作,所其实现速度比传统的路径实现方法更快。此外,由于RSR算法允许对喷雾的密度分布进行调整,这使得其能够更好地模拟人类视觉系统(HVS)的颜色感知特性。同时通过调整喷雾的密度和大小,其揭示了 Retinex 模型的不同局部过滤特性,从而在图像增强中实现更好的局部特性分析。
在这里插入图片描述

4、Random Sprays Retinex 现存的问题

①如何精确确定RSR参数与图像内容之间的关系,以便为不同大小的图像找到最佳的参数值,实现参数自适应。
②如何进行感知分析以判断输出图像的质量和符合人眼色彩感知,目前还没有普遍接受的感知度量标准来比较图像质量。

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

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

相关文章

C++面试宝典第24题:袋鼠过河

题目 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子。每隔一米就有一个桩子,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳得更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米;如果为0,就会陷进去无法…

代码中遇到的问题2

目录 记录: 好处&#xff1a; 问题一&#xff1a; 解答: 问题二: 解答: 常见类型问题: 记录: string connStr ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; 在代码中写上这段代码&#xff0c;将连接数据库的代码语句放到&#xff…

关于在微信小程序中使用taro + react-hook后销毁函数无法执行的问题

问题&#xff1a; 在 taro中使用navigageTo() 跳转路由后hook中useEffect 的return函数没有执行 没有执行return函数 框架版本&#xff1a; tarojs: 3.6 react: 18.0 原因&#xff1a; 使用navigateTo() 跳转路由的话并不会销毁页面和组件&#xff0c;会加入一…

性能优化-OpenCL运行时API介绍

「发表于知乎专栏《移动端算法优化》」 本文首先给出 OpenCL 运行时 API 的整体编程流程图&#xff0c;然后针对每一步介绍使用的运行时 API&#xff0c;讲解 API 参数&#xff0c;并给出编程运行实例。总结运行时 API 使用的注意事项。最后展示基于 OpenCL 的图像转置代码。在…

L1-093 猜帽子游戏(Java)

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子&#xff0c;有的是黑色的&#xff0c;有的是黄色的。每个人可以看到别人头上的帽子&#xff0c;但是看不到自己的。游戏开始后&#xff0c;每个人可以猜自己头上的帽子是什么颜色&#xff0c;或者可以弃权不猜。如果没有…

17β-Estradiol high sensitivity ELISA kit

高灵敏ELISA试剂盒&#xff0c;可检测到低至14 pg/ml的17β-雌二醇 雌二醇(estradiol) 是由卵巢内卵泡的颗粒细胞分泌的类固醇激素&#xff0c;是主要的雌激素&#xff0c;负责调节女性特征、附属性器官的成熟和月经-排卵周期&#xff0c;促进乳腺导管系统的产生&#xff0c;有…

JanusGraph图数据库的应用以及知识图谱技术介绍

目录 JanusGraph介绍 JanusGraph 的主要优势 JanusGraph的应用&#xff1a; JanusGraph 的行业应用&#xff1a; 架构概览 分布式技术应用 横向扩展能力 程序与janus的交互 Janus与图数据库相关概念 结构化存储 图结构存储 实体关系存储 知识存储技术 JanusGraph介…

软考案例分析题万金油汇总

目录 二、范围管理存在的问题 三、变更管理可能存在的问题 四、招标问题 五、风险管理可能存在的问题 六、采购管理中存在的问题 七、配置管理可能出现的问题 八、配置管理混乱和配置管理相关案例回答 九、项目收尾可能存在的问题 十、人力资源管理存在的问题 十一、…

【MySQL】体系结构

文章目录 体系结构图存储引擎查询建表语句查看当前数据库可支持的存储引擎InnoDB逻辑存储结构架构内存结构磁盘结构体系结构图 体系结构说明 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端…

【大数据精讲】全量同步与CDC增量同步方案对比

目录 背景 名词解释 问题与挑战 FlinkCDC DataX 工作原理 调度流程 五、DataX 3.0六大核心优势 性能优化 背景 名词解释 CDC CDC又称变更数据捕获&#xff08;Change Data Capture&#xff09;&#xff0c;开启cdc的源表在插入INSERT、更新UPDATE和删除DELETE活动时…

08-微服务Seata分布式事务使用

一、分布式事务简介 1.1 概念 事务ACID&#xff1a; A&#xff08;Atomic&#xff09;&#xff1a;原子性&#xff0c;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部不执行&#xff0c;不可能出现部分成功部分失 败的情况。 C&#xff08;Consistency&…

npm install运行报错npm ERR! gyp ERR! not ok问题解决

执行npm install的时候报错&#xff1a; npm ERR! path D:..\node_modules\\**node-sass** npm ERR! command failed ...npm ERR! gyp ERR! node -v v20.11.0 npm ERR! gyp ERR! node-gyp -v v3.8.0 npm ERR! gyp ERR! not ok根据报错信息&#xff0c;看出时node-sass运行出现…

写点东西《检查和更新NPM包》

写点东西《检查和更新NPM包》 检查和更新 NPM 包 TL;DR&#xff1b; 用于检查和更新软件包的 NPM 命令# [](#npm-outdated)npm outdatednpm updatenpm update --save-dev --savenpm update -g npm-check-updates 检查和更新软件包的命令npm install -g npm-check-updatesnpx np…

Idea Community社区版如何添加Run Dashboard

最近在学习spring cloud&#xff0c;跟着视频添加run dashboard&#xff0c;发现里面介绍的方法无法适用于idea community(社区版)。 然后自己研究了一下&#xff0c;成功添加&#xff0c;下面分享自己的方法。 如图&#xff0c;我的项目里添加了两个module&#xff0c;我想通…

kubeadm部署k8s1.27.2版本高可用集群(外部etcd集群带TLS认证)

文章目录 环境软件版本服务器系统初始化etcd 证书生成etcd集群部署负载均衡器部署部署k8s集群部署网络组件FAQ 环境 控制平面节点主机的配置最少是2C2G,否则kubeadm init的时候会报错 主机名IP组件系统os128192.168.177.128etcd、kube-apiserver、kube-controller-manager、k…

Cesium for Unity包无法加载

太上老君急急如律⚡令⚡ &#x1f959;关闭UnityHub&#x1f9c0;启动梯子&#x1f96a;cmd 启动UnityHub &#x1f959;关闭UnityHub &#x1f9c0;启动梯子 &#x1f96a;cmd 启动UnityHub 把批处理启动文件&#x1f448;中的exe的路径换成自己的安装目录&#xff01;保存…

前端项目对接protobufjs的时候,踩坑总结

Protobuf&#xff08;Protocol Buffers&#xff09;是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。在JS/TS项目中&#xff0c;使用WebSocket与Protobuf可以实现高效的通信和数据传输。protobufjs官方仓库:https://github.com/protobufjs/protobuf.js 安装pro…

SpringBoot-多数据源切换和事物处理(免费)

作者原始文章: SpringBoot-多数据源切换和事物处理 最新内容和改动请看上面的文章 安装 <dependency><groupId>com.gitee.huanminabc</groupId><artifactId>dynamic-datasource</artifactId><version>1.0.3-RELEASE</version> <…

算法训练day21Leetcode530二叉搜索树的最小绝对差501二叉搜索中的众数236二叉树最近公共祖先

530 二叉搜索树的最小绝对差 题目描述 https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/ 我的想法 中序遍历二叉树存入数组&#xff0c;再遍历数组求节点之间的最小差值 我的acm模式代码 #include <iostream> #include <vector&g…

几款提高开发效率的Idea 插件

1、ignore 开发代码过程中经常会有一些需要提交到代码仓库的文件&#xff0c;比如java文件生成的.class、.jar 等&#xff0c;如果将编译后的文件都提交到代码库那么代码库会很大&#xff0c;关键是没有必要。 这款插件就可以很方便的解决某类文件或者某个文件夹不需要提交到…