利用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 modelstring path = "FSRCNN_x2.pb";sr.readModel(path);
之后设置模型的种类和放大系数。本文选择的模型是fsrcnn,放大系数选择的2。
//Set the desired model and scale to get correct pre- and post-processingsr.setModel("fsrcnn", 2);
可以选择的模型有“ edsr”,“ fsrcnn”,“ lapsrn”,“ espcn”,这几个参数就是我们刚才介绍的4中模型。需要注意的是,每个模型能够放大的倍数是不一致的。前三种模型能够放大2、3、4倍,最后一个模型能够放大2、3、4、8倍。
之后通过upsample()函数进行超分辨率放大。
//UpscaleMat img_new;sr.upsample(img, img_new);cv::imwrite( "upscaled.png", img_new);
上述是C++代码,接下来给出Python实现超分辨率的代码
import cv2from cv2 import dnn_superres
# Create an SR objectsr = dnn_superres.DnnSuperResImpl_create()
# Read imageimage = cv2.imread('./input.png')
# Read the desired modelpath = "EDSR_x3.pb"sr.readModel(path)
# Set the desired model and scale to get correct pre- and post-processingsr.setModel("edsr", 3)
# Upscale the imageresult = sr.upsample(image)
# Save the imagecv2.imwrite("./upscaled.png", result)
不同于C++代码,在使用python代码时,需要先通过如下代码进行声明。
# Create an SR objectsr = dnn_superres.DnnSuperResImpl_create()
4. 处理结果
输入图像

双线性插值放大3倍

FSRCNN放大3倍

ESDR放大3倍

(0)

相关推荐

  • (11条消息) Opencv 读取灰度图像会识别为3通道问题

    最近初接触图像cv,一切都是从零开始因此遇到了许多问题,故在此记录遇到的问题方便提醒自己也方便后来人不再困惑. 场景: 我们都知道灰度图或者红外图都是单通道图片,而彩色图片是三通道图片.但是当我们用i ...

  • Python+opencv 图像处理(五)

        灰度反转 "你说的黑是什么黑......"有一首歌的歌词是这样的. 在图像中,黑是什么? 很简单,就是0嘛. 因为在数字图像里,用0表示黑. 那么,"你说的白是什 ...

  • 使用OpenCV内置深度学习人脸模块,几行代码轻松完成人脸检测和识别

    作者:冯远滔(OpenCV China),王成瑞(北京邮电大学),钟瑶瑶(北京邮电大学) 最新发布的OpenCV 4.5.4版本收录了一个基于深度学习神经网络的人脸模块(以下称"OpenCV ...

  • 使用opencv

    终于等到python版本的opencv4.4版本了,不用麻烦的编译opencv4.4,就可以调用yolov4模型了.昨天更新的版本! 在opencv4.4出来之前,通过编译darknet来推理yolo ...

  • python+opencv图像处理(二)

    python+opencv图像处理(二) ----图像变换 自然界中有很多的颜色,红红的花,绿绿的草,蓝蓝的天,白白的云,多姿多彩的世界,美轮美奂的图像. 通过手机,照相机就可以定格每一个美的瞬间. ...

  • 使用Python读取图片中的文本数据

    CoolAuthor:Dario RadečićTitle: Read Text from Image with One Line of Python CodeSite https://towards ...

  • OpenCV-Python在一个窗口中显示多幅图像

    在使用opencv显示图像时,有时候需要显示多张图像,就会出现多个窗口,显得冗余,用户不易观看.这时候就想着能不能将这些图像在一个窗口中显示.本文将介绍两种方法去实现. 方法1:创建空画布,将所有图像 ...

  • (9条消息) 【OpenCV】OpenCV4调用tensorflow pb模型进行目标检测

    先在visual studio 2015新建一个工程并配置好环境. OpenCV调用tensorflow的pb模型,不仅需要一个.pb文件,还需要一个.pbtxt文件. 一些预训练好的pb模型的下载地 ...

  • python+opencv图像处理(四十三)

    Luplacian算子 1.Luplacian算子 可以用二阶导数可以用来检测边缘,拉普拉斯算子是线性二阶微分算子. 2.Luplacian算子实现 在 OpenCV 中, 可以用函数Laplacia ...

  • Opencv实践

    Opencv实践 前言 一.安装库 二.基本操作 三.问题解决 结束语 前言  最近项目需要对图像进行一些预处理,想起了opencv这个好工具,话不多说,直接上笔记! 一.安装库 1.网上查找代码会看 ...