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( heta)

x′=x+ρ?cos(θ)

y

=

y

+

ρ

?

s

i

n

(

θ

)

y' = y+ ρ * sin( heta)

y′=y+ρ?sin(θ)
④调整径向密度:
??同时可以根据径向密度函数

f

(

ρ

)

f(ρ)

f(ρ)调整喷雾中像素的密度。在计算坐标时,根据距离目标像素的距离来调整角度的采样密度。

x

=

x

+

f

(

ρ

)

?

c

o

s

(

θ

)

x' = x+ f(ρ) * cos( heta)

x′=x+f(ρ)?cos(θ)

y

=

y

+

f

(

ρ

)

?

s

i

n

(

θ

)

y' = y+ f(ρ) * sin( heta)

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