Retinex图像增强算法——SSR,MSR,MSRCR,MSRCP,autoMSRCR

article/2025/11/7 15:15:00

系列文章目录

关于OpenCV的一些图像处理函数
图象基本操作(读取、显示、通道提取、边界填充、融合、保存)
Retinex图像增强算法——SSR,MSR,MSRCR,MSRCP,autoMSRCR


文章目录

  • 系列文章目录
  • 前言
  • 一、Retinex理论
  • 二、算法目的:
  • 三、Retinex基础算法
  • 四、算法介绍及流程
    • 4.1 SSR算法介绍
    • 4.2 SSR操作流程
    • 4.3 MSR算法介绍
    • 4.4 MSR操作流程
    • 4.5 MSRCR算法介绍
    • 4.6 MSRCR操作流程
    • 4.7 MSRCP算法介绍
    • 4.8 MSRCP操作流程
    • 4.9 automatedMSRCR算法
    • 4.10 automatedMSRCR算法流程
    • 4.11 线性量化公式
    • 4.12 自动色阶平衡
    • 总代码
  • 五、结果分析
  • 总结


前言

其实这是我的数字图像分析与处理的大作业。


一、Retinex理论

始于Edwin Herbert Land(埃德温·赫伯特·兰德)于1971年提出的一种被称为色彩恒常的理论,并基于此理论的图像增强方法。Retinex 这个词由视网膜(Retina)和大脑皮层(Cortex)合成而来.之所以这样设计,表明Land他也不清楚视觉系统的特性究竟取决于此两个生理结构中的哪一个,抑或两者都有关系。其基本思想是人感知到某点的颜色和亮度不仅仅取决于该点进入人眼的绝对光线,还和周围的颜色和亮度有关。不同于传统的图像增强算法,如线性、非线性变换、图像锐化等只能增强图像的某一类特征,如压缩图像的动态范围,或增强图像的边缘等,Retinex可以在动态范围压缩、边缘增强和颜色恒常三方面达到平衡,可以对各种不同类型的图像进行自适应性地增强,在很多方面得到了广泛的应用。
Retinex理论的基本内容是物体的颜色是由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定的,而不是由反射光强度的绝对值决定的;物体的色彩不受光照非均性的影响,具有一致性,即Retinex理论是以色感一致性(颜色恒常性)为基础的。如下图所示,观察者所看到的物体的图像S是由物体表面对入射光L反射得到的,反射率R由物体本身决定,不受入射光L变化。40多年来,研究人员模仿人类视觉系统发展了Retinex算法,从单尺度Retinex算法,MSR改进成多尺度加权平均的MSR算法,再发展成彩色恢复多尺度MSRCR算法和色彩增益加权的AutoMSRCR算法。

二、算法目的:

去除环境照度,抽取反射光,从而得到物体真实图像。更好的利用图像中的原像素点去估计原始照度。解决由环境等因素影响导致对比度不足、细节不充分、色彩偏差、噪声过大等问题。

三、Retinex基础算法

如下图所示,图像可以看做是由入射图像和反射图像构成,入射光照射在反射物体上,通过反射物体的反射形成反射光进入人眼,就是人类所看到的图像。最后形成的图像可以用公式表示为:S(x,y)=R(x,y)L(x,y)
在这里插入图片描述

其中,L(x,y)表示亮度分量,R(x,y)表示物体反射分量,S(x,y)表示观测到的图像S(x,y)表示观测到的图像。Retinex理论的基本思想就是在原始图像中,通过某种方法去除或者降低入射图像的影响,从而尽量的保留物体本质的反射属性图像。其一般的处理过程如下所示:
在这里插入图片描述
Retinex理论增强算法的思想就是利用式S(x,y)=R(x,y)L(x,y),去除亮度分量 L求得反射分量R,从而达到图像增强效果。两边取对数

