利用OpenCV实现基于深度学习的超分辨率处理

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

OpenCV是一个非常强大的计算机视觉处理的工具库。很多小伙伴在入门图像处理时都需要学习OpenCV的使用。但是随着计算机视觉技术的发展,越来越多的算法涌现出来,人们逐渐觉得OpenCV比较落后而放弃了使用OpenCV。

但是,实际上OpenCV时一个与时俱进的开源代码库。正在逐渐的吸收和接纳最新的算法。本文我们来介绍如何使用OpenCV实现基于深度学习的图像超分辨率(SR)。使用OpenCV的好处就是,我们不需要知道任何图像超分辨率的相关知识,就可以使用这个代码,并实现图像超分辨率。

具体操作步骤

1. 安装OpenCV contrib模块

OpenCV中的超分辨率功能被集成在了contrib模块中,因此我们首先需要安装OpenCV的扩展模块。安装过程可以参考【从零学习OpenCV 4】opencv_contrib扩展模块的安装。超分辨率被集成在dnn_superres模块中,如果小伙伴们电脑空间有限,可以只编译这一个模块。

近期有小伙伴反馈自己安装扩展模块失败,为了解决这个问题,小白近期在筹划搭建一个各个版本opencv-contrib编译完成的数据库。各位小伙伴随时关注我们公众号的动态。

2. 下载训练的模型

由于某些模型比较大,因此OpenCV代码库中没有包含他们,因此我们在使用的时候需要单独的下载经过训练的模型。目前,仅支持4种不同的超分辨率模型,他们可以实现2倍、3倍、4倍甚至8倍的图像方法。这些模型具体如下:

EDSR:这个是表现最好的模型。但是这个模型也是最大的,所以运行速度会比较慢。

ESPCN:这个模型具有速度快,效果好的特点,并且模型较小。它可以进行对视频进行实时处理(取决于图像大小)。

FSRCNN:这也是具有快速准确推断功能的小型模型。也可以进行实时视频升频。

LapSRN:这是一个中等大小的模型,它的特点是最大可以将图像放大8倍。

公众号后台回复“SR模型”获取下载这四个模型的方式。

3. 通过程序实现超分辨率

我们首先给出C++完整程序,之后对程序中每一行代码进行介绍。完整程序如下:

#include <opencv2/dnn_superres.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>


using namespace std;
using namespace cv;
using namespace dnn;
using namespace dnn_superres;


int main(int argc, char *argv[])
{
    //Create the module's object
    DnnSuperResImpl sr;


    //Set the image you would like to upscale
    string img_path = "image.png";
    Mat img = cv::imread(img_path);


    //Read the desired model
    string path = "FSRCNN_x2.pb";
    sr.readModel(path);


    //Set the desired model and scale to get correct pre- and post-processing
    sr.setModel("fsrcnn", 2);


    //Upscale
    Mat img_new;
    sr.upsample(img, img_new);
    cv::imwrite( "upscaled.png", img_new);


    return 0;
}

首先加载我们选择的模型,并将其输入到神经网络的变量中。需要注意的是模型文件所存在的地址,本文放置在了程序的根目录中。

//Read the desired model
string path = "FSRCNN_x2.pb";
sr.readModel(path);

之后设置模型的种类和放大系数。本文选择的模型是fsrcnn,放大系数选择的2。

//Set the desired model and scale to get correct pre- and post-processing
sr.setModel("fsrcnn", 2);

可以选择的模型有“ edsr”,“ fsrcnn”,“ lapsrn”,“ espcn”,这几个参数就是我们刚才介绍的4中模型。需要注意的是,每个模型能够放大的倍数是不一致的。前三种模型能够放大2、3、4倍,最后一个模型能够放大2、3、4、8倍。

之后通过upsample()函数进行超分辨率放大。

//Upscale
Mat img_new;
sr.upsample(img, img_new);
cv::imwrite( "upscaled.png", img_new);

上述是C++代码,接下来给出Python实现超分辨率的代码

import cv2
from cv2 import dnn_superres


# Create an SR object
sr = dnn_superres.DnnSuperResImpl_create()


# Read image
image = cv2.imread('./input.png')


# Read the desired model
path = "EDSR_x3.pb"
sr.readModel(path)


# Set the desired model and scale to get correct pre- and post-processing
sr.setModel("edsr", 3)


# Upscale the image
result = sr.upsample(image)


# Save the image
cv2.imwrite("./upscaled.png", result)

不同于C++代码,在使用python代码时,需要先通过如下代码进行声明。

# Create an SR object
sr = dnn_superres.DnnSuperResImpl_create()

4. 处理结果

e88bb9aa2fa4dd0575654b308a77235a.png

输入图像

cb080ab124d1c49528d3f54effaa1db8.png

双线性插值放大3倍

4192d59aefacaef443546973f2e47644.png

FSRCNN放大3倍

40a280eeed74f0ec5d367140b806ef20.png

ESDR放大3倍

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

cb4e594c314eb0b0bfb8f13a738115c1.png

d8a0272c99684433584cc64f5a28a539.png

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分辨率重构是通过深度学习方法将低分辨率图像转换为高分辨率图像的过程。下面是一个基于深度学习的分辨率重构的一般步骤: 1. 数据准备:收集并准备训练数据集,包括一组低分辨率图像和对应的高分辨率图像。可以使用已有的数据集,或者自行生成数据集。 2. 构建网络模型:选择适合分辨率任务的深度学习模型,例如卷积神经网络(CNN)或生成对抗网络(GAN)。常用的模型包括SRCNN、ESPCN、SRGAN等。 3. 数据预处理:对训练数据进行预处理,包括归一化、裁剪、旋转等。可以使用图像处理库(如OpenCV)进行处理。 4. 网络训练:使用准备好的训练数据集对网络模型进行训练。通常需要定义损失函数(如均方误差)和优化器(如Adam),并迭代多个epoch进行训练。 5. 网络验证:使用验证数据集对训练好的模型进行验证,评估模型在分辨率任务上的性能。可以计算PSNR(峰值信噪比)等指标来评估重建质量。 6. 网络调优和改进:根据验证结果,对网络模型进行调优和改进,如调整网络结构、调整参数等。 7. 预测和重建:使用训练好的模型对新的低分辨率图像进行预测和重建,得到高分辨率图像。可以使用图像处理库进行后处理,如去噪、锐化等。 需要注意的是,分辨率重构是一个复杂的任务,需要大量的训练数据和计算资源。此外,选择合适的网络模型、损失函数和优化器也对结果影响较大。因此,深度学习实现分辨率重构需要仔细调整和优化,以获得较好的重建效果。 希望以上步骤对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值