Retinex图像增强

article/2025/11/7 15:18:10

Retinex是一种常用的建立在科学实验和科学分析基础上的图像增强方法。就跟Matlab是由Matrix和Laboratory合成的一样,Retinex也是由两个单词合成的一个词语,他们分别是retina 和cortex,即:视网膜和皮层。Land的retinex模式是建立在以下三个假设之上的:

真实世界是无颜色的,我们所感知的颜色是光与物质的相互作用的结果。我们见到的水是无色的,但是水膜—肥皂膜却是显现五彩缤纷,那是薄膜表面光干涉的结果。
每一颜色区域由给定波长的红、绿、蓝三原色构成的;
三原色决定了每个单位区域的颜色。
Retinex理论的基础理论是物体的颜色是由物体对长波(红色)、中波(绿色)、短波(蓝色)光线的反射能力来决定的,而不是由反射光强度的绝对值来决定的,物体的色彩不受光照非均匀性的影响,具有一致性,即retinex是以色感一致性(颜色恒常性)为基础的。不同于传统的线性、非线性的只能增强图像某一类特征的方法,Retinex可以在动态范围压缩、边缘增强和颜色恒常三个方面达到平衡,因此可以对各种不同类型的图像进行自适应的增强。


原理:

        

Retinex 理论的基本内容

物体的颜色是由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定的,而不是由反射光强度的绝对值决定的;
物体的色彩不受光照非均性的影响,具有一致性,
即Retinex理论是以色感一致性(颜色恒常性)为基础的。
如下图所示,观察者所看到的物体的图像S是由物体表面对入射光L反射得到的,反射率R由物体本身决定,不受入射光L变化。

基于Retinex的图像增强的目的就是从原始图像S中估计出光照L,从而分解出R,消除光照不均的影响,以改善图像的视觉效果,正如人类视觉系统那样。

在这里插入图片描述

Retinex理论,与降噪类似,该理论的关键就是合理地假设了图像的构成。如果将观察者看到的图像看成是一幅带有乘性噪声的图像,那么入射光的分量就是一种乘性的,相对均匀,且变换缓慢的噪声。Retinex算法所做的就是合理地估计图像中各个位置的噪声,并除去它。

在极端情况下,我们大可以认为整幅图像中的分量都是均匀的,那么最简单的估计照度L的方式就是在将图像变换到对数域后对整幅图像求均值。

                                                  Log[R(x,y)] = Log[S(x,y)]-Log[L(x,y)]; 

要求得R(x,y)只需得到L(x,y)即可,但是根据数学的理论,L(x,y)是不能够求得的,只能近似求出。我们用S(x,y)和一个高斯核的卷积来近似表示L(x,y)。所以R(x,y)可用下式表示:

                                                  Log(R(x,y))=(Log(S(x,y))-Log(S(x,y)*G(x,y))) 

由于R是对数域的输出,要转换为数字图像,必须将他们量化为[0,255]的数字图像范畴,所以要进行线性量化,于是就有了:(G和b)为经验参数

 再通过Simplest Color Balance方式,他把数据按照一定的百分比去除最小和最大的部分,然后中间的部分重新线性量化到0和255之间,因为如果直接对MSR处理的结果进行量化,得到的图像往往整体偏灰度,这是由于原始的彩色值经过log处理后的数据范围就比较小了,这样各通道之间的差异也很小,而之后的线性量化比log曲线要平滑很多,因此整体就丧失了彩色。 

        为此,研究者又开发出一种称之为带色彩恢复的多尺度视网膜增强算法(MSRCR,Multi-Scale Retinex with Color Restoration) ,具体讨论的过程详见 <A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes>这篇论文,但是论文里为了这个又引入了太多的可调参数,增加了算法的复杂性,不利于自动化实现。

    直接从量化的方式上入手,引入了均值和均方差的概念,再加上一个控制图像动态的参数来实现无色偏的调节过程,简要描述如下。

    (1)分别计算出 Log[R(x,y)]中R/G/B各通道数据的均值Mean和均方差Var(注意是均方差)。

    (2)利用类似下述公式计算各通道的Min和Max值。

            Min = Mean - Dynamic * Var;  

            Max = Mean + Dynamic * Var;
    (3)  对Log[R(x,y)]的每一个值Value,进行线性映射: 

           R(x,y) = ( Value - Min ) / (Max - Min) * (255-0) ,同时要注意增加一个溢出判断,即:

           if (R(x,y) > 255)  R(x,y) =255; else if (R(x,y) < 0) R(x,y)=0;

 

