999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Eigen和OpenCV的圖像算法加速

2017-12-29 06:25:39秦肖臻
網絡安全與數據管理 2017年24期

舒 暢,秦肖臻

(華中科技大學 自動化學院,湖北 武漢 430074)

基于Eigen和OpenCV的圖像算法加速

舒 暢,秦肖臻

(華中科技大學 自動化學院,湖北 武漢430074)

OpenCV作為一款免費、開源的計算機視覺庫已廣泛應用于圖像處理的各種項目開發中。在算法實現中,高性能的線性代數運算庫能提升算法的執行效率和算法實現靈活性。介紹了Eigen線性代數運算庫,并在矩陣運算效率上與OpenCV進行了比較。以基于SVD分解的圖像壓縮算法為例,將Eigen和OpenCV進行聯合編程并給出了主要代碼。

OpenCV;Eigen;圖像處理;算法加速

0 引言

在數字圖像處理中,先將圖像傳感器獲取的數據進行采樣和量化。處理后的圖像數據可以等價為一個實數矩陣,該矩陣中的每個元素稱為像素[1]。因此向量和矩陣等線性代數運算成為數字圖像處理的基本和必備工具。

OpenCV[2]封裝了部分常用的線性代數運算操作,比如矩陣相乘、求逆、矩陣奇異值分解(SVD)以及解線性方程組等。這些數學操作是大部分圖像處理算法的基本構成單元,對其進行軟件優化和硬件加速[3]可以很大程度上縮短圖像處理算法的運行時間,提升算法的實時性。將OpenCV與Eigen進行聯合編程可以很大程度突破大型矩陣運算時的速度瓶頸。

1 Eigen庫介紹

1.1 Eigen簡介

Eigen[4]是基于C++模板技術、為線性代數計算進行高度優化的開源庫。著名深度學習框架TensorFlow[5]中的許多核心算法實現也借助[6]于Eigen庫。Eigen具有如下特點。

(1)與OpenCV相比,Eigen原生支持復數型矩陣和動態維度矩陣,給算法實現帶來了很大的便利和靈活性。

(2)除了運算上的優化和通過C++模板技術支持惰性求值(Lazy Evaluation),同時還可以對SSE 2/3/4,ARM NEON等指令集進行專門的向量化(Vectorization)編譯加速。

1.2 基于Eigen庫的開發

除了C++標準庫外,Eigen不依賴于任何第三方包而且使用簡便。以Microsoft Visual Studio Community 2015為例,將Eigen頭文件所在路徑添加到項目的引用目錄便可完成開發環境的配置。

2 OpenCV與Eigen矩陣運算性能比較

2.1 矩陣運算性能測試環境

性能測試平臺的主要硬件參數包括型號為Intel i7-4790K(主頻4 GHz)的處理器、容量為8.0 GB的內存。軟件測試環境為Windows 64位系統以及Microsoft Visual Studio Community 2015。隨著版本升級,開源軟件的性能也會有很大提升。測試時均選取當前代碼庫的最新版本,即OpenCV3.2.0以及Eigen3.3.3。

性能測試中選取了矩陣求逆、SVD矩陣分解兩項計算量大且較常用的矩陣運算,分別以浮點型和雙精度方式運算。矩陣維度主要包括50×50、100×100、200×200、500×500、1 000×1 000共5類。為了消除數據大小對不同維度矩陣計算的影響,先用隨機數同時填充在OpenCV和Eigen中維度為1 000×1 000的矩陣,再將1 000×1 000型矩陣分塊為其他小尺寸矩陣。為了接近真實編程場景,矩陣運算后會將結果賦值給新的變量,而不是單純計算矩陣函數所需時間。其中隨機數的范圍取為[-10,100]。以雙精度、大小為20×20和1 000×1 000的矩陣和SVD分解為例,性能測試的主要函數代碼如下:

void createMatd(Mat &mat,MatrixXd &emat,int dim)

