什么是超分辨率
说白了就是把图片的尺寸放大到原本的尺寸以上,但是这个放大一般都是有损的,因为小图片会丢失很多细节信息。但是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
,就传递espcn
给alg_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模块直接进行神经网络模型的结果计算了。