import cv2
import numpy as np
import mathdef replaceZeroes(data):min_nonzero = min(data[np.nonzero(data)])data[data == 0] = min_nonzeroreturn datadef simple_color_balance(input_img, s1, s2):h, w = input_img.shape[:2]out_img = np.zeros([h, w])sort_img = input_img.copy()one_dim_array = sort_img.flatten()  # 转化为一维数组sort_array = sorted(one_dim_array)  # 对一维数组按升序排序per1 = int((h * w) * s1 / 100)minvalue = sort_array[per1]per2 = int((h * w) * s2 / 100)maxvalue = sort_array[(h * w) - 1 - per2]# 实施简单白平衡算法if (maxvalue <= minvalue):for i in range(h):for j in range(w):out_img[i, j] = maxvalueelse:scale = 255.0 / (maxvalue - minvalue)for m in range(h):for n in range(w):if (input_img[m, n] < minvalue):out_img[m, n] = 0elif (input_img[m, n] > maxvalue):out_img[m, n] = 255else:out_img[m, n] = scale * (input_img[m, n] - minvalue)  # 映射中间段的图像像素out_img = cv2.convertScaleAbs(out_img)return out_img
def MSRCR(img, scales, s1, s2):h, w = img.shape[:2]# print(h, w)scles_size = len(scales)img = np.array(img, dtype=np.float64)# print(img)log_R = np.zeros((h, w), dtype=np.float64)img_sum = np.add(img[:,:,0],img[:,:,1],img[:,:,2])# print(img_sum)# print("11111111111111111111111111111111")img_sum = replaceZeroes(img_sum)# print(img_sum)gray_img = []for j in range(3):img[:, :, j] = replaceZeroes(img[:, :, j])for i in range(0, scles_size):L_blur = cv2.GaussianBlur(img[:, :, j], (scales[i], scales[i]), 0)L_blur = replaceZeroes(L_blur)dst_img = cv2.log(img[:, :, j])dst_Lblur = cv2.log(L_blur)# dst_ixl = cv2.multiply(dst_img, dst_Lblur)log_R += cv2.subtract(dst_img, dst_Lblur)# print(i)# print(scles_size)MSR = log_R / 3.0'''img_sum_log = np.zeros((h, w))for i in range(0, h):for k in range(0, w):img_sum_log[i,k] = 125.0*math.log(img[i,k,j]) - math.log(img_sum[i,k])MSRCR = MSR * (img_sum_log[:, :])print(img_sum)# x = cv2.log(img_sum)'''MSRCR = MSR * (cv2.log(125.0 * img[:, :, j]) - cv2.log(img_sum))gray = simple_color_balance(MSRCR, s1, s2)gray_img.append(gray)return gray_imgif __name__ == '__main__':scales = [15, 101, 301]s1, s2 = 2,3src_img = cv2.imread('4.jpg')src_img = cv2.cvtColor(src_img, cv2.COLOR_BGR2RGB)cv2.imshow('img', src_img)MSRCR_Out = MSRCR(src_img, scales, s1, s2)result = cv2.merge([MSRCR_Out[0], MSRCR_Out[1], MSRCR_Out[2]])cv2.imshow('MSR_result', result)cv2.waitKey(0)cv2.destroyAllWindows()


————————————————
版权声明:本文为CSDN博主「SongpingWang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

致谢:
https://blog.csdn.net/wsp_1138886114/article/details/83096109

带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用。 - Imageshop - 博客园 (cnblogs.com)

 

 


