当前位置: 首页 > news >正文

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】图像金字塔

相关文章:

  • SpringBoot接口防抖(防重复提交)的一些实现方案
  • Apache Flink连载(三十九):Kuberneters 部署案例
  • TikTok企业认证教程:提升账号可信度的必备步骤
  • 项目中如何优雅的使用枚举类型
  • Gif动图体积太大怎么办?1分钟极速压缩gif体积
  • 【Python刷题】回文链表
  • 2024 Idea激活,分享几个IntelliJ IDEA激活的方案
  • Linux 学习笔记(12)
  • 深入了解 Android 中的 FrameLayout 布局
  • 如何应对IT服务交付中的问题?
  • 【XR806开发板试用】Console流程解析以及添加自定义指令
  • idea中引入新JDK环境
  • 算法D36 | 贪心算法5 | 435. 无重叠区间 763.划分字母区间 56. 合并区间
  • 【开源】SpringBoot框架开发数据可视化的智慧河南大屏
  • 数据可视化?这些平台能处
  • 3.7、@ResponseBody 和 @RestController
  • 345-反转字符串中的元音字母
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Flannel解读
  • Gradle 5.0 正式版发布
  • JavaScript 一些 DOM 的知识点
  • Java到底能干嘛?
  • Joomla 2.x, 3.x useful code cheatsheet
  • Lucene解析 - 基本概念
  • uva 10370 Above Average
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 讲清楚之javascript作用域
  • 面试遇到的一些题
  • 试着探索高并发下的系统架构面貌
  • 数据仓库的几种建模方法
  • 在Unity中实现一个简单的消息管理器
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (003)SlickEdit Unity的补全
  • (4)事件处理——(7)简单事件(Simple events)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (Python) SOAP Web Service (HTTP POST)
  • (备忘)Java Map 遍历
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Windows2003安全设置/维护
  • (转)大型网站架构演变和知识体系
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ***利用Ms05002溢出找“肉鸡
  • **PHP分步表单提交思路(分页表单提交)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .aanva
  • .NET 3.0 Framework已经被添加到WindowUpdate