【python】OpenCV—Image Super Resolution

news2025/1/10 10:33:12

在这里插入图片描述

文章目录

  • 1、背景介绍
  • 2、准备工作
  • 3、EDSR
  • 4、ESPCN
  • 5、FSRCNN
  • 6、LapSRN
  • 7、汇总对比
  • 8、参考

1、背景介绍

图像超分,即图像超分辨率(Image Super Resolution,简称SR),是指由一幅低分辨率图像或图像序列恢复出高分辨率图像的技术。这种技术可以显著提升图像的清晰度和细节,使其更加接近原始高分辨率图像的质量。图像超分辨率技术主要可以分为超分辨率复原和超分辨率重建两大类

  • 超分辨率复原:主要侧重于从单幅低分辨率图像中恢复出高分辨率图像,但这一过程往往受限于低分辨率图像本身的信息量,难以完全恢复所有细节。

  • 超分辨率重建:通过利用多幅低分辨率图像(通常是通过同一场景的不同视角、时间或光照条件下拍摄得到)来重建出高分辨率图像。这种方法的核心思想是用时间带宽(即获取同一场景的多帧图像序列)换取空间分辨率,实现时间分辨率向空间分辨率的转换。

EDSR、ESPCN、FSRCNN、LapSRN是四种不同的深度学习图像超分辨率(Super Resolution, SR)算法,它们在图像处理领域各有特点和应用场景。以下是对这四种算法的详细介绍:

1)EDSR(Enhanced Deep Super-Resolution Network)

EDSR是一种增强型深度超分辨率网络,旨在通过深度学习技术提高图像的分辨率。它借鉴了ResNet网络中的残差学习机制,但移除了批归一化(Batch Normalization, BN)层,以适应超分辨率这一low-level视觉任务的需求。

特点:

  • 无BN层:移除BN层以避免高频信息的丢失,确保像素点绝对值的准确性。
  • 残差学习:采用残差学习机制,通过跳过连接(Skip Connection)帮助网络更好地学习高分辨率图像的细节。
  • 高效性能:在多个基准数据集上表现出色,能够生成具有丰富细节的高分辨率图像。

应用场景:

  • EDSR广泛应用于图像和视频的超分辨率重建,包括但不限于数字图像修复、视频监控、医学影像等领域。

2)ESPCN(Efficient Sub-Pixel Convolutional Neural Network)

ESPCN是一种高效子像素卷积神经网络,用于在低分辨率图像上直接计算得到高分辨率图像。它避免了传统上采样方法(如双线性插值、双三次插值)带来的计算复杂性和信息损失。

特点:

  • 亚像素卷积层:核心在于亚像素卷积层,该层通过重新排列卷积层的输出来生成高分辨率图像。
  • 计算效率高:只需要一次卷积运算和一次反卷积运算,大大减少了计算量和时间成本。
  • 适用性强:适用于各种类型的低分辨率图像和不同的超分辨率应用场景。

应用场景:

  • ESPCN在数字图像识别、遥感图像分析、医学图像诊断等领域具有广泛应用。

3)FSRCNN(Fast Super-Resolution Convolutional Neural Network)

FSRCNN是对SRCNN(Super-Resolution Convolutional Neural Network)的改进版本,旨在提高超分辨率重建的速度和质量。它通过减少网络参数和引入更高效的卷积核来实现这一目标。

特点:

  • 直接处理低分辨率图像:与SRCNN不同,FSRCNN直接对原始低分辨率图像进行操作,避免了上采样过程带来的计算负担。
  • 非线性映射:使用多个中等大小的卷积核(3×3)代替SRCNN中的大卷积核(5×5),提高了非线性映射能力。
  • 快速重建:通过优化网络结构和参数,实现了更快的超分辨率重建速度。

应用场景:

  • FSRCNN适用于需要快速超分辨率重建的场景,如实时视频处理、移动设备图像处理等。

4)LapSRN(Laplacian Pyramid Super-Resolution Network)

LapSRN是一种基于拉普拉斯金字塔的超分辨率网络,它通过递归的方式对图像进行逐层上采样和细节恢复。