**log(S(x,y))=log(L(x,y))+log(R(x,y))**
**log(R(x,y))=log(S(x,y))-log(L(x,y))**

由上面两个公式可知,只需要估计亮度分量L就能求得反射分量,因此L的估计直接决定图像恢复效果.Jobson等论证了高斯卷积函数可以从已知图像SS中更好地估计出亮度分量,即L(x,y)=S(x,y)G(x,y)
其中‘
’代表卷积操作,高斯函数G(x,y)=k⋅exp(-(x2+y2)/σ^2 ),σ是高斯函数尺度参数,k为归一化因子,使∬G(x,y)dxdy=1。

四、算法介绍及流程

4.1 SSR算法介绍

SSR(Single Scale Retinex)的思想:在原始图像中,通过某种办法抑制入射图像L的影响,尽可能保留反映物体本质特征的反射属性。
 SSR假设原始图像中光照图像是缓慢变换的,即入射图像L可以看做图像的低频成分(使用高斯低通滤波将低频成分滤出)。用原始图像减去入射图像即可得到表明图像内在属性的发射图像。公式可参考上面介绍。

4.2 SSR操作流程

1.将图像进行log变换。
2.然后将log图像进行高斯模糊 (即得到低频成分),也就是求出L(x,y)=S(x,y)*G(x,y)。
3.利用原图和模糊之后的log图像做差分,也就是得到log(R(x,y))=log(S(x,y))-log(L(x,y)),求出物体SSR图像R。
4. 将R数据放缩到0-255,转为jpg图片格式,即为MSR图像。(这个步骤只是为了显示图像,后面其他算法调用此函数没有放缩这一步骤。)

4.3 MSR算法介绍

MSR(Multi Scale Retinex)是在SSR基础上发展来的,优点是可以同时保持图像高保真度与对图像的动态范围进行压缩的同时,MSR也可实现色彩增强、颜色恒常性、局部动态范围压缩、全局动态范围压缩,也可以用于X光图像增强。多尺度增强算法MSR(Multi-Scale Retinex)最为经典的就是3尺度的,大、中、小,既能实现图像动态范围的压缩,又能保持色感的一致性较好。在SSR基础上改进,能够保持图像的高保真度和对图像的动态范围进行压缩。其实就是将多个SSR做平均,区别在于高斯模糊部分选择了不同的sigma。公式如下:

log(R(x,y))=Weight1⋅log(Rσ1(x,y))+Weight2⋅log(Rσ2(x,y))+Weight3⋅log(Rσ3(x,y))

4.4 MSR操作流程

1.对原始图像R、G、B三个维度分别进行三次不同sigma参数的SSR操作。
2.高斯模糊选择15,80,200作为高斯模糊sigma参数。
3.对三次的SSR结果加权求平均,然后把三个维度合并,得到R。
4.将R数据放缩到0-255,转为jpg图片格式,即为MSR图像。

4.5 MSRCR算法介绍

由于R是对数域的输出,要转换为数字图像,必须将他们量化为[0,255]的数字图像范畴,关于这个量化的算法,有这极为重要的意义,他的好坏直接决定了最终输出的图像的品质。在前面的增强过程中,图像也可能会因为增加了噪声,而使得图像的局部细节色彩失真,不能显现出物体的真正颜色,整体视觉效果变差。针对这一点不足,MSRCR(Multi-Scale Retinex with Color Restoration)在MSR的基础上,加入了色彩恢复因子C来调节由于图像局部区域对比度增强而导致颜色失真的缺陷,从而把相对较暗区域的信息凸显出来,达到了消除图像色彩失真的缺陷。处理后的图像局部对比度提高,亮度与真实场景相似,在人们视觉感知下,图像显得更加逼真,但是MSRCR算法处理图像后,像素值一般会出现负值。所以从对数域r(x, y)转换为实数域R(x, y)后,需要通过改变增益G,偏差b对图像进行修正。
在这里插入图片描述