{

random_device rd;

//聲明隨機數生成器

double* p = NULL;

//指向OpenCV圖像矩陣的行指針

double temp;

for (int i = 0; i < dim; i++)

{

p=mat.ptr(i);

for (int j = 0; j < dim; j++)

{

uniform_real_distribution dist(-10,100);

temp = dist(rd);

//如果是單精度或者雙精度保留三位小數

temp = (int)(temp * 1000 + 0.5);

temp = (double)(temp / 1000);

emat(i,j) = temp;

p[j] = temp;

}

}

}

//OpenCV矩陣SVD分解測試函數

void cvSVDOperation(Mat testMat)

{

clock_t tCount = clock();

for (int count = 0; count < 100; count++)

{

SVD tempMat(testMat,SVD::FULL_UV);

Mat U=tempMat.u;

Mat W=tempMat.w;

}

printf("Time taken: %.10f s ",(double)(clock() -tCount) / CLOCKS_PER_SEC / 100);

}

//Eigen矩陣SVD分解測試函數

template

void eigenSVDOperation(T testeigenMat)

{

clock_t tCount = clock();

for (int count = 0; count < 100; count++)

{

BDCSVD svd(testeigenMat,ComputeFullV | ComputeFullU);

T U = svd.matrixU();

T V = svd.matrixV();

}

printf("Time taken: %.10f s ",(double)(clock() -tCount) / CLOCKS_PER_SEC / 100);

}

2.2 矩陣運算性能測試結果及分析

運行矩陣運算性能測試程序,分別記錄在不同矩陣運算精度和矩陣大小下的運行時間,進行整理后如表1~4所示。從表中可以看出:

(1)從元素數值類型的角度而言,在OpenCV中隨著矩陣維數增加,浮點型運算的效率較雙精度運算效率提升較??;相反Eigen對于大矩陣,浮點型運算比雙精度要快兩倍左右。

(2)從開發庫的角度比較,對于類似20×20的小矩陣,Eigen略顯遜色。而隨著矩陣維度的增加,優勢越來越明顯。對于1 000×1 000的矩陣,在浮點型矩陣求逆運算上比OpenCV快6.09倍;在雙精度矩陣求逆運算上比OpenCV快18.02倍。

表1 浮點型矩陣求逆運算對比 (ms)

表2 雙精度矩陣求逆運算對比 (ms)

表3 浮點型矩陣SVD分解對比 (ms)

表4 雙精度矩陣SVD分解對比 (ms)

3 基于Eigen、OpenCV聯合編程的圖像壓縮算法

3.1 SVD矩陣分解介紹

SVD分解在實數范圍內,將一個秩為r的矩陣Am*n分解為如下形式:

A=UΣVH

(1)

其中U是m×m的正交矩陣,V是n×n的正交矩陣,分塊矩陣Σ的形式如下:

(2)

其中Δ是秩為r的對角矩陣,Δ對角線上的元素稱為奇異值。設矩陣A的奇異值為σ1>=σ2>=…>=σr>0,ui、vi對應矩陣U、V的第i列,則矩陣A的奇異值展開式如下:

A=σ1u1v1+σ2u2v2+…+σrurvr

(3)

3.2 Eigen和OpenCV聯合編程

在Eigen中,矩陣數據默認按列優先進行存儲;在OpenCV中,矩陣數據按行優先進行存儲。Eigen和OpenCV聯合編程時,需要對它們進行轉換,OpenCV矩陣轉Eigen矩陣的代碼如下:

Matimg;

//轉換為Eigen中的矩陣

Eigen::Map> eigenMat(image.ptr(),image.rows,image.cols);

在上述轉換過程中,主要是對內存中數據的復用,并沒有大量耗時的數據復制等操作,幾乎不占用額外時間。

Eigen矩陣轉OpenCV矩陣可以調用函數eigen2cv,函數的第一個參數為待轉換的Eigen矩陣,第二個參數是OpenCV目標矩陣。對于1 000×1 000的雙精度矩陣,100次轉換時間均值為2~3 ms。對于大矩陣SVD分解而言,這個轉換時間在可接受范圍內。

3.3 基于SVD矩陣分解的圖像壓縮算法

在公式(3)中,較大的奇異值所對應的項包含更多的圖像信息,只取矩陣A中部分較大的奇異值,相對于m×n的存儲量,只需r×(m+n+1)的存儲空間。r越小,圖片壓縮率越大,但圖片也會逐漸變得模糊。

這里選取的測試圖片分辨率為500×500,SVD分解后的奇異值個數為498,選取位于前20、50、100較大的奇異值來重構原矩陣。以位于前20的奇異值重構原矩陣為例,主要代碼如下:

Matimg = imread("lenna.png");

//讀取圖片

cvtColor(img,img,CV_BGR2GRAY);

//轉化為灰度圖像

img.convertTo(img,CV_64FC1);

//轉化為雙精度矩陣

int m = img.rows;

//得到圖像行、列值

int n = img.cols;

//將OpenCV中的矩陣轉化為Eigen中矩陣

Eigen::Map>

eMat(img.ptr(),m,n);

//在Eigen中進行SVD分解

BDCSVD svd(eMat,ComputeFullV | ComputeFullU);

MatrixXd U = svd.matrixU();

MatrixXd V = svd.matrixV();

MatrixXd S = svd.singularValues();

//通過奇異值構造分塊矩陣Σ

MatrixXd diag(m,n);

diag.setZero();

//取前100個奇異值填充分塊矩陣Σ對角線

for (int i = 0; i < 100; i++)

diag(i,i) = S(i,0);

V.transposeInPlace()

MatrixXd recImg = U*diag*V;

MatcvMat = Mat::zeros(recImg.rows(),recImg.cols(),CV_64FC1);

eigen2cv(recImg,cvMat);

cvMat.convertTo(cvMat,CV_8UC1);

imwrite("100.png",cvMat);

原圖和重構圖像如圖1~4所示。

圖1 前20個奇異值

圖2 前50個奇異值

圖3 前100個奇異值

圖4 原圖

可以發現,圖3基本保留了原圖的大部分細節,在不放大圖像的情況下與原圖幾乎毫無差異,同時達到了約2.5倍的壓縮比。

4 結論

基于Eigen線性代數庫加速的OpenCV圖像處理程序在實際運行速度上有明顯的提升,同時Eigen更加豐富的矩陣運算操作也給算法實現帶來了很大的便利。隨著新的圖像處理算法不斷提出,Eigen也將越來越廣泛地應用到算法的具體實現中。本文中OpenCV和Eigen聯合編程的方法對于其他需要加速的圖像算法具有較高的參考價值。

[1] GONZALEZ R C,WOODS R E. 數字圖像處理[M].阮秋琦,阮宇智,譯.3版.北京:電子工業出版社,2011.

[2] OpenCV. Introduction[EB/OL].(2016-12-23)[2017-06-30]https://docs.opencv.org/3.2.0/d1/dfb/intro.html.

[3] 張俊濤,王園偉,龐多.一種硬件加速OpenCV的圖像處理方法研究[J].微型機與應用,2015,34(22):41-43.

[4] JACOBB B,GUENNEBAUD G. Eigen is a C++ template library for linear algebra: matrices,vectors,numerical solvers,and related algorithms[EB/OL].[2017-06-30]http://eigen.tuxfamily.org/index.php?title=Main_Page.

[5] Google. Getting started with TensorFlow[EB/OL].[2017-06-30]https://www.tensorflow.org/get_started/get_started.

[6] ABADI M,AGARWAL A,BARHAM P,et al. Tensorflow: large-scale machine leaning on heterogeneous distributed system[J/OL].(2016-03-14)[2017-06-30]https://arxiv.org/abs/1603.04467.

