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

#include

#include

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. 處理結果

利用OpenCV實現基於深度學習的超解析度處理

輸入影象

利用OpenCV實現基於深度學習的超解析度處理

雙線性插值放大3倍

利用OpenCV實現基於深度學習的超解析度處理

FSRCNN放大3倍

利用OpenCV實現基於深度學習的超解析度處理

ESDR放大3倍

利用OpenCV實現基於深度學習的超解析度處理