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. 處理結果
輸入影象
雙線性插值放大3倍
FSRCNN放大3倍
ESDR放大3倍