首页 > 编程语言 >Light Random Sprays Retinex 传统的图像增强算法LRSR

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

时间:2024-03-15 13:58:59浏览次数:22  
标签:Retinex LRSR 强度 Random 像素 cv 变化 图像增强

文章目录


前言

  Light Random Sprays Retinex, 即“光随机喷雾Retinex”,简称LRSR。作为一种改进的图像处理算法,旨在实现局部颜色恒定性和图像增强,同时解决原始随机喷雾Retinex(RSR)算法在降低噪声和计算成本方面的问题。
  该算法引入了一种新的噪声去除方法,使得可以使用更小尺寸的喷雾,从而降低了计算成本。同时通过插值技术进一步提高计算效率,保持了图像的感知质量。


1、Light Random Sprays Retinex 概况

论文名称:
Light Random Sprays Retinex: Exploiting the Noisy Illumination Estimation
作者:
Nikola Banić,Sven Lončarić

  “光随机喷雾Retinex”(Light Random Sprays Retinex,简称LRSR)的算法,基于Retinex模型(解释了人类视觉系统如何根据周围视觉场景感知颜色,即颜色感知的局部性),通过随机喷雾的方式来模拟像素邻域,计算新的像素强度,以实现动态范围压缩、颜色恒常性和颜色及亮度的再现。其与路径依赖的方法相比,LRSR算法减少了对路径几何形状的依赖,降低了计算成本,并减少了采样噪声。

2、Light Random Sprays Retinex 具体实现

2.1、噪声去除

  通过计算各通道每个像素的强度变化,并应用低通滤波器,以实现在显著改变图像亮度和颜色变化的前提下,有效减少噪声。
① 计算局部强度变化:
  对于每个像素,计算其在应用RSR算法后的强度变化,其通过比较原始图像和RSR处理后的图像的像素值来完成。强度变化即:I’(x,y,c)=I(x,y,c)-Irsr(x,y,c),其中,I(x,y,c)是原始图像的像素值,Irsr(x,y,c)是RSR处理后的像素值,c表示颜色通道。
② 可视化强度变化:
  计算得到的强度变化可以为每个颜色通道单独可视化,以便于观察噪声的分布和强度变化的模式。
③ 应用低通滤波器:
  噪声主要存在于图像中,但强度变化在空间上的变化是缓慢的。其意味着可以应用低通滤波器来平滑这些变化,从而减少噪声,而不会对图像的整体强度变化产生太大影响。
  低通滤波器可以采用平均核(averaging kernel)来实现,该核可对局部像素的强度变化进行平均。
  主要以卷积操作完成,即:I’’(x,y,c)=I’(x,y,c)*K(x,y,c),其中,I’’(x,y,c)是滤波后的强度变化,K(x,y,c)是平均核。
④ 结合滤波前后的强度变化:
  为了进一步去除噪声,该算法结合了滤波前后的强度变化。主要通过将滤波后的强度变化与原始图像的强度变化相结合来实现的,从而得到最终的噪声减少后的强度变化。
⑤ 应用最终的强度变化:
  最后,将减少噪声后的强度变化应用回原始图像,以生成最终的输出图像。对于每个像素,其在给定通道上的强度可以被输出图像的像素Ioutput(x,y,c)所表示。即:Ioutput(x,y,c)= I(x,y,c)+ I’’(x,y,c)

2.2、亮度调整

  通过分析和处理图像中的局部照明变化来实现图像的亮度调整。
① 计算局部强度变化:
  与噪声去除的步骤类似,即计算每个像素在应用RSR算法后的强度变化,其不仅反映了颜色的变化,也反映了亮度的调整。
② 局部照明估计:
  通过观察像素周围区域的颜色和亮度变化,来实现对其局部照明变化的估计。其主要以随机喷雾的方式来完成,喷雾代表了像素邻域。
③亮度调整因子计算:
  通过分析局部强度变化,算法可以确定每个像素的亮度调整因子。这个因子是一个标量值,表示相对于原始图像的亮度变化量。

2.3、插值技术

  在维持图像质量的同时,采用插值技术减少算法的计算量。
① 确定采样模式:
  通过设置行列步长,确定对应的采样模式,其定义了哪些像素直接被计算强度变化,哪些像素将通过插值来估计其强度变化。
② 计算直接采样像素:
  对于直接采样的像素,按照之前的步骤计算强度变化,包括RSR算法及噪声去除的步骤。
③ 插值未采样像素:
  对于未直接采样的像素,算法使用插值方法来估计它们的强度变化。主要有最近邻域插值、双线性插值、二三次插值等。
