利用OpenCV實現基於深度學習的超分辨率處理

轉載記錄:當所做超分辨的圖像沒有特殊需求或行業背景,圖像沒有規律時,可以不用自己訓練模型,下載調用封裝好的模型,即可實現圖像超分辨率重建效果。

以下文章來源於小白學視覺 ,作者小白

小白學視覺

哈工大在讀博士的公衆號,《從零學習OpenCV 4》的作者,面向初學者介紹計算機視覺基礎知識、OpenCV使用、SLAM技術,深度學習等內容。

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 <opencv2/dnn_superres.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

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倍,最後一個模型(LapSRN)能夠放大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倍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章