特点:

  • 递归网络结构:采用递归网络结构,通过拉普拉斯金字塔的方式对图像进行分层处理。
  • 高效性:分阶段处理不同级别的高频信息,减少了计算复杂性,提高了运算效率。
  • 高质量:通过多层次的细节恢复,生成的高分辨率图像具有丰富的细节和良好的整体结构。

应用场景:

  • LapSRN适用于需要高质量超分辨率重建的场景,如高清视频制作、医学影像处理、游戏图形渲染等。

2、准备工作

pip install opencv-contrib-python

3、EDSR

import cv2
import matplotlib.pyplot as plt

time = 4
# 读取图片
img = cv2.imread("opencv.jpg")

sr = cv2.dnn_superres.DnnSuperResImpl_create()
path = f"EDSR_x{time}.pb"
sr.readModel(path)
sr.setModel("edsr", time)
result = sr.upsample(img)

# 调整图像大小
resized = cv2.resize(img, dsize=None, fx=time, fy=time)
plt.figure(figsize=(6, 2))

# 原始图像
plt.subplot(1, 3, 1)
plt.title("Ori")
plt.imshow(img[:, :, ::-1])

# SR上采样图像
plt.subplot(1, 3, 2)
plt.title(f"SRx{time}")
plt.imshow(result[:, :, ::-1])

# OpenCV 上采样图像
plt.subplot(1, 3, 3)
plt.title("Resize")
plt.imshow(resized[:, :, ::-1])

plt.show()

EDSR_x2.pb

在这里插入图片描述

EDSR_x3.pb

在这里插入图片描述

EDSR_x4.pb

在这里插入图片描述

在这里插入图片描述

输入图片

在这里插入图片描述

输出结果 2x,与插值对比
在这里插入图片描述
输出结果 3x,与插值对比

在这里插入图片描述
输出结果 4x,与插值对比

在这里插入图片描述

4、ESPCN

import cv2
import matplotlib.pyplot as plt

time = 4

# 读取图片
img = cv2.imread("opencv.jpg")
sr = cv2.dnn_superres.DnnSuperResImpl_create()
path = f"ESPCN_x{time}.pb"
sr.readModel(path)
sr.setModel("espcn", time)
result = sr.upsample(img)

# 调整图像大小
resized = cv2.resize(img, dsize=None, fx=time, fy=time)
plt.figure(figsize=(6, 2))

# 原始图像
plt.subplot(1, 3, 1)
plt.title("Ori")
plt.imshow(img[:, :, ::-1])

# SR上采样图像
plt.subplot(1, 3, 2)
plt.title(f"SRx{time}")
plt.imshow(result[:, :, ::-1])

# OpenCV 上采样图像
plt.subplot(1, 3, 3)
plt.title("Resize")
plt.imshow(resized[:, :, ::-1])

plt.show()

ESPCN_x2.pb
在这里插入图片描述

ESPCN_x3.pb

在这里插入图片描述

ESPCN_x4.pb

在这里插入图片描述
在这里插入图片描述

超分结果

2x,与插值对比
在这里插入图片描述
3x,与插值对比

在这里插入图片描述
4x,与插值对比
在这里插入图片描述

5、FSRCNN

import cv2
import matplotlib.pyplot as plt

time = 4
# 读取图片
img = cv2.imread("opencv.jpg")

sr = cv2.dnn_superres.DnnSuperResImpl_create()
path = f"FSRCNN_x{time}.pb"
sr.readModel(path)
sr.setModel("fsrcnn", time)
result = sr.upsample(img)

# 调整图像大小
resized = cv2.resize(img, dsize=None, fx=time, fy=time)
plt.figure(figsize=(6, 2))

# 原始图像
plt.subplot(1, 3, 1)
plt.title("Ori")
plt.imshow(img[:, :, ::-1])

# SR上采样图像
plt.subplot(1, 3, 2)
plt.title(f"SRx{time}")
plt.imshow(result[:, :, ::-1])

