OpenCV的超分辨率

1,204 阅读2分钟

什么是超分辨率

说白了就是把图片的尺寸放大到原本的尺寸以上,但是这个放大一般都是有损的,因为小图片会丢失很多细节信息。但是AI技术出现之后,无损放大小图片成为了可能。OpenCV也是与时俱进,增加了dnn_superres模块,可以加载预训练好的AI模型,进行超分辨率的处理。

OpenCV支持的AI模型

ESPCN

  • 模型下载地址:EDSR_Tensorflow
  • 支持x2,x3,x4
  • 优点:高精度
  • 缺点:模型文件大且运行速度慢,在我的机器上一直没有跑出来结果

ESPCN

  • 模型下载地址:TF-ESPCN
  • 支持x2,x3,x4
  • 优点:体积小,速度快,并且仍然表现良好
  • 缺点:与更新的、更健壮的模型相比,在视觉上表现更差

FSRCNN

  • 模型下载地址:FSRCNN_Tensorflow
  • 支持x2,x3,x4,small
  • 优点:快速,小巧
  • 缺点:不够准确

LapSRN

  • 模型下载地址:TF-LAPSRN
  • 支持x2,x4,x8
  • 优点:该模型可以通过一次向前传递进行多尺度超分辨率。可以支持2x,4x,8x和[2x,4x]和[2x,4x,8x]超分辨率
  • 缺点:它比ESPCN和FSRCNN慢,并且精度比EDSR差

如何使用OpenCV的超分辨率

可以通过上面的模型下载地址下载模型,模型的名字都是算法名_缩放倍数x.pb,使用代码如下

def upscale(img, alg_name, scale):
    sr = cv2.dnn_superres.DnnSuperResImpl_create()
    path = "./model/{}_x{}.pb".format(alg_name, scale)
    sr.readModel(path)
    sr.setModel(alg_name,scale)
    result = sr.upsample(img)
    return result

我把模型的名字全部都lowercase了,比如想要使用ESPCN,就传递espcnalg_name参数,scale可以选择模型支持的倍率。

使用其他超分算法

除了OpenCV支持的四种算法,我们还可以下载其他超分算法的onnx文件进行使用,比如models/super-resolution-10.onnx at main · onnx/models · GitHub,使用代码如下

def upscale_with_onnx(img):
    net = cv2.dnn.readNetFromONNX("./model/super-resolution-10.onnx")
    blob = cv2.dnn.blobFromImage(img)
    net.setInput(blob)
    out = net.forward()
    out = out.reshape((out.shape[2], out.shape[3]))
    cv2.imshow("1x", img)
    cv2.imshow("3x", out / 255)

其实就是利用OpenCV的dnn模块直接进行神经网络模型的结果计算了。