I(x,y)表示第i个通道的图像,C_i表示第i个通道的彩色回复因子,用来调节3个通道颜色的比例,f(·)表示颜色空间的映射函数,β是增益常数,α是受控制的非线性强度,G和b为经验参数。

4.6 MSRCR操作流程

1.使用高斯函数对原始图像进行低通滤波。
2.将原始图像与滤波后图像转换到对数域做差(即将图像中的低频成分减掉),得到对数域的反射图像。
3.多尺度重复1,2步骤,将对数域的反射图像在像素层面上进行图像求和(即MSR的步骤),得到MSR结果。
4.在通道层面,对原始图像求和,作为各个通道的归一化因子,权重矩阵归一化,并转换到对数域,得到图像颜色增益,MSR结果按照权重矩阵与颜色增益重新组合(连乘)。
5.图像恢复:颜色恢复后的图像乘以图像像素值改变范围的增益,加图像像素值改变范围的偏移量,通过色阶自动平衡得到最终结果。

4.7 MSRCP算法介绍

对于一些原始图像HUE较为合理的图,如果用经典的MSRCR算法,会导致处理后的图容易偏色,为了解决这一现象提出了对图像的Intensity数据进行MSR处理,然后再把数据根据原始的RGB的比例映射到每个通道,这样就能在保留原始颜色分布的基础上增强图像。

4.8 MSRCP操作流程

1.首先对图像每个像素点进行分量相加求均值,然后使用高斯函数对原始图像进行低通滤波。
2.将原始图像与滤波后图像转换到对数域做差(即将图像中的低频成分减掉),得到对数域的反射图像。
3.将对数域的反射图像在像素层面上进行图像求和(即MSR的步骤),得到MSR结果,然后进行线性处理和自动色阶平衡。
4. 然后再把数据根据原始的RGB的比例映射到每个通道,最终整合输出图像。

4.9 automatedMSRCR算法

色彩增益加权的autoMSRCR算法,这个算法我没有查到太多资料,只找到了一段程序。看过代码之后,我认为autoMSRCR算法是先对图片进行了SMR算法,由于Retinex数据处理后的高动态特性,数据分布很广,会出现严重的两极化现象,一般难以获得满意的结果。所以autoMSRCR算法这里对SMR的结果是数组进行色彩增益加权,这里是对R 、G、B三个维度分别根据各自像素值设定不同的上下限阈值,去除较小和较大的像素值,防止两极化现象出现。

4.10 automatedMSRCR算法流程

1、首先对图片进行了SMR算法,生成SMR算法的像素值数组(维度为三维)。
2、对不同维度的像素进行去重之后、从小到大排序并统计不同元素的个数。筛选出最小值和最大值和像素等于0值的个数。
3、对每个维度的SMR像素值进行缩放,具体操作为先确定下限和上限(下限确定:像素值小于0且这个像素值的个数小于0像素的个数的十分之一。上限确定:像素值大于0且这个像素值的个数小于0像素的个数的十分之一。然后依次遍历每一个维度的每一个像素值,确定每一个维度的上限和下限。)
4、把SMR像素数组里超过上限和低于下限的值用上限值和下限值替换。线性放缩到0-255,取整可视化图形。

4.11 线性量化公式

还是直接看代码吧 ,对着代码看公式比较好懂。
在这里插入图片描述

4.12 自动色阶平衡

Simplest Color Balance 自动色阶平衡
按照一定的百分比去除最小和最大的部分,然后中间的部分重新线性量化到0和255之间。