Image algorithm acceleration based on Eigen and OpenCV

Shu Chang,Qin Xiaozhen

(School of Automation,Huazhong University of Science and Technology,Wuhan 430074,China)

As a free and open-source computer vision library,OpenCV has been widely used in image processing of various project development. During the algorithm implementation,the high performance linear algebraic library can improve the efficiency of the algorithm and the flexibility of the algorithm implementation. This paper introduces the linear algebraic computation library Eigen and compares it with OpenCV in matrix operation efficiency. Taking the image compression algorithm based on SVD decomposition as an example,Eigen and OpenCV are jointly programmed and the main code is given.

OpenCV; Eigen; image processing; algorithm acceleration

TP391

A

10.19358/j.issn.1674-7720.2017.24.012

舒暢,秦肖臻.基于Eigen和OpenCV的圖像算法加速J.微型機與應用,2017,36(24):40-43.

2017-06-30)

舒暢(1993-),男,碩士研究生,主要研究方向:圖像算法。

秦肖臻(1965-),女,副教授,主要研究方向:計算機集成與信號處理。

主站蜘蛛池模板: 91在线无码精品秘九色APP| 99视频有精品视频免费观看| 亚洲永久精品ww47国产| 一区二区日韩国产精久久| 亚洲乱强伦| 91丝袜美腿高跟国产极品老师| 国产精品第| 91国内视频在线观看| 日本在线免费网站| 亚洲一区二区三区国产精华液| 欧美日韩国产在线观看一区二区三区 | 97精品国产高清久久久久蜜芽| 青草国产在线视频| 国产精品 欧美激情 在线播放| 亚洲人成网站日本片| 久久国产精品电影| 成人噜噜噜视频在线观看| 91麻豆精品国产91久久久久| 色综合激情网| 亚洲欧洲日产无码AV| 亚洲区一区| 久久免费视频6| 国产99精品久久| 九色在线视频导航91| 久久99国产精品成人欧美| 久久青草视频| 亚洲免费三区| 国产人成在线观看| 国产精品粉嫩| 亚洲中文在线视频| 欧美亚洲综合免费精品高清在线观看| 国产成人亚洲综合A∨在线播放| 国产精品成人啪精品视频| 99在线国产| 精品综合久久久久久97| 国产亚洲欧美另类一区二区| 88国产经典欧美一区二区三区| 精品超清无码视频在线观看| 国产精品永久久久久| 国产亚洲精品在天天在线麻豆 | 亚洲精品自在线拍| 日本手机在线视频| 亚洲中文无码av永久伊人| 亚洲无码日韩一区| 国产成人AV综合久久| 亚洲精品国产精品乱码不卞| 欧美精品三级在线| 91无码网站| 99这里只有精品免费视频| 精品国产99久久| 亚洲人成成无码网WWW| 2020极品精品国产 | 午夜无码一区二区三区| 伊人久综合| 免费啪啪网址| 免费亚洲成人| 亚洲最新地址| 国产原创演绎剧情有字幕的| 免费又爽又刺激高潮网址| 国外欧美一区另类中文字幕| 极品私人尤物在线精品首页| 99一级毛片| 日韩第一页在线| 精品国产中文一级毛片在线看 | 四虎永久在线精品影院| 久久夜色精品国产嚕嚕亚洲av| 国产在线观看精品| 中文字幕 日韩 欧美| 视频一本大道香蕉久在线播放| 免费国产一级 片内射老| 国产精品大白天新婚身材| 中文字幕人妻av一区二区| 最新痴汉在线无码AV| 色婷婷狠狠干| 成人欧美日韩| 日本黄网在线观看| 91九色国产在线| 亚洲一区毛片| 超清无码一区二区三区| 亚洲熟女中文字幕男人总站| 国产日韩精品欧美一区灰| 精品91自产拍在线|