# OpenCV 上采样图像
plt.subplot(1, 3, 3)
plt.title("Resize")
plt.imshow(resized[:, :, ::-1])

plt.show()

FSRCNN_x2.pb

在这里插入图片描述

FSRCNN_x3.pb

在这里插入图片描述

FSRCNN_x4.pb

在这里插入图片描述
在这里插入图片描述

输出结果,与插值对比

2x

在这里插入图片描述

3x
在这里插入图片描述

4x

在这里插入图片描述

6、LapSRN

import cv2
import matplotlib.pyplot as plt

time = 8
# 读取图片
img = cv2.imread("opencv.jpg")

sr = cv2.dnn_superres.DnnSuperResImpl_create()
path = f"LapSRN_x{time}.pb"
sr.readModel(path)
sr.setModel("lapsrn", time)
result = sr.upsample(img)

# 调整图像大小
resized = cv2.resize(img, dsize=None, fx=time, fy=time)
plt.figure(figsize=(6, 2))

# 原始图像
plt.subplot(1, 3, 1)
plt.title("Ori")
plt.imshow(img[:, :, ::-1])

# SR上采样图像
plt.subplot(1, 3, 2)
plt.title(f"SRx{time}")
plt.imshow(result[:, :, ::-1])

# OpenCV 上采样图像
plt.subplot(1, 3, 3)
plt.title("Resize")
plt.imshow(resized[:, :, ::-1])

plt.show()

LapSRN_x2.pb

在这里插入图片描述

LapSRN_x4.pb

在这里插入图片描述

LapSRN_x8.pb

在这里插入图片描述

在这里插入图片描述
输出结果,与插值对比

2x

在这里插入图片描述

4x

在这里插入图片描述

8x
在这里插入图片描述

7、汇总对比

import cv2
import matplotlib.pyplot as plt

# 读取图片
# img = cv2.imread("image.png")
# img = img[130:290, 150:360]

img = cv2.imread("opencv.jpg")


plt.figure(figsize=(12, 8))

# ori
plt.subplot(2, 3, 1)
plt.xticks([])
plt.yticks([])
plt.xlabel("Ori")
plt.imshow(img[:, :, ::-1])


# resize
resize = cv2.resize(img, dsize=None, fx=4, fy=4)
plt.subplot(2, 3, 2)
plt.xticks([])
plt.yticks([])
plt.xlabel("Resize_x4")
plt.imshow(resize[:, :, ::-1])


# EDSR_x4
sr = cv2.dnn_superres.DnnSuperResImpl_create()
path = "./EDSR/EDSR_x4.pb"
sr.readModel(path)
sr.setModel("edsr", 4)
result_edsr = sr.upsample(img)
plt.subplot(2, 3, 3)
plt.xticks([])
plt.yticks([])
plt.xlabel("EDSR_x4")
plt.imshow(result_edsr[:, :, ::-1])


# ESPCN_x4
sr = cv2.dnn_superres.DnnSuperResImpl_create()
path = "./ESPCN/ESPCN_x4.pb"
sr.readModel(path)
sr.setModel("espcn", 4)
result_espcn = sr.upsample(img)
plt.subplot(2, 3, 4)
plt.xticks([])
plt.yticks([])
plt.xlabel("ESPCN_x4")
plt.imshow(result_espcn[:, :, ::-1])


# FSRCNN_x4
sr = cv2.dnn_superres.DnnSuperResImpl_create()
path = "./FSRCNN/FSRCNN_x4.pb"
sr.readModel(path)
sr.setModel("fsrcnn", 4)
result_fsrcnn = sr.upsample(img)
plt.subplot(2, 3, 5)
plt.xticks([])
plt.yticks([])
plt.xlabel("FSRCNN_x4")
plt.imshow(result_fsrcnn[:, :, ::-1])


# LapSRN_x4
sr = cv2.dnn_superres.DnnSuperResImpl_create()
path = "./LapSRN/LapSRN_x4.pb"
sr.readModel(path)
sr.setModel("lapsrn", 4)
result_lapsrn = sr.upsample(img)
plt.subplot(2, 3, 6)
plt.imshow(result_lapsrn[:, :, ::-1])
plt.xticks([])
plt.yticks([])
plt.xlabel("LapSRN_x4")
plt.show()