def simplestColorBalance(img, low_clip, high_clip):    # 这里 low_clip和high_clip 是经验值为认为设定的   0.01、0.99total = img.shape[0] * img.shape[1]  # 多少个像素点for i in range(img.shape[2]):  # 维度# np.unique对数据去重后从小到大排序 # unique为从小到大排序的数组# counts不同元素的个数unique, counts = np.unique(img[:, :, i], return_counts=True)   current = 0# 这个for循环 求出 下限 low_val 和 上限 high_val# 具体的原理我也不清楚# 从输出来讲缩小了像素值的范围  ,防止出现两极化现象。for u, c in zip(unique, counts):            if float(current) / total < low_clip:low_val = uif float(current) / total < high_clip:high_val = ucurrent += c  # 累加img[:, :, i] = np.maximum(np.minimum(img[:, :, i], high_val), low_val)  # 限定范围return img

总代码

代码几乎每一行我都写了注释,这里就不解释了。

import numpy as np
import cv2
#------------------------------------------------------------#
# SSR
# retinex SSR
# # 用data数组里的最小数替代0
# np.nonzero(a) 取出a里面非零的数 
# -----------------------------------------------------------#
def replaceZeroes(data):  min_nonzero = min(data[np.nonzero(data)])   # 取data数组里除0外最小的数data[data == 0] = min_nonzero   # 把data数组里的0的数用 min_nonzero 替换掉return datadef SSR(src_img, size):L_blur = cv2.GaussianBlur(src_img, (size, size), 0)  # 高斯函数img = replaceZeroes(src_img)  # 去除0  这里为什么要去0 呢  我个人认为是后面有log运算 0不能运算L_blur = replaceZeroes(L_blur) # 去除0dst_Img = cv2.log(img/255.0)  # 归一化取logdst_Lblur = cv2.log(L_blur/255.0)  # 归一化取logdst_IxL = cv2.multiply(dst_Img, dst_Lblur)  # 乘  L(x,y)=S(x,y)*G(x,y)log_R = cv2.subtract(dst_Img, dst_IxL)  # 减  log(R(x,y))=log(S(x,y))-log(L(x,y)) dst_R = cv2.normalize(log_R,None, 0, 255, cv2.NORM_MINMAX) #  放缩到0-255log_uint8 = cv2.convertScaleAbs(dst_R)  # 取整return log_uint8
def SSR_image(image):size = 3b_gray, g_gray, r_gray = cv2.split(image)  # 拆分三个通道# 分别对每一个通道进行 SSRb_gray = SSR(b_gray, size)  g_gray = SSR(g_gray, size)r_gray = SSR(r_gray, size)result = cv2.merge([b_gray, g_gray, r_gray])  # 通道合并。return result
#------------------------------------------------------##------------------------------------------------------#
# MSR
# retinex MSR
#------------------------------------------------------#
def MSR(img, scales):  weight = 1 / 3.0  # 不同ssr的权重scales_size = len(scales)  # 做多少次ssrh, w = img.shape[:2]  # 宽高log_R = np.zeros((h, w), dtype=np.float32)  # 创建0数组for i in range(scales_size):  #img = replaceZeroes(img) # 去0值L_blur = cv2.GaussianBlur(img, (scales[i], scales[i]), 0) # 高斯函数L_blur = replaceZeroes(L_blur)   # 去0值dst_Img = cv2.log(img/255.0)  # 归一化取logdst_Lblur = cv2.log(L_blur/255.0) # 归一化取logdst_Ixl = cv2.multiply(dst_Img, dst_Lblur)   # 乘  L(x,y)=S(x,y)*G(x,y)# 公式如下  也就是求三次 ssr  结果乘权重然后相加在一起。# log(R(x,y))=log(S(x,y))-log(L(x,y)) #  log(R(x,y))=Weight1⋅log(Rσ1(x,y))+Weight2⋅log(Rσ2(x,y))+Weight3⋅log(Rσ3(x,y))log_R += weight * cv2.subtract(dst_Img, dst_Ixl) dst_R = cv2.normalize(log_R,None, 0, 255, cv2.NORM_MINMAX)  # 0-1 缩放到0-255 log_uint8 = cv2.convertScaleAbs(dst_R) # 取整return log_uint8def MSR_image(image):scales = [15, 101, 301]   # 卷积核大小b_gray, g_gray, r_gray = cv2.split(image)  # 拆分通道 r g bb_gray = MSR(b_gray, scales)g_gray = MSR(g_gray, scales)r_gray = MSR(r_gray, scales)result = cv2.merge([b_gray, g_gray, r_gray])return result
#-----------------------------------------------------------#
# 这个求出来数据没有转换不能直接显示  MSRCR MSRCP调用
#-----------------------------------------------------------#
# SSR
def singleScaleRetinex(img, sigma):  # SSR# L(x,y)=S(x,y)*G(x,y)# log(R(x,y))=log(S(x,y))-log(L(x,y)) retinex = np.log10(img) - np.log10(cv2.GaussianBlur(img, (0, 0), sigma))  return retinex
#-----------------------------------------------------------#
# MSR  MSRCR MSRCP调用
def multiScaleRetinex(img, sigma_list):  retinex = np.zeros_like(img)  # 创建0数组for sigma in sigma_list:  # 循环retinex += singleScaleRetinex(img, sigma)  # 高斯模糊#  log(R(x,y))=Weight1⋅log(Rσ1(x,y))+Weight2⋅log(Rσ2(x,y))+Weight3⋅log(Rσ3(x,y))  # 加权求均值retinex = retinex / len(sigma_list)return retinex
#-----------------------------------------------------------#
# 这个函数求的是 色彩恢复因子Ci
def colorRestoration(img, alpha, beta):  img_sum = np.sum(img, axis=2, keepdims=True)   # 按通道求和color_restoration = beta * (np.log10(alpha * img) - np.log10(img_sum))return color_restoration# Simplest Color Balance  自动色阶平衡
# 按照一定的百分比去除最小和最大的部分,然后中间的部分重新线性量化到0和255之间。
def simplestColorBalance(img, low_clip, high_clip):    # 这里 low_clip和high_clip 是经验值为认为设定的   0.01、0.99total = img.shape[0] * img.shape[1]  # 多少个像素点for i in range(img.shape[2]):  # 维度# np.unique对数据去重后从小到大排序 # unique为从小到大排序的数组# counts不同元素的个数unique, counts = np.unique(img[:, :, i], return_counts=True)   current = 0# 这个for循环 求出 下限 low_val 和 上限 high_val# 具体的原理我也不清楚# 从输出来讲缩小了像素值的范围  ,防止出现两极化现象。for u, c in zip(unique, counts):            if float(current) / total < low_clip:low_val = uif float(current) / total < high_clip:high_val = ucurrent += c  # 累加img[:, :, i] = np.maximum(np.minimum(img[:, :, i], high_val), low_val)  # 限定范围return img    #----------------------------------------------------#
#“sigma_list”: [15, 80, 200],多尺度高斯模糊sigma值
#“G” : 5.0,增益
#“b” : 25.0,偏差
#“alpha” : 125.0,
#“beta” : 46.0,
#“low_clip” : 0.01,
#“high_clip” : 0.99
#---------------------------------------------------#def MSRCR(img, sigma_list, G, b, alpha, beta, low_clip, high_clip):# 这里加1 我个人认为是  图片数组里最小值为0  后面会有log计算  0值不能计算 所以加了1 img = np.float64(img) + 1.0  img_retinex = multiScaleRetinex(img, sigma_list) # 求 MSRimg_color = colorRestoration(img, alpha, beta)   # 色彩恢复因子Ciimg_msrcr = G * (img_retinex * img_color + b)   # 加增益和偏差  求MSRCR# 直接线性量化for i in range(img_msrcr.shape[2]):img_msrcr[:, :, i] = (img_msrcr[:, :, i] - np.min(img_msrcr[:, :, i])) / \(np.max(img_msrcr[:, :, i]) - np.min(img_msrcr[:, :, i])) * \255# np.maximum(array1, array2):逐位比较array1和array2,并输出两者的最大值。img_msrcr = np.uint8(np.minimum(np.maximum(img_msrcr, 0), 255)) # 限定范围  取整   小于0的都换成0img_msrcr = simplestColorBalance(img_msrcr, low_clip, high_clip)   # 自动色阶平衡return img_msrcr
#-------------------------------------------------------------------------#
# MSRCP
def MSRCP(img, sigma_list, low_clip, high_clip):img = np.float64(img) + 1.0intensity = np.sum(img, axis=2) / img.shape[2]      # 求三通道像素点平均值  二维retinex = multiScaleRetinex(intensity, sigma_list)  # 求 MSRintensity = np.expand_dims(intensity, 2)  # 扩展维度 3维retinex = np.expand_dims(retinex, 2)      # 扩展维度 3维 intensity1 = simplestColorBalance(retinex, low_clip, high_clip)  # 自动色阶平衡# 直接线性量化intensity1 = (intensity1 - np.min(intensity1)) / \(np.max(intensity1) - np.min(intensity1)) * \255.0 + 1.0img_msrcp = np.zeros_like(img)# 根据原始的RGB的比例映射到每个通道for y in range(img_msrcp.shape[0]):for x in range(img_msrcp.shape[1]):B = np.max(img[y, x])  # 最大值A = np.minimum(256.0 / B, intensity1[y, x, 0] / intensity[y, x, 0])img_msrcp[y, x, 0] = A * img[y, x, 0]img_msrcp[y, x, 1] = A * img[y, x, 1]img_msrcp[y, x, 2] = A * img[y, x, 2]img_msrcp = np.uint8(img_msrcp - 1.0)  # 取整return img_msrcp
#---------------------------------------------------------------------------------#
# automatedMSRCR
def automatedMSRCR(img, sigma_list):img = np.float64(img) + 1.0img_retinex = multiScaleRetinex(img, sigma_list)   # 求 MSRfor i in range(img_retinex.shape[2]):  # 维度循环# unique():返回参数数组中所有不同的值,并按照从小到大排序# unique 去重后重新排序的数组,count去重后 不同数据的个数unique, count = np.unique(np.int32(img_retinex[:, :, i] * 100), return_counts=True)  # 这里*了100 数据放大100倍for u, c in zip(unique, count):  if u == 0:zero_count = c  # 数组中0的个数break#  下面数据/100 都是为了还原数据 因为上面*了100  low_val = unique[0] / 100.0    #  MSR 结果 img_retinex中的最小值high_val = unique[-1] / 100.0  #  MSR 结果 img_retinex中的最大值# 下面这几行的原理我不是很清楚,我也没找到文献说明,# 看代码的输出 上面求得low_val = -2.13 ,high_val = 0.46# 经过for循环后 low_val = -0.47 ,high_val = 0.22# 我认为他是把最大值和最小值给收缩了,防止两极化现象for u, c in zip(unique, count):  if u < 0 and c < zero_count * 0.1:low_val = u / 100.0if u > 0 and c < zero_count * 0.1:high_val = u / 100.0break# 限定范围  把高于high_val 和低于low_val 用 high_val、low_val代替 。img_retinex[:, :, i] = np.maximum(np.minimum(img_retinex[:, :, i], high_val), low_val)# 直接线性量化  0-255img_retinex[:, :, i] = (img_retinex[:, :, i] - np.min(img_retinex[:, :, i])) / \(np.max(img_retinex[:, :, i]) - np.min(img_retinex[:, :, i])) \* 255img_retinex = np.uint8(img_retinex)return img_retinex

程序参数
#----------------------------------------------------#
#“sigma_list”: [15, 80, 200],多尺度高斯模糊sigma值
#“G” : 5.0,增益
#“b” : 25.0,偏差
#“alpha” : 125.0,
#“beta” : 46.0,
#“low_clip” : 0.01,
#“high_clip” : 0.99
#---------------------------------------------------#

可视化代码

import sys
import os
import cv2
import json
import numpy as np 
import matplotlib.pyplot as plt
# plt显示挂内核 添加下面两行代码
import os  # 添加代码①
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"  # 添加代码②def cv_show1(name, img):  # 长宽高cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()image = cv2.imread("D:/code/data/test2.jpg")  
# -----------------------------------------------------#
# SSR
img_ssr = SSR_image(image)
#cv_show1('SSR',img_ssr)
cv2.imwrite("D:/code/data/SSR.jpg",img_ssr) # MSR
img_msr = MSR_image(image)
#cv_show1('MSR',img_msr)
cv2.imwrite("D:/code/data/MSR.jpg",img_msr)# MSRCR
img_msrcr = MSRCR(image,[15, 80, 200],5,25,125,46,0.01,0.99)
#cv_show1('MSRCR',img_msrcr)
cv2.imwrite("D:/code/data/MSRCR.jpg",img_msrcr)# MSRCP
img_msrcp = MSRCP(image,[15, 80, 200],0.01,0.99) 
#cv_show1('MSRCP',img_msrcp)
cv2.imwrite("D:/code/data/MSRCP.jpg",img_msrcp)# automatedMSRCR
img_amsrcr = automatedMSRCR(image,[15, 80, 200])
#cv_show1('automatedMSRCR',img_amsrcr)
cv2.imwrite("D:/code/data/automatedMSRCR.jpg",img_amsrcr)#---------------------------------------------------------## 显示
plt.subplot(2,3,1),plt.imshow(image),plt.title("原图",fontname="SimHei")
plt.subplot(2,3,2),plt.imshow(img_ssr),plt.title("SSR",fontname="SimHei")
plt.subplot(2,3,3),plt.imshow(img_msr),plt.title("MSR",fontname="SimHei")
plt.subplots_adjust(top=0.8)
plt.subplot(2,3,4),plt.imshow(img_msrcr),plt.title("MSRCR",fontname="SimHei")
plt.subplots_adjust(top=0.8)
plt.subplot(2,3,6),plt.imshow(img_amsrcr),plt.title("automatedMSRCR",fontname="SimHei")
plt.subplots_adjust(top=0.8)
plt.subplot(2,3,5),plt.imshow(img_msrcp),plt.title("MSRCP",fontname="SimHei")
plt.subplots_adjust(top=0.8)
#-----------------------------------------------------#

五、结果分析

在这里插入图片描述
在这里插入图片描述
SSR能够较好地完成动态范围的压缩,暗区域的细节能得到较好地增强,但也明显出现了色差。同单尺度相比,MSR既能实现图像动态范围的压缩,又能保持色感的一致性较好。从图中可以看出MSR比SSR还原出的原图更清晰一点,虽然不太明显。MSRCR效果要比MSR好很多,MSRCR利用彩色恢复因子C,调节原始图像中3个颜色通道之间的比例关系基本消除了色偏,结果图也没有跟SSR和MSR一样发白。MSRCP的结果图更具色彩感,图中的车灯和房间里的光线都得到了很好的还原。autoMSRCR的结果图是最贴近自然图片的,很好的把图片暗黑色的部分展现了出来且没有色偏。
Retinex算法的效果对于一些正常的图像处理后的效果并不佳,我们可以认为他就是为那些在外界环境不理想的状态下拍摄的图像增强而设计的,特别的,对于航拍的雾天图片,医学上的成像图片等成像条件恶劣的图有很明显的效果。

总结

额,,,终于水完了 。


http://chatgpt.dhexx.cn/article/JKeqvynp.shtml

相关文章

Retinex图像增强算法

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

图像增强算法Python实现之Retinex(含代码)

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

Retinex图像增强

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

图像处理: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脚本的基本元素与执行方式 一、文…