亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2017-12-29 06:25:39秦肖臻
        關(guān)鍵詞:浮點(diǎn)圖像處理編程

        舒 暢,秦肖臻

        (華中科技大學(xué) 自動(dòng)化學(xué)院,湖北 武漢 430074)

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

        舒 暢,秦肖臻

        (華中科技大學(xué) 自動(dòng)化學(xué)院,湖北 武漢430074)

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

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

        0 引言

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

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

        1 Eigen庫(kù)介紹

        1.1 Eigen簡(jiǎn)介

        Eigen[4]是基于C++模板技術(shù)、為線性代數(shù)計(jì)算進(jìn)行高度優(yōu)化的開源庫(kù)。著名深度學(xué)習(xí)框架TensorFlow[5]中的許多核心算法實(shí)現(xiàn)也借助[6]于Eigen庫(kù)。Eigen具有如下特點(diǎn)。

        (1)與OpenCV相比,Eigen原生支持復(fù)數(shù)型矩陣和動(dòng)態(tài)維度矩陣,給算法實(shí)現(xiàn)帶來(lái)了很大的便利和靈活性。

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

        1.2 基于Eigen庫(kù)的開發(fā)

        除了C++標(biāo)準(zhǔn)庫(kù)外,Eigen不依賴于任何第三方包而且使用簡(jiǎn)便。以Microsoft Visual Studio Community 2015為例,將Eigen頭文件所在路徑添加到項(xiàng)目的引用目錄便可完成開發(fā)環(huán)境的配置。

        2 OpenCV與Eigen矩陣運(yùn)算性能比較

        2.1 矩陣運(yùn)算性能測(cè)試環(huán)境

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

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

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

        {

        random_device rd;

        //聲明隨機(jī)數(shù)生成器

        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);

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

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

        temp = (double)(temp / 1000);

        emat(i,j) = temp;

        p[j] = temp;

        }

        }

        }

        //OpenCV矩陣SVD分解測(cè)試函數(shù)

        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分解測(cè)試函數(shù)

        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 矩陣運(yùn)算性能測(cè)試結(jié)果及分析

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

        (1)從元素?cái)?shù)值類型的角度而言,在OpenCV中隨著矩陣維數(shù)增加,浮點(diǎn)型運(yùn)算的效率較雙精度運(yùn)算效率提升較?。幌喾碋igen對(duì)于大矩陣,浮點(diǎn)型運(yùn)算比雙精度要快兩倍左右。

        (2)從開發(fā)庫(kù)的角度比較,對(duì)于類似20×20的小矩陣,Eigen略顯遜色。而隨著矩陣維度的增加,優(yōu)勢(shì)越來(lái)越明顯。對(duì)于1 000×1 000的矩陣,在浮點(diǎn)型矩陣求逆運(yùn)算上比OpenCV快6.09倍;在雙精度矩陣求逆運(yùn)算上比OpenCV快18.02倍。

        表1 浮點(diǎn)型矩陣求逆運(yùn)算對(duì)比 (ms)

        表2 雙精度矩陣求逆運(yùn)算對(duì)比 (ms)

        表3 浮點(diǎn)型矩陣SVD分解對(duì)比 (ms)

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

        3 基于Eigen、OpenCV聯(lián)合編程的圖像壓縮算法

        3.1 SVD矩陣分解介紹

        SVD分解在實(shí)數(shù)范圍內(nèi),將一個(gè)秩為r的矩陣Am*n分解為如下形式:

        A=UΣVH

        (1)

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

        (2)

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

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

        (3)

        3.2 Eigen和OpenCV聯(lián)合編程

        在Eigen中,矩陣數(shù)據(jù)默認(rèn)按列優(yōu)先進(jìn)行存儲(chǔ);在OpenCV中,矩陣數(shù)據(jù)按行優(yōu)先進(jìn)行存儲(chǔ)。Eigen和OpenCV聯(lián)合編程時(shí),需要對(duì)它們進(jìn)行轉(zhuǎn)換,OpenCV矩陣轉(zhuǎn)Eigen矩陣的代碼如下:

        Matimg;

        //轉(zhuǎn)換為Eigen中的矩陣

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

        在上述轉(zhuǎn)換過(guò)程中,主要是對(duì)內(nèi)存中數(shù)據(jù)的復(fù)用,并沒(méi)有大量耗時(shí)的數(shù)據(jù)復(fù)制等操作,幾乎不占用額外時(shí)間。

        Eigen矩陣轉(zhuǎn)OpenCV矩陣可以調(diào)用函數(shù)eigen2cv,函數(shù)的第一個(gè)參數(shù)為待轉(zhuǎn)換的Eigen矩陣,第二個(gè)參數(shù)是OpenCV目標(biāo)矩陣。對(duì)于1 000×1 000的雙精度矩陣,100次轉(zhuǎn)換時(shí)間均值為2~3 ms。對(duì)于大矩陣SVD分解而言,這個(gè)轉(zhuǎn)換時(shí)間在可接受范圍內(nèi)。

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

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

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

        Matimg = imread("lenna.png");

        //讀取圖片

        cvtColor(img,img,CV_BGR2GRAY);

        //轉(zhuǎn)化為灰度圖像

        img.convertTo(img,CV_64FC1);

        //轉(zhuǎn)化為雙精度矩陣

        int m = img.rows;

        //得到圖像行、列值

        int n = img.cols;

        //將OpenCV中的矩陣轉(zhuǎn)化為Eigen中矩陣

        Eigen::Map>

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

        //在Eigen中進(jìn)行SVD分解

        BDCSVD svd(eMat,ComputeFullV | ComputeFullU);

        MatrixXd U = svd.matrixU();

        MatrixXd V = svd.matrixV();

        MatrixXd S = svd.singularValues();

        //通過(guò)奇異值構(gòu)造分塊矩陣Σ

        MatrixXd diag(m,n);

        diag.setZero();

        //取前100個(gè)奇異值填充分塊矩陣Σ對(duì)角線

        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);

        原圖和重構(gòu)圖像如圖1~4所示。

        圖1 前20個(gè)奇異值

        圖2 前50個(gè)奇異值

        圖3 前100個(gè)奇異值

        圖4 原圖

        可以發(fā)現(xiàn),圖3基本保留了原圖的大部分細(xì)節(jié),在不放大圖像的情況下與原圖幾乎毫無(wú)差異,同時(shí)達(dá)到了約2.5倍的壓縮比。

        4 結(jié)論

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

        [1] GONZALEZ R C,WOODS R E. 數(shù)字圖像處理[M].阮秋琦,阮宇智,譯.3版.北京:電子工業(yè)出版社,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].微型機(jī)與應(yīng)用,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.微型機(jī)與應(yīng)用,2017,36(24):40-43.

        2017-06-30)

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

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

        猜你喜歡
        浮點(diǎn)圖像處理編程
        我家有只編程貓
        我家有只編程貓
        我家有只編程貓
        我家有只編程貓
        LEO星座增強(qiáng)GNSS PPP模糊度浮點(diǎn)解與固定解性能評(píng)估
        基于浮點(diǎn)DSP的鐵路FSK信號(hào)檢測(cè)
        機(jī)器學(xué)習(xí)在圖像處理中的應(yīng)用
        電子制作(2018年18期)2018-11-14 01:48:20
        模糊圖像處理,刑事偵查利器
        圖像處理技術(shù)的實(shí)戰(zhàn)應(yīng)用
        基于FPGA的浮點(diǎn)FIR濾波器設(shè)計(jì)
        国产av天堂成人网| 久久天天躁夜夜躁狠狠| 99国产精品无码| 亚洲欧美国产日韩字幕| 蜜桃视频在线免费观看一区二区| 精品国产自在现线看久久| 巨大巨粗巨长 黑人长吊| 曰本无码人妻丰满熟妇5g影院| 亚欧同人精品天堂| 国产成人精品一区二区不卡 | 99久久精品午夜一区二区| 精品午夜福利1000在线观看| 亚洲蜜芽在线精品一区| 久久亚洲春色中文字幕久久| 国99久9在线 | 免费| 国产精品99久久免费| 不打码在线观看一区二区三区视频| 国产一区二区三区在线男友| 欧美人做人爱a全程免费| 在线观看国产高清免费不卡黄| 亚洲区福利视频免费看| 亚洲男人av天堂久久资源| 熟女精品视频一区二区三区| 在线观看网址你懂的| 人妻露脸国语对白字幕| 日本韩国男男作爱gaywww| 越南女子杂交内射bbwbbw| 久久夜色精品国产噜噜噜亚洲av| 亚洲一区二区三区在线看| 国产熟女内射oooo| 日日人人爽人人爽人人片av| 性感人妻av在线播放| 国产精品亚洲第一区二区三区| 亚洲国产精品日韩av专区| 国产精品久久久一本精品| 熟女免费视频一区二区| 精品无码无人网站免费视频| 亚洲综合性色一区| 日本高清无卡一区二区三区| 日本边添边摸边做边爱喷水 | 在线中文字幕乱码英文字幕正常 |