Python图像处理【21】基于卷积神经网络增强微光图像

2024-03-05 16:12

本文主要是介绍Python图像处理【21】基于卷积神经网络增强微光图像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于卷积神经网络增强微光图像

    • 0. 前言
    • 1. MBLLEN 网络架构
    • 2. 增强微光图像
    • 小结
    • 系列链接

0. 前言

在本节中,我们将学习如何基于预训练的深度学习模型执行微光/夜间图像增强。由于难以同时处理包括亮度、对比度、伪影和噪声在内的所有因素,因此微光图像增强一直是一项具有挑战性的问题。为了解决这一问题,提出了多分支微光增强网络 (multi-branch low-light enhancement network, MBLLEN),其关键思想是提取不同尺度的丰富特征,以便可以通过多个子网应用图像增强。最后,通过多分支融合生成输出图像,采用这种方式图像质量得到了极大的提高。

1. MBLLEN 网络架构

MBLLEN 深度神经网络的架构图如下所示:

MBLLEN 网络架构
MBLLEN 由以下三种模块组成:

  • 特征提取模块 (feature extraction module, FEM)
  • 增强模块 (enhancement module, EM)
  • 融合模块 (fusion module, FM)

网络的关键是学习以下内容:

  • 通过 FEM 提取不同尺度的丰富特征
  • 通过 EM 分别增强多尺度特征
  • 通过 FM 多分支融合获得最终输出

2. 增强微光图像

(1) 下载预训练的模型(也可以通过 gitcode 下载),导入库、模块和函数:

import tensorflow as tf
import numpy as np
from skimage.io import imread
import matplotlib.pylab as plt
from tensorflow.keras.layers import Input, Conv2D, Conv2DTranspose, Concatenate
from tensorflow.keras.applications.vgg19 import VGG19
from tensorflow.keras.models import Model

(2) 定义函数 build_mbllen(),该函数定义模型、创建模型实例并返回模型。增强模块使用四个堆叠的 Conv2D 层,然后使用三个 tensorflow.keras.layers 模块中的 Conv2DTranspose 层,输入图像的颜色通道需要作为输入张量的最后一个维度:

def build_mbllen(input_shape):def EM(input, kernal_size, channel):conv_1 = Conv2D(channel, (3, 3), activation='relu', padding='same', data_format='channels_last')(input)conv_2 = Conv2D(channel, (kernal_size, kernal_size), activation='relu', padding='valid', data_format='channels_last')(conv_1)conv_3 = Conv2D(channel*2, (kernal_size, kernal_size), activation='relu', padding='valid', data_format='channels_last')(conv_2)conv_4 = Conv2D(channel*4, (kernal_size, kernal_size), activation='relu', padding='valid', data_format='channels_last')(conv_3)conv_5 = Conv2DTranspose(channel*2, (kernal_size, kernal_size), activation='relu', padding='valid', data_format='channels_last')(conv_4)conv_6 = Conv2DTranspose(channel, (kernal_size, kernal_size), activation='relu', padding='valid', data_format='channels_last')(conv_5)res = Conv2DTranspose(3, (kernal_size, kernal_size), activation='relu', padding='valid', data_format='channels_last')(conv_6)return resinputs = Input(shape=input_shape)FEM = Conv2D(32, (3, 3), activation='relu', padding='same', data_format='channels_last')(inputs)EM_com = EM(FEM, 5, 8)for j in range(3):for i in range(0, 3):FEM = Conv2D(32, (3, 3), activation='relu', padding='same', data_format='channels_last')(FEM)EM1 = EM(FEM, 5, 8)EM_com = Concatenate(axis=3)([EM_com, EM1])outputs = Conv2D(3, (1, 1), activation='relu', padding='same', data_format='channels_last')(EM_com)return Model(inputs, outputs)

(3) 通过调用函数 build_mbllen() 获取模型实例,从下载的预训练模型文件中加载预训练权重(参数值):

mbllen = build_mbllen((None, None, 3))
mbllen.load_weights('LOL_img_lowlight.h5') 

(4) 使用 scikit-image.io 模块的 imread() 函数读取输入微光图像。需要注意的是,输入图像的像素值在 [0, 255] 范围内,而模型期望其输入在范围 [0, 1] 内,因此我们需要缩放图像;另外,我们需要使用 np.newaxis 扩展输入维度,因为模型期望输入尺寸为 1 x h x w x c,其中 hwc 分别表示图像的高度、宽度和颜色通道;调用模型的 predict() 方法,使用输入图像执行前向传播,获得增强的输出图像:

img = imread('Lighthouse_under.png')
print(img.max())
out_pred = mbllen.predict(img[np.newaxis, :] / 255)
out = out_pred[0, :, :, :3]

(5) 最后,使用 matplotlib.pyplot 绘制微光输入图像和增强后的输出图像:

def plot_image(image, title=None, sz=10):plt.imshow(image)plt.title(title, size=sz)plt.axis('off')plt.figure(figsize=(20,10))
plt.subplot(121), plot_image(img, 'low-light input')
plt.subplot(122), plot_image(np.clip(out, 0, 1), 'enhanced output')
plt.tight_layout()
plt.show()

增强微光图像

小结

由于难以同时处理包括亮度、对比度、伪影和噪声在内的各种因素,微光图像增强问题是一项具有挑战性的任务。本节中,我们介绍了一种基于深度卷积神经网络的微光图像增强模型,多分支微光增强网络 (multi-branch low-light enhancement network, MBLLEN)。MBLLEN 的关键思想是提取不同尺度图像的丰富特征,以便我们可以通过多个子网应用图像增强,并最终通过多分支融合生成输出图像,从不同尺度的多个方面上改善图像质量。

系列链接

Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理库
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【6】通过哈希查找重复和类似的图像
Python图像处理【7】采样、卷积与离散傅里叶变换
Python图像处理【8】使用低通滤波器模糊图像
Python图像处理【9】使用高通滤波器执行边缘检测
Python图像处理【10】基于离散余弦变换的图像压缩
Python图像处理【11】利用反卷积执行图像去模糊
Python图像处理【12】基于小波变换执行图像去噪
Python图像处理【13】使用PIL执行图像降噪
Python图像处理【14】基于非线性滤波器的图像去噪
Python图像处理【15】基于非锐化掩码锐化图像
Python图像处理【16】OpenCV直方图均衡化
Python图像处理【17】指纹增强和细节提取
Python图像处理【18】边缘检测详解
Python图像处理【19】基于霍夫变换的目标检测
Python图像处理【20】图像金字塔

这篇关于Python图像处理【21】基于卷积神经网络增强微光图像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777077

相关文章

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

PyQt5+Python-docx实现一键生成测试报告

《PyQt5+Python-docx实现一键生成测试报告》作为一名测试工程师,你是否经历过手动填写测试报告的痛苦,本文将用Python的PyQt5和python-docx库,打造一款测试报告一键生成工... 目录引言工具功能亮点工具设计思路1. 界面设计:PyQt5实现数据输入2. 文档生成:python-

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例