④ 最近邻域插值:
  采用最近邻域插值以简单高效估计未采样像素的强度变化,对于每个未采样的像素,找到最近距离的已计算像素,并直接使用该像素的强度变化。

3、Light Random Sprays Retinex源码

/**
	Performs image enhancement using the Light Random Sprays Algorithm on a given image for specified parameters.

	@param[in]	source The image to be enhanced.
	@param[out]	destination The resulting image.
	@param[in]	N Number of sprays to create.
	@param[in]	n Size of individual spray in pixels.
	@param[in]	inputKernelSize The size of the kernel for blurring the original image and the RSR resulting image.
	@param[in]	inputSigma The input kernel sigma when using Gaussian kernels. If set to 0, the averaging kernel is used.
	@param[in]	intensityChangeKernelSize The size of the kernel for blurring the intensity change.
	@param[in]	intensityChangeSigma The intensity change kernel sigma when using Gaussian kernels. If set to 0, the averaging kernel is used.
	@param[in]	rowsStep Rows counting step.
	@param[in]	colsStep Columns counting step.
	@param[in]	normalizeIntensityChange The flag indicating wheather to normalize the intensity change (i. e. to perform only chromatic adaptation) or not (i. e. to perform chromatic adaptation and brightness adjustment).
	@param[in]	upperBound Maximal value for a pixel channel.
 */
void PerformLightRandomSpraysRetinex(cv::Mat source, cv::Mat& destination, int N, int n, int inputKernelSize, double inputSigma, int intensityChangeKernelSize, double intensityChangeSigma, int rowsStep, int colsStep, bool normalizeIntensityChange, double upperBound) {

	cv::Mat inputSource;
	cv::Mat inputRetinex;
	cv::Mat retinex;

	//执行RSR算法
	PerformRandomSpraysRetinex(source, retinex, N, n, upperBound, rowsStep, colsStep);

	//将源图像和经过RSR算法处理后的图像转换为CV_64FC3类型,即64位浮点型,3通道,用于后续计算强度变化。
	source.convertTo(inputSource, CV_64FC3);
	retinex.convertTo(inputRetinex, CV_64FC3);

	//强度归一化处理
	if (normalizeIntensityChange) {
		cv::Mat illuminant;
		cv::divide(inputSource, inputRetinex, illuminant);
		std::vector<cv::Mat> illuminantChannels;

		split(illuminant, illuminantChannels);
		cv::Mat illuminantAverage = (illuminantChannels[0] + illuminantChannels[1] + illuminantChannels[2]) / 3;
		for (int i = 0; i < 3; ++i) {
			cv::divide(illuminantChannels[i], illuminantAverage, illuminantChannels[i]);
		}
		cv::merge(illuminantChannels, illuminant);

		inputSource = inputRetinex.mul(illuminant);
	}

	//应用低通滤波器 平滑强度变化 减少噪声
	if (inputKernelSize > 1) {
		if (inputSigma == 0.0) {
			cv::Mat averaging = cv::Mat::ones(inputKernelSize, inputKernelSize, CV_64FC1) / (double)(inputKernelSize * inputKernelSize);
			Filter64F(inputSource, inputSource, inputKernelSize);
			Filter64F(inputRetinex, inputRetinex, inputKernelSize);
		}
		else {
			GaussianBlur(inputSource, inputSource, cv::Size(inputKernelSize, inputKernelSize), inputSigma);
			GaussianBlur(inputRetinex, inputRetinex, cv::Size(inputKernelSize, inputKernelSize), inputSigma);
		}
	}

	//光照强度变化平滑
	cv::Mat illuminant;
	divide(inputSource, inputRetinex, illuminant);
	std::vector<cv::Mat> illuminantChannels;

	if (intensityChangeKernelSize > 1) {
		if (intensityChangeSigma == 0.0) {
			cv::Mat averaging = cv::Mat::ones(intensityChangeKernelSize, intensityChangeKernelSize, CV_64FC1) / (double)(intensityChangeKernelSize * intensityChangeKernelSize);
			Filter64F(illuminant, illuminant, intensityChangeKernelSize);
		}
		else {
			GaussianBlur(illuminant, illuminant, cv::Size(intensityChangeKernelSize, intensityChangeKernelSize), intensityChangeSigma);
		}
	}

	//通道处理 目标图像
	std::vector<cv::Mat> destinationChannels;
	split(source, destinationChannels);
	split(illuminant, illuminantChannels);
	for (int i = 0; i < (int)destinationChannels.size(); ++i) {
		destinationChannels[i].convertTo(destinationChannels[i], CV_64FC1);
		cv::divide(destinationChannels[i], illuminantChannels[i], destinationChannels[i]);
	}

	cv::merge(destinationChannels, destination);

	double* check = (double*)destination.data;
	for (int i = 0; i < destination.rows * destination.cols * 3; ++i) {
		if (check[i] >= upperBound) {
			check[i] = upperBound - 1;
		}
	}

	destination.convertTo(destination, source.type());

}

4、Light Random Sprays Retinex效果及结论

  LRSR算法在图像质量和计算效率方面均优于原始的Random Sprays Retinex (RSR) 算法。通过引入新的噪声去除方法和亮度调整技术,LRSR算法能够在降低计算成本的同时提供更高质量的图像增强结果。

在这里插入图片描述

标签:Retinex,LRSR,强度,Random,像素,cv,变化,图像增强
From: https://blog.csdn.net/Doctor__Chen/article/details/136737084

相关文章

  • 深度学习-卷积神经网络-dropout-图像增强-优化器-45
    目录1.dropout2.数据增强3.优化器1.dropout使用L1和L2正则去限制神经网络连接的weights权重在深度学习中,最流行的正则化技术,它被证明非常成功,即使在顶尖水准的神经网络中也可以带来1%到2%的准确度提升,这可能乍听起来不是特别多,但是如果模型已经有了95%的准确率,获......
  • 全流程机器视觉工程开发(三)任务前瞻 - 从opencv的安装编译说起,到图像增强和分割
    前言最近开始做这个裂缝识别的任务了,大大小小的问题我已经摸得差不多了,然后关于识别任务和分割任务我现在也弄的差不多了。现在开始做正式的业务,也就是我们说的裂缝识别的任务。作为前言,先来说说场景:现在相机返回过来的照片:都是jpeg格式的照片,当然也可能是别的格式,目前主流是......
  • 图像增强与预处理:提高图像识别模型的准确性
    1.背景介绍图像增强和预处理是计算机视觉领域中的重要研究方向,它们涉及到对输入图像进行各种操作,以提高图像识别模型的性能。图像增强通常包括对图像进行亮度、对比度、饱和度等方面的调整,以提高图像的质量。图像预处理则涉及到对图像进行各种转换,如灰度化、二值化、膨胀、腐蚀等,以......
  • 眼科图像增强
    目录一、问题描述二、思路设计三、结果展示一、问题描述图像名称效果图测试图像差评示例优秀示例参考眼科图像的测试图像和优秀增强图像,设计一个图像增强算法,实现:对测试图像进行增强,使眼球(包括眼黑和眼白)纹理更加清晰,同时避免失真和过曝问题......
  • 人体骨骼图像增强【分析+Python代码】
    目录一、设计思路二、实验结果分析三、补充讨论四、Python代码一、设计思路由于对于人体骨骼灰度图的动态范围计较窄,并且噪声比较大,单靠一种滤波或锐化算子无法较好的实现图像的细节增强。故通过设计一种混合的图像增强的方式如下图所示。根据上图可知,首先通过对原图像img做拉......
  • 软件构造实验二——图像增强与特效
    项目结构具体代码BaseConvert.java--将base64编码解码成我们能看懂的东西(功能)packagecom.example.testDong;importjava.io.*;importjava.util.Base64;publicclassBaseConvert{/***图片转化成base64字符串*@paramimgPath*@return*......
  • 【阅读笔记】图像增强-《Efficientcontrast enhancement using adaptive gamma correc
    2013年发表在TIP上的对比度增强算法AGCWD(Efficientcontrastenhancementusingadaptivegammacorrectionwithweightingdistribution)提出了一种自动映射技术,通过亮度像素的伽马校正和概率分布来提高调暗图像的亮度。为了增强视频,所提出的图像增强方法使用关于每帧之间差异的时......
  • 多尺度retinex图像去雾算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述      多尺度Retinex(MSR)图像去雾算法是一种基于Retinex理论的去雾算法。该算法通过在大、中、小三个尺度上计算图像的反射分量,并对其进行加权平均,从而消除雾气对图像的影响,提高图像的可视度......
  • 百度图像增强与特效相关功能总结
    了解百度图像增强与特效相关功能并进行总结(占20%)。图像增强功能:去噪处理: 提供去除图像中噪点的功能,使图像更清晰。锐化处理: 增强图像的边缘,使细节更加突出。亮度调整: 允许调整图像的亮度,以改善图像的整体可视效果。对比度调整: 提供对比度调整功能,增强图像中颜色的对比度。图......
  • 图像增强
    packagecom.example;importokhttp3.*;importorg.json.JSONException;importorg.json.JSONObject;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.File;importjava.io.IOException;publ......