http://chatgpt.dhexx.cn/article/91sGaRUc.shtml

相关文章

图像处理:Retinex算法

目录 前言 概念介绍 Retinex算法理论 单尺度Retinex&#xff08;SSR&#xff09; 多尺度Retinex&#xff08;MSR&#xff09; 多尺度自适应增益Retinex&#xff08;MSRCR&#xff09; Opencv实现Retinex算法 SSR算法 MCR算法 MSRCR算法 效果展示 总结 参考文章 前…

Retinex

Retinex图像增强算法 前一段时间研究了一下图像增强算法&#xff0c;发现Retinex理论在彩色图像增强、图像去雾、彩色图像恢复方面拥有很好的效果&#xff0c;下面介绍一下我对该算法的理解。 Retinex理论 Retinex理论始于Land和McCann于20世纪60年代作出的一系列贡献,其基本思…

Retinex算法详解

Retinex是一种常用的建立在科学实验和科学分析基础上的图像增强方法&#xff0c;它是Edwin.H.Land于1963年提出的。就跟Matlab是由Matrix和Laboratory合成的一样&#xff0c;Retinex也是由两个单词合成的一个词语&#xff0c;他们分别是retina 和cortex&#xff0c;即&#xff…

关于Retinex理论的一些理解

目前一直在参与关于Retinex的相关课题&#xff0c;并完成了许多模型的构建&#xff0c;本文以个人的见解介绍Retinex的相关理论 1. 基本原理 Retinex理论是上世纪八十年代由land等人提出的算法。该理论认为人眼可以感知近似一致的色彩信息&#xff0c;这种性质称为色彩…

Retinex理解

Retinex是一种常用的建立在科学实验和科学分析基础上的图像增强方法,它是Edwin.H.Land于1963年提出的。就跟Matlab是由Matrix和Laboratory合成的一样,Retinex也是由两个单词合成的一个词语,他们分别是retina 和cortex,即:视网膜和皮层。Land的retinex模式是建立在以下三个…

Retinex理论,单尺度Retinex、多尺度Retinex(MSR)、带颜色恢复的多尺度 Retinex(MSRCR)原理

1、Retinex理论 Retinex 是两个单词合成的&#xff0c;它们分别是 retina &#xff08;视网膜&#xff09;和 cortex &#xff08;皮层&#xff09;&#xff0c;因此 Retinex 理论很多时候也被称为是视网膜皮层理论。 最初的基于 Retinex 理论的模型提出了一个人眼视觉系统 (…

图像增强算法Retinex原理与实现详解

文章目录 1. 引言2. Retinex算法原理2.1 单尺度Retinex示例代码 2.2 多尺度Retinex示例代码 2.3 颜色恢复示例代码 2.4 最终图像处理代码示例 3. Retinex算法的Python实现4. 完结 1. 引言 图像增强是图像处理中的重要技术之一&#xff0c;它可以改善图像的亮度、对比度和颜色等…

(学习笔记)图像处理——Retinex增强

文章目录 前言原理发展单尺度算法&#xff08;SSR&#xff09;多尺度算法&#xff08;MSR&#xff09;带有色彩恢复的多尺度 实现 前言 Retinex算法由Land于1986年在《An alternative technique for the computation of the designator in the retinex theory of color vision…

Retinex 算法

目录 1、Retinex 理论及数学模型 2、Retinex 算法发展历程 2.1 基于迭代的 Retinex 算法 2.1.1 Frankle-McCann Retinex 算法 2.1.2 McCann99 Retinex 算法 2.2 基于中心环绕的 Retinex 算法 2.2.1 SSR算法&#xff08;单尺度&#xff09; 2.2.2 MSR算法&#xff08;多…

分享一个免费巨好用的shell工具

finalshell 是国产的shell工具&#xff0c;免费&#xff0c;不过可以购买vip&#xff0c;vip功能就是机器进程管理&#xff0c;基本用不上&#xff0c;所以我们只用免费版 功能包含&#xff0c;服务器连接&#xff0c;服务器管理&#xff0c;上传文件&#xff0c;文件可视化操…