输入图片

在这里插入图片描述

输出图片

在这里插入图片描述

输入图片

在这里插入图片描述
输出图片

在这里插入图片描述

EDSR 好像不错,大力出奇迹

8、参考

OpenCV进阶(1)基于OpenCV的超分辨率

链接:https://pan.baidu.com/s/1M0l63vxYbS7zrF3Pn9IYaQ
提取码:123a

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

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

相关文章

HTML基础 - HTML5

目录 一. 简介 二. 新增元素 三. 拖放 地理定位 A、HTML5 拖放(Drag and Drop) B.HTML5 地理定位(Geolocation) 四. input 五. web存储 webSQL 六. 应用程序缓存 web workers 七. web socket 可以先看上篇HTML基础再来看…

RabbitMQ、Kafka对比(超详细),Kafka、RabbitMQ、RocketMQ的区别

文章目录 一、kafka和rabbitmq全面对比分析1.1 简介1.2 kafka和rabbitmq全面对比分析1.3 影响因素 二、RabbitMQ、Kafka主要区别2.1 详解/主要区别2.1.1 设计目标和适用场景2.1.2 架构模型方面2.1.3 吞吐量和性能2.1.4 消息存储和持久化2.1.5 消息传递保证2.1.6 集群负载均衡方…

理解二分搜索算法

一.介绍 在本文中,我们将了解二分搜索算法。二分搜索算法是一种在排序数组中查找特定元素的高效方法。它的工作原理是将搜索间隔反复分成两半,从而大大减少了找到所需元素所需的比较次数。该算法的时间复杂度为 O(log n),因此对于大型数据集…

CLOS架构

CLOS Networking CLOS Networking 是指使用 Clos 网络拓扑结构(Clos Network Topology)进行网络设计的一种方法。该方法是由贝尔实验室的工程师 Charles Clos 在1950年代提出的,以解决电路交换网络的可扩展性和性能问题。随着现代计算和网络…

SpringBoot基础(一):快速入门

SpringBoot基础系列文章 SpringBoot基础(一):快速入门 目录 一、SpringBoot简介二、快速入门三、SpringBoot核心组件1、parent1.1、spring-boot-starter-parent1.2、spring-boot-dependencies 2、starter2.1、spring-boot-starter-web2.2、spring-boot-starter2.3、…

YOLOv10改进 | 主干篇 | YOLOv10引入CVPR2023 顶会论文BiFormer用于主干修改

1. 使用之前用于注意力的BiFormer在这里用于主干修改。 YOLOv10改进 | 注意力篇 | YOLOv10引入BiFormer注意力机制 2. 核心代码 from collections import OrderedDict from functools import partial from typing import Optional, Union import torch import torch.nn as n…

C++:vector容器

概览 std::vector是C标准模板库(STL)中的一种动态数组容器。它提供了一种类似于数组的数据结构,但是具有动态大小和更安全的内存管理。 定义和基本特性 std::vector是C标准库中的一 个序列容器,它代表了能够动态改变大小的数组。与普通数组一样&#x…

酒店智能插座在酒店智慧化中的重要性

在当今数字化和智能化的时代,酒店行业也在不断追求创新和提升服务品质,以满足客人日益增长的需求。酒店智能插座作为酒店智慧化的重要组成部分,发挥着不可忽视的作用。 提升客人的便利性: 酒店智能插座能够为客人提供更加便捷的充…

使用 Java Swing 的 IMEI 验证器

一.介绍 本文档介绍如何使用 Java Swing 创建一个简单的 IMEI 验证器应用程序。 二.什么是 IMEI 号码 IMEI 代表国际移动设备识别码。IMEI 用于在移动设备连接到网络时对其进行识别。每个 GSM、CDMA 或卫星移动设备都有唯一的 IMEI 号码。此号码将印在设备电池组件内。用户可…

Flutter GPU 是什么?为什么它对 Flutter 有跨时代的意义?

