數字圖像處理之並行處理(1)


 

  在處理圖像時,會經常對像素進行操作,實時性要求較高的場所往往會使用並行處理,好在(C/C++ API)支持多種並行方式:mpi,openmp,intel ipp 等,今天記錄一種利用 openmp簡單的並行處理圖像方法:灰度圖像取反。

 

  需要用到的頭文件:#include “omp.h”,作者是基於opencv3.0處理的圖片,cpu為賽揚E3200,雙核。

話不多說上代碼:

 

#include "opencv2/opencv.hpp"
#include "omp.h"
#include "time.h"
#include <iostream>

#pragma comment(lib,"opencv_world300.lib")

using namespace cv;
using namespace std;


void normal(){
    clock_t start,end;
    Mat img = imread("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);//讀一張圖(1920*1080),轉為灰度圖//

    Mat out(img.rows,img.cols,CV_8U);//初始化輸出圖像//

    unsigned char* p=out.data;//像素指針//

    //取反//
    start = clock();
    for(int i = 0;i<img.rows*img.cols;i++){
        *p++ =0xff-img.data[i];
    }
    end = clock();

    cout<<"norm_time"<<(end-start)<<endl;


}

void test_omp(){

    clock_t start,end;
    Mat img = imread("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);//讀一張圖,轉為灰度圖//

    Mat out(img.rows,img.cols,CV_8U);//初始化輸出圖像//

    unsigned char* p=out.data;//像素指針//
    //omp//
    int num = img.rows*img.cols;//openmp 限制循環格式//

    start =clock();
#pragma omp parallel for
    for (int i = 0;i<num;i++)
    {
        *p++ =0xff -img.data[i];
    }
    end  = clock();

    cout<<"omp_time"<<(end-start)<<endl;

}



int main(){

    normal();
    test_omp();

    return 0;

}

 

release模式 結果如下:

時間單位為毫秒,雙核並行速度剛好是普通處理兩倍

 

后記:

  openmp主要用於循環級的並行程序,某些應用可能並不適合,當然由於圖像數據的特殊性正好合適;其次openmp編寫對for循環的格式要求比較多,具體細節可以參考http://www.cnblogs.com/yangyangcv/archive/2012/03/23/2413335.html。

  今天就寫這么多了,未完待續。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM