python opencv 实现基于深度学习的超分辨率处理
s超分辨率(super-resolution)的通俗解释就是:将低分辨率的图像通过算法转换成高分辨率图像。
通常的超分辨率分两种:SISR和VSR。前者叫做单图像超分辨率,后者叫做视频超分辨率。我们通常理解的超分辨率都是指SISR,我们只需要输入一张低分辨率图像而获得高分辨率图像的输出。 而VSR会利用视频的时间关联性来获得对某一帧的SR。https://muzhan.blog.csdn.net/article/details/85048846
本文讲的是利用OpenCV实现前者,实现步骤和代码基于’小白学视觉’ https://cloud.tencent.com/developer/article/1635759
操作步骤
1、首先安装OpenCV contrib模块
OpenCV中的超分辨率功能被集成在了contrib模块中,因此我们首先需要安装OpenCV的扩展模块。原文提供的安装参考过于复杂,见opencv-contrib模块的安装
实际上只需要用pip安装opencv-contrib-python这个模块就可以,我这里用的是opencv-contrib-python ==4.4.0.44版本的,亲测没有问题。**注意:**如果你已经安装了opencv-python,你需要先卸载掉opencv-python。原因:opencv有4个不同的程序包(https://pypi.org/project/opencv-contrib-python/),我们最好只选择其中一个,不要在同一环境中安装多个不同的软件包,因为没有插件架构:所有软件包都使用相同的名称空间(cv2)。
所以我们选择安装OpenCV contrib模块,它包含了opencv的主要模块和扩展模块。卸载完之前安装的opencv包,然后用pip安装,pip install opencv-contrib-python。
2、下载训练的模型
opencv代码库目前仅支持4种不同的超分辨率模型,他们可以实现2倍、3倍、4倍甚至8倍的图像方法。这些模型具体如下
EDSR:这个是表现最好的模型。但是这个模型也是最大的,所以运行速度会比较慢。
ESPCN:这个模型具有速度快,效果好的特点,并且模型较小。它可以进行对视频进行实时处理(取决于图像大小)。
FSRCNN:这也是具有快速准确推断功能的小型模型。也可以进行实时视频升频。
LapSRN:这是一个中等大小的模型,它的特点是最大可以将图像放大8倍。
模型下载地址:https://github.com/opencv/opencv_contrib/tree/master/modules/dnn_superres
3、代码实现
import cv2
from cv2 import dnn_superres
Create an SR object
sr = dnn_superres.DnnSuperResImpl_create()
Read image
image = cv2.imread(‘D:/res/test.png’)
Read the desired model
path = ‘D:/res/EDSR_x4.pb’
sr.readModel(path)
Set the desired model and scale to get correct pre- and post-processing
sr.setModel(‘edsr’, 4)
Upscale the image
result = sr.upsample(image)
Save the image
cv2.imwrite(‘D:/res/upscaled.png’, result)
再次提醒,确认只安装了opencv-contrib包,没有安装其他opencv包,不然你导入dnn_superres时会出错。
4、结果
结果就不展示了,网上随便找了个图试了下,效果和我想像的有差距,不是我要的那种效果。做了个总结,把试过的坑和实现过程写了下,大家可以自己去试试,也许是你们需要的呢。如果有自己的研究目的和数据的,可以去查看源码,构建自己的模型,EDSR、WDSR、UDSR分别为17、18、19的 NTIRE超分辨率冠军。
EDSR:
github(pytorch): https://github.com/thstkdgus35/EDSR-PyTorch
WDSR:
github(pytorch):https://github.com/JiahuiYu/wdsr_ntire2018