Flutter 3.24 版本引入了 Flutter GPU 概念的新底层图形 API flutter_gpu ,还有 flutter_scene 的 3D 渲染支持库,它们目前都是预览阶段,只能在 main channel 上体验,并且依赖 Impeller 的实现。 Flutter GPU 是 Flutter 内置的底…

Python3 第六十六课 -- CGI编程

目录 一. 什么是 CGI 二. 网页浏览 三. CGI 架构图 四. Web服务器支持及配置 五. 第一个CGI程序 5.1. HTTP 头部 5.2. CGI 环境变量 六. GET和POST方法 6.1. 使用GET方法传输数据 6.1.1. 简单的url实例:GET方法 6.1.2. 简单的表单实例:GET方法…

暑期数据结构 空间复杂度

3.空间复杂度 空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度。 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟…

SAM2:在图像和视频中分割任何内容

SAM 2: Segment Anything in Images and Videos 一、关键信息 1. SAM 2概述: SAM 2 是一种基础模型,设计用于在图像和视频中实现可提示的视觉分割。该模型采用变压器架构和流式内存进行实时视频处理。它在原始的Segment Anything Model(SAM…

自用 K8S 资源对象清单 YAML 配置模板手册-1

Linux 常用资源对象清单配置速查手册-1 文章目录 1、Pod 容器集合2、Pod 的存储卷3、Pod 的容器探针4、ResourceQuota 全局资源配额管理5、PriorityClass 优先级类 管理多个资源对象清单文件常用方法: 使用 sed 流式编辑器批量修改脚本键值进行资源清单的创建&am…

【高中数学/函数/值域】求f(x)=(x^2+1)^0.5/(x-1) 的值域

【问题】 求f(x)(x^21)^0.5/(x-1) 的值域 【来源】 《高中数学解题思维策略》P3 例1-1 杨林军著 天津出版传媒集团出版 【解答】 表达式说明f(x)(x^21)^0.5/(x-1)f(x)((x^21)/(x-1)^2)^0.5准备采用配方法f(x)(12/(x-1)2/(x-1)^2)^0.5(1)式f(x)(2*(1/(x-1)1/2)^21/2)^0.5(2)…

Pytorch系列-张量的类型转换

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 张量转换为NumPy数组 使用Tensor.numpy()函数可以将张量转换为ndarray数组 # 1.将张量转换为numpy数组 data_tensortorch.tensor([2,3,4]) # 使用张量对象中的numpy函数进行转…

LiveNVR监控流媒体Onvif/RTSP常见问题-页面上传SSL证书配置开启 HTTPS 服务?什么时候必须要开启HTTPS服务?

LiveNVR常见问题-页面上传SSL证书配置开启 HTTPS 服务?什么时候必须要开启HTTPS服务? 1、配置开启HTTPS1.1、准备https证书1.2、配置HTTPS端口1.3、配置证书路径1.3、 页面上传SSL证书 2、验证HTTPS服务3、为什么要开启HTTPS4、RTSP/HLS/FLV/RTMP拉流Onv…

Vue3+TS+element plus实现一个简单列表页面

期望完成效果 1.创建一个api api内容: 根据接口: 修改 url 和 函数的参数 以及 params里的内容 import { request } from "/utils/service" /** 查 */ export function getDyLogDataApi(page: any, limit: any, campaign_id: any, adgroup_id…

使用Packer构建镜像

什么是Packer Packer 是一个强大的工具,它可以帮助我们轻松地构建各种类型的镜像,如虚拟机镜像、Docker 镜像等。 Packer 的工作原理是通过定义一个配置文件,该文件描述了要构建的镜像的特征和要求。然后 Packer 使用这个配置文件来执行一系…

思迈特软件与海量数据库、红莲花安全浏览器完成兼容互认证

近期,思迈特软件信创认证喜讯传来,思迈特商业智能与数据分析软件[简称:Smartbi Insight] V11在数据库、浏览器产品兼容互认取得新突破,Smartbi Insight V11分别同海量数据库G100管理系统[简称:Vastbase G100] V2.2、红…