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

article/2025/11/6 19:38:04

文章目录

    • 1. 引言
    • 2. Retinex算法原理
      • 2.1 单尺度Retinex
        • 示例代码
      • 2.2 多尺度Retinex
        • 示例代码
      • 2.3 颜色恢复
        • 示例代码
      • 2.4 最终图像处理
        • 代码示例
    • 3. Retinex算法的Python实现
    • 4. 完结

1. 引言

图像增强是图像处理中的重要技术之一,它可以改善图像的亮度、对比度和颜色等视觉效果,使图像更加清晰、鲜明。Retinex是一种经典的图像增强算法,它通过对图像进行多尺度高斯模糊处理和颜色恢复操作来改善图像的视觉效果。本文将详细介绍Retinex算法的原理,并给出了Python实现的示例代码和测试结果。
在这里插入图片描述

2. Retinex算法原理

 Retinex算法原理

Retinex算法是基于人眼视觉系统特性的图像增强算法,它通过对图像进行多尺度的处理来提高图像的亮度和颜色表现。

2.1 单尺度Retinex

在这里插入图片描述

单尺度Retinex算法是Retinex算法的基本操作,它通过对图像进行高斯模糊处理和对数运算来得到增强后的图像。具体步骤如下:

  1. 对输入图像进行高斯模糊处理,使用cv2.GaussianBlur()函数实现,其中参数sigma表示高斯核的标准差。
  2. 对模糊后的图像和原图像分别进行对数运算,得到两个对数图像。
  3. 将两个对数图像相减,得到增强后的图像。

示例代码

import cv2  # 导入OpenCV库,用于图像处理
import numpy as np  # 导入NumPy库,用于科学计算和数组操作def single_scale_retinex(img, sigma):retinex = np.log10(img) - np.log10(cv2.GaussianBlur(img, (0, 0), sigma))# 计算图像的单尺度Retinex算法# np.log10(img) 对输入图像img进行log10变换,将像素值转换为对数域# cv2.GaussianBlur(img, (0, 0), sigma) 对输入图像img进行高斯模糊处理,sigma为高斯核的标准差# np.log10(...) - np.log10(...) 执行两个结果之间的减法运算,得到Retinex结果return retinex

解释说明
这段代码实现了基于单尺度Retinex算法的图像增强

  • import cv2:导入OpenCV库,用于图像处理。

  • import numpy as np:导入NumPy库,用于科学计算和数组操作。

  • def single_scale_retinex(img, sigma)::定义了一个函数single_scale_retinex,接收两个参数imgsigma,分别代表输入的图像和高斯核的标准差。

  • retinex = np.log10(img) - np.log10(cv2.GaussianBlur(img, (0, 0), sigma)):计算图像的单尺度Retinex算法。

    • np.log10(img)对输入图像img进行log10变换,将像素值转换为对数域。
    • cv2.GaussianBlur(img, (0, 0), sigma)对输入图像img进行高斯模糊处理,使用高斯核进行图像平滑,其中(0, 0)表示核的大小为自动计算。
    • np.log10(...) - np.log10(...)执行两个结果之间的减法运算,得到Retinex结果。
  • return retinex:返回计算得到的Retinex结果。

2.2 多尺度Retinex

多尺度Retinex

多尺度Retinex是在单尺度Retinex的基础上进一步改进的算法,它通过对不同尺度下的图像进行单尺度Retinex增强,并将结果累加求平均得到最终的增强图像。具体步骤如下:

  1. 定义一个尺度列表sigma_list,包含不同的标准差值。
  2. 循环遍历尺度列表中的每个标准差sigma,调用单尺度Retinex算法对图像进行增强,并将结果逐步累加。
  3. 将累加后的图像除以尺度列表的长度,得到最终的增强图像。

示例代码

def multi_scale_retinex(img, sigma_list):retinex = np.zeros_like(img)  # 创建与输入图像相同大小的全零数组,用于存储Retinex结果for sigma in sigma_list:retinex += single_scale_retinex(img, sigma)# 调用single_scale_retinex函数计算单尺度Retinex,并将结果累加到retinex数组中retinex = retinex / len(sigma_list)# 将累加的Retinex结果除以sigma_list的长度,得到平均Retinex结果return retinex

解释说明
这段代码实现了基于多尺度Retinex算法的图像增强。

  • def multi_scale_retinex(img, sigma_list)::定义了一个函数multi_scale_retinex,接收两个参数imgsigma_list,分别代表输入的图像和高斯核的标准差列表。

  • retinex = np.zeros_like(img):创建了一个与输入图像img相同大小的全零数组retinex,用于存储Retinex结果。

  • for sigma in sigma_list::遍历sigma_list中的每个标准差值。

  • retinex += single_scale_retinex(img, sigma):调用single_scale_retinex函数计算单尺度Retinex,并将结果累加到retinex数组中。

  • retinex = retinex / len(sigma_list):将累加的Retinex结果除以sigma_list的长度,得到平均Retinex结果。

  • return retinex:返回计算得到的平均Retinex结果。

2.3 颜色恢复

颜色恢复
颜色恢复是Retinex算法中的一个重要步骤,它通过对各通道像素值进行对数运算,并乘以系数alpha和beta来实现颜色的恢复。具体步骤如下:

  1. 对输入图像的R、G、B三个通道进行分离。
  2. 分别对三个通道的像素值进行对数运算,得到对数图像。
  3. 将对数图像乘以系数alpha和beta,得到颜色恢复后的图像。

示例代码

def color_restoration(img, alpha, beta):img_sum = np.sum(img, axis=2, keepdims=True)# 对输入图像img沿着第二个维度求和,即对每个像素的RGB通道进行求和操作# keepdims=True表示保持结果的维度数量与原图像相同color_restoration = beta * (np.log10(alpha * img) - np.log10(img_sum))# 计算颜色恢复后的图像# np.log10(...) 对输入图像alpha * img 进行log10变换,将像素值转换为对数域# np.log10(img_sum) 对输入图像img_sum进行log10变换,将像素值转换为对数域# np.log10(...) - np.log10(...) 执行两个结果之间的减法运算return color_restoration

解释说明
这段代码实现了颜色恢复的功能。

  • def color_restoration(img, alpha, beta)::定义了一个函数color_restoration,接收三个参数imgalphabeta,分别代表输入的图像、颜色强度调整系数和颜色平衡系数。

  • img_sum = np.sum(img, axis=2, keepdims=True):对输入图像img沿着第二个维度(RGB通道)进行求和操作,即对每个像素的RGB通道进行求和。keepdims=True表示保持结果的维度数量与原图像相同,得到一个具有相同大小但通道数为1的数组img_sum

  • color_restoration = beta * (np.log10(alpha * img) - np.log10(img_sum)):根据给定的公式计算颜色恢复后的图像。np.log10(alpha * img)对输入图像alpha * img进行log10变换,将像素值转换为对数域;np.log10(img_sum)对输入图像img_sum进行log10变换,将像素值转换为对数域;最后通过一系列运算得到颜色恢复的结果存储在color_restoration变量中。

  • return color_restoration:返回颜色恢复后的图像。

2.4 最终图像处理

最终图像处理是将多尺度Retinex和颜色恢复两个操作结合起来,得到最终的增强图像。具体步骤如下:

  1. 将输入图像转换为浮点数类型,并加上1.0,避免出现除零错误。
  2. 调用多尺度Retinex算法对图像进行增强,得到增强后的图像。
  3. 调用颜色恢复算法对图像进行颜色恢复,得到颜色恢复后的图像。
  4. 对增强后的图像进行亮度和颜色的调整,得到最终的增强图像。
  5. 对最终的增强图像进行像素范围的限制,确保像素值在0-255之间。
  6. 将最终的增强图像转换为无符号整数类型,并返回。

代码示例

def retinex_process(img, sigma_list, G, b, alpha, beta):img = np.float64(img) + 1.0# 将输入图像转换为float64类型,并加上1.0,用于防止log运算时出现零值img_retinex = multi_scale_retinex(img, sigma_list)# 调用multi_scale_retinex函数对输入图像进行多尺度Retinex增强处理,# 得到增强后的图像img_retineximg_color = color_restoration(img, alpha, beta)# 调用color_restoration函数对输入图像进行颜色恢复处理,# 得到恢复后的图像img_colorimg_retinex = G * (img_retinex * img_color + b)# 对增强后的图像img_retinex与恢复后的图像img_color按照一定的公式进行加权融合,# 并加上一个常数b,得到最终的Retinex结果img_retinexfor i in range(img_retinex.shape[2]):img_retinex[:, :, i] = np.clip(img_retinex[:, :, i], 0, 255)# 对每个通道的像素值进行裁剪,将超过0和255的值限制在0-255范围内img_retinex = np.uint8(img_retinex)# 将增强后的图像转换为uint8类型,即8位无符号整型return img_retinex

解释说明
这段代码实现了Retinex图像处理的流程。

  • def retinex_process(img, sigma_list, G, b, alpha, beta)::定义了一个函数retinex_process,接收六个参数imgsigma_listGbalphabeta,分别代表输入的图像、高斯核的标准差列表、融合权重系数G、常数b、颜色强度调整系数alpha和颜色平衡系数beta。

  • img = np.float64(img) + 1.0:将输入的图像img转换为float64类型,并加上1.0,用于防止log运算时出现零值。

  • img_retinex = multi_scale_retinex(img, sigma_list):调用multi_scale_retinex函数对输入图像进行多尺度Retinex增强处理,得到增强后的图像img_retinex

  • img_color = color_restoration(img, alpha, beta):调用color_restoration函数对输入图像进行颜色恢复处理,得到恢复后的图像img_color

  • img_retinex = G * (img_retinex * img_color + b):对增强后的图像img_retinex与恢复后的图像img_color按照一定的公式进行加权融合,并加上一个常数b,得到最终的Retinex结果img_retinex

  • for i in range(img_retinex.shape[2])::遍历图像img_retinex的第三个维度,即通道数。

  • img_retinex[:, :, i] = np.clip(img_retinex[:, :, i], 0, 255):对每个通道的像素值进行裁剪,将超过0和255的值限制在0-255范围内,使用np.clip函数实现。

  • img_retinex = np.uint8(img_retinex):将增强后的图像img_retinex转换为uint8类型,即8位无符号整型。

  • return img_retinex:返回处理后的Retinex结果图像。

3. Retinex算法的Python实现

基于OpenCV和NumPy库,我们可以很方便地实现Retinex算法。下面是Retinex算法的Python代码实现:

import cv2
import numpy as np# 对图像进行单尺度 Retinex 处理
def single_scale_retinex(img, sigma):retinex = np.log10(img) - np.log10(cv2.GaussianBlur(img, (0, 0), sigma))return retinex# 对图像进行多尺度 Retinex 处理
def multi_scale_retinex(img, sigma_list):retinex = np.zeros_like(img)for sigma in sigma_list:retinex += single_scale_retinex(img, sigma)retinex = retinex / len(sigma_list)return retinex# 进行颜色恢复
def color_restoration(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# 图像增强主函数,包括图像增强和颜色恢复
def retinex_process(img, sigma_list, G, b, alpha, beta):img = np.float64(img) + 1.0img_retinex = multi_scale_retinex(img, sigma_list)img_color = color_restoration(img, alpha, beta)img_retinex = G * (img_retinex * img_color + b)# 将像素值限制在范围内for i in range(img_retinex.shape[2]):img_retinex[:, :, i] = np.clip(img_retinex[:, :, i], 0, 255)img_retinex = np.uint8(img_retinex)return img_retinexdef main():# 读取图像img = cv2.imread('WechatIMG9.jpeg')# 尺度列表sigma_list = [15, 80, 250]# 增益参数G = 5.0# 偏置参数b = 25.0# 颜色恢复参数alpha = 125.0# 颜色恢复参数beta = 46.0# 进行图像增强img_retinex = retinex_process(img, sigma_list, G, b, alpha, beta)# 显示原始图像cv2.imshow('1', img)# 显示增强后的图像cv2.imshow('Retinex', img_retinex)# 等待按键cv2.waitKey(0)# 保存增强后的图片cv2.imwrite('a.jpg', img_retinex)if __name__ == "__main__":main()

代码通过 Retinex 算法对图像进行增强,包括单尺度 Retinex 处理、多尺度 Retinex 处理和颜色恢复。

  • single_scale_retinex 函数:对图像进行单尺度 Retinex 处理,使用对数域操作计算图像的亮度分量。
  • multi_scale_retinex 函数:对图像进行多尺度 Retinex 处理,将多个尺度的 Retinex 处理结果相加并取平均。
  • color_restoration 函数:进行颜色恢复,计算图像的颜色分量。
  • retinex_process 函数:图像增强的主要函数,包括图像增强和颜色恢复操作。
  • main 函数:主函数,在这里读取输入图像,并设定参数,然后调用 retinex_process 函数进行图像增强。
  • 在窗口中显示原始图像和增强后的图像,并保存增强后的图像到文件。

效果展示
原图:

在这里插入图片描述

执行之后的图

在这里插入图片描述

对比图

在这里插入图片描述

4. 完结

期待下一次的更新哦!!!
在这里插入图片描述


http://chatgpt.dhexx.cn/article/8VvZ0k6O.shtml

相关文章

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

文章目录 前言原理发展单尺度算法(SSR)多尺度算法(MSR)带有色彩恢复的多尺度 实现 前言 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算法(单尺度) 2.2.2 MSR算法(多…

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

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

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

目录 一、sort 排序 1、格式 2、常用选项 3、sort 例子 1、不加任何选项 如:sort /etc/passwd 2、 去重 (sort -u) 3、 指定分隔符(-t),指定排序的列(-k),升序排列…

shell之常用工具的使用

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

shell工具finalShell

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

shell学习☞shell工具

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

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

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

2.shell工具与脚本

文章目录 一、bash 中的特殊变量二、变量赋值与访问三、其他类型的脚本四、查找文件findlocate 查找内容grep 查找 shell 命令tree broot 五、零碎知识点六、 shell工具 一、bash 中的特殊变量 $0 :脚本名 $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: 现在我们使用的操作系统(Windows、Mac OS、Android、iOS等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网管等)和普通用户(家庭主妇、…

shell的几种常用工具

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

Linux学习 -- Shell的工具

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

快速入门Shell脚本(5)——Shell的这些工具你都知道了吗?

上一篇博客已经给大家讲了计较复杂的操作(常用的函数操作)。 本篇博客,给讲一下shell的工具,学会写工具会让你的面试加分的偶。(喜欢shell脚本的可以关注专栏) 1.Shell中的cut 1.1介绍 cut的工作就是“剪…

Shell常用命令与工具

学习一些在编写Shell时的常用命令或工具及使用技巧。有人说Shell脚本是命令堆积的一个文件,按顺序去执行。还有人说想学好Shell脚本,要把Linux上各种常见的命令或工具掌握了,这些说法都没错。由于Shell语言本身在语法结构上比较简单&#xff…

SHELL工具推荐

随着个人使用还会继续更新,目前就只有两款。 1.Xshell 业界较常见的一款经典的shell命令行软件,配套有单独的ftp软件。 界面比较简洁,命令好像全是单色。有开源的免费版本可以下载。 2.MobaXterm 界面易读性高很多,对于warning、…

shell脚本之工具

在学习了shell脚本的基本语法,命令,符号之后,接下来要看的就是shell脚本使用的所有工具了。 在shell脚本中,工具的使用简化了所要编写的代码。接下来就介绍几个shell下经常使用的工具。 1、sort sort工具的常用语法就是将文件的每一行作为一个单位,相互比较,比较原则是从…

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

文章目录 一、列截取工具-cut1、cut概述2、常用选项3、案例演示 二、排序工具-sort1、sort概述2、常用选项3、案例演示 三、去重工具-uniq1、uniq概述2、uniq的常用选项3、案例演示 四、修改工具-tr1、 tr概述2、tr的常用选项3、案例演示 五、面试题六、总结 一、列截取工具-cu…

JDK配置环境变量+eclipse安装使用(保姆级教程)

一、下载JDK 访问Oracle官网下载最新版JDKJava Downloads | Oracle,也可点击此处下载我准备的安装包。 以Windows系统举例,选择Windows下的第二个(第一个为压缩包,第二个为安装程序,第三个是Windows Installee的数据包…

eclipse android环境搭建,Eclipse Android开发环境搭建教程

Eclipse Android开发环境搭建教程是本文要介绍的内容,主要是来了解并学习Eclipse Android环境搭建的过程,具体关于Eclipse Android内容的详解来看本文。 Eclipse Android开发准备: 1、javasdk 2、eclipsehttp://www.eclipse.org/downloads/ 3…