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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序——堆排序

本节继续复习排序算法。这次复习排序算法中的堆排序。 堆排序属于选择排序。 目录 什么是堆? 堆排序 堆排序的思想 堆排代码 向下调整算法 堆排整体 什么是堆? 在复习堆排序之前, 首先我们需要回顾一下什么是堆 。 堆的本质其实是一个数…

游戏引擎用什么语言开发上层应用

现在主流的游戏引擎包括: 1、Unity3D,C#语言,优点在于支持几乎所有平台 丹麦创立的一家公司,现已被微软收购。在中国市场占有率最高,也是社群很强大,一般解决方案也能在网上找到,教程丰富。物理…

Golang pprof 分析程序的使用内存和执行时间

一、分析程序执行的内存情况 package mainimport ("os""runtime/pprof" )func main() {// ... 你的程序逻辑 ...// 将 HeapProfile 写入文件f, err : os.Create("heap.prof")if err ! nil {panic(err)}defer f.Close()pprof.WriteHeapProfile(f…

139.乐理基础-一四五八度为何用纯?

上一个内容:138.乐理基础-等音、等音程的意义-CSDN博客 上一个内容里练习的答案: 以乐理里写的知识,没办法完全解释透彻 一四五八度为何用纯?这个问题,要透彻的话要从各个文明怎么发现音高、发明音高、制定规则等&…

Vue3+element-plus复杂表单分组处理

一、为什么表单要分组处理? 方便表单字段的复用:例如,你的表单有十个字段会在很多的表单都会用到,那么表单则需要进行分组进行表单复用;实现不同角色的表单权限控制:例如一个表单有60个字段,角…

VisualStudio 2022的安装

1.IDE 推荐最新版VisualStudio2022,功能十分强大,社区版就够用了。下载地址 2.安装 工作负载选择桌面开发,Web开发可以暂时不选中(大部分都用不到)。 单个组件选中NET 6.0和NET Frameword4.6.1 也就可以了。 后面安…

14-RPC-自研微服务框架

RPC RPC 框架是分布式领域核心组件,也是微服务的基础。 RPC (Remote Procedure Call)全称是远程过程调用,相对于本地方法调用,在同一内存空间可以直接通过方法栈实现调用,远程调用则跨了不同的服务终端&a…

汽车零部件制造中的信息抽取技术:提升效率与质量的关键

一、引言 在汽车制造业中,零部件的生产是整个制造流程的关键一环。这些零部件,包括但不限于制动系统、转向系统和传动系统,是确保汽车安全、可靠运行的基础。为了满足现代汽车工业对效率和质量的严格要求,制造商们纷纷投入到高度…

Jetpack Compose: Hello Android

Jetpack Compose 是一个现代化的工具包,用于使用声明式方法构建原生 Android UI。在本博文中,我们将深入了解一个基本的 “Hello Android” 示例,以帮助您开始使用 Jetpack Compose。我们将探讨所提供代码片段中使用的函数和注解。 入门 在…

软件测试--性能测试工具JMeter

软件测试--性能测试工具JMeter 主流性能测试工具1.主流性能测试工具Loadrunner和Jmeter对比 —— 相同点2.主流性能测试工具Loadrunner和Jmeter对比 —— 不同点JMeter基本使用JMeter环境搭建1.安装JDK:2.安装Jmeter:3.注意点:JMeter功能概要1. JMeter文件目录介绍1.1 bin目…

瑞_23种设计模式_享元模式

文章目录 1 享元模式(Flyweight Pattern)1.1 介绍1.2 概述1.3 享元模式的结构1.4 享元模式的优缺点1.5 享元模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析(Integer类) 🙊 …

13-Java代理模式 ( Proxy Pattern )

Java代理模式 摘要实现范例 代理模式(Proxy Pattern)使用一个类代表另一个类的功能 代理模式创建具有现有对象的对象,以便向外界提供功能接口 代理模式属于结构型模式 摘要 1. 意图 为其他对象提供一种代理以控制对这个对象的访问2. 主…

力扣206反转链表

206.反转链表 力扣题目链接(opens new window) 题意:反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 1,双指针 2,递归。递归参考双指针更容易写, 为什么不用头插…

3.1_2024ctf青少年比赛部分web题

php后门 根据x-powered-by知道php的版本 该版本存在漏洞: PHP 8.1.0-dev 开发版本后门 根据报错信息,进行提示,前 GET / HTTP/1.1 Host: challenge.qsnctf.com:31639 User-Agentt:12345678system(cat /flag);var_dump(2*3);zerodium12345678…

【小白学机器学习6】真实值,观测值,拟合值,以及数据的误差的评价:集中趋势,离散度,形状等

目录 1 世界上有哪几种值?只有3种值 1.1 真值/真实值/理想值/主观值(形而上学世界里) 1.2 实际值/现实值/观测值/样本值(看到的/记录下来的) 1.3 拟合值/预测值(算出来的) 2 对数据的各种…

springboot项目单纯使用nacos注册中心功能

Spring Boot 项目完全可以单独使用 Nacos 作为注册中心。Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它支持服务的注册与发现,能够与 Spring Boot 应用无缝集成,为微服务架构提供了强大的支持。 在使用 Nacos 作为注册中…

Python实现DMI工具判断信号:股票技术分析的工具系列(3)

Python实现DMI工具判断信号:股票技术分析的工具系列(3) 介绍算法解释 代码rolling函数介绍完整代码 介绍 先看看官方介绍: DMI (趋向指标) 用法 1.PDI线从下向上突破MDI线,显示有新多头进场,为…

BUUCTF---[BJDCTF2020]藏藏藏1

1.题目描述 2.下载附件,解压之后是一张图片和一个文本 3.把图片放在winhex,发现图片里面包含压缩包 4.在kali中使用binwalk查看,然后使用foremost分离,在使用tree查看分离出来的文件,最后将zip文件使用unzip进行解压。步骤如下 5.…

pdf编辑软件哪个好用?5款PDF编辑器分享

pdf编辑软件哪个好用?PDF编辑软件在现代办公和学术研究中发挥着举足轻重的作用,它们不仅具备基础的编辑和修改功能,还能够支持多种注释工具,帮助我们高效地管理和整理PDF文件。无论是需要调整文档布局、添加文本或图像&#xff0c…

C++ 前缀和

目录 例1 例2 例3 例4 例5 例6 例7 例8 例1 DP34 【模板】前缀和 分析:dp和arr的大小并不是固定的,就是有没有偏移量,这里的n是从1开始,不如直接放到下标1处,在最后的减法时,如果用第一个参考代码会…