shell之常用小工具(sort、uniq、tr、cut)

目录 一、sort 排序 1、格式 2、常用选项 3、sort 例子 1、不加任何选项 如&#xff1a;sort /etc/passwd 2、 去重 &#xff08;sort -u&#xff09; 3、 指定分隔符&#xff08;-t&#xff09;&#xff0c;指定排序的列&#xff08;-k&#xff09;&#xff0c;升序排列…

shell之常用工具的使用

shell入门 文章目录 shell入门一、文本处理工具1. grep工具2. cut工具3. sort工具4.uniq工具5.tee工具6.diff工具7. paste工具8. tr工具二、bash的特性1 、常用的通配符2、bash中的引号&#xff08;重点&#xff09; 一、文本处理工具 1. grep工具 grep是行过滤工具&#xff…

shell工具finalShell

qitashell工具的不足 对于运维人员来说&#xff0c; 使用的最常用的远程终端连接工具无非就是crt或者Xshell, 而crt则需要破解才能使用&#xff0c; Xshell虽说可以免费使用&#xff0c; 但经常在启动的时候会要求你购买&#xff0c; 然后一直卡住不让你启动&#xff0c; 既耽…

shell学习☞shell工具

一、shell工具 1、cut[选项参数] filename&#xff1a;从文件的每一行剪切字解、字符和字段并将这些字节、字符和字段输 选项参数&#xff1a; -f&#xff1a;列号&#xff0c;提取第几列 -d&#xff1a;分隔符&#xff08;默认是制表符&#xff09;&#xff0c;按照指定的分…

惊艳!Linux 中迷人的 Shell 脚本工具

如果您是 Linux 操作系统爱好者或正在将自己定义为一个爱好者&#xff0c;那么与 shell 脚本交叉的路径是完全不可避免的。根据定义&#xff0c;shell 脚本是设计用于在 Unix/Linux shell 环境中执行的程序。 我们可以将命令行解释器 ( shell ) 与诸如打印文本、程序执行和文件…

2.shell工具与脚本

文章目录 一、bash 中的特殊变量二、变量赋值与访问三、其他类型的脚本四、查找文件findlocate 查找内容grep 查找 shell 命令tree broot 五、零碎知识点六、 shell工具 一、bash 中的特殊变量 $0 &#xff1a;脚本名 $1 -$9 :脚本的第1-9个参数 $ :脚本的所有参数 $# :参数个…

Linux---Shell(文本处理工具 和 Shell脚本)

目录 一、文本处理工具 1.1 grep 1.1.1 匹配行首 1.1.2 设置大小写 1.1.3 转义字符 1.2 sed 1.2.1 追加文件 1.2.2 删除文本 1.3 awk 1.3.1 关系表达式 二、Shell脚本 2.1 结构判断 2.2 循环结构 2.3 break 和 continue 2.4 Shell脚本的基本元素与执行方式 一、文…

shell

shell 什么是shell&#xff1a; 现在我们使用的操作系统&#xff08;Windows、Mac OS、Android、iOS等&#xff09;都是带图形界面的&#xff0c;简单直观&#xff0c;容易上手&#xff0c;对专业用户&#xff08;程序员、网管等&#xff09;和普通用户&#xff08;家庭主妇、…

shell的几种常用工具

最近在学习shell脚本语言&#xff0c;在学习的过程中了解了关于shell的几种常用工具&#xff0c;就总结了一下。 1、sort 功能&#xff1a;顾名思义&#xff0c;sort是对文本进行排序操作的。原则&#xff1a;sort将文件的每一行作为一个单位&#xff0c;相互比较&#xff0c…

Linux学习 -- Shell的工具

cutsedawksort Shell提供的工具可以帮助我们更快的完成需求操作。 一、cut 功能描述&#xff1a; cut的工作就是"剪"&#xff0c;具体是用来在文件中负责剪切数据。cut 命令从文件的每一行剪切字节、字符和字段并将这些文字、字符和字段输出。 基本用法&#xff1a; …