網頁

2017年2月16日 星期四

OpenCV Mask (Filter) performance comparison


OpenCV 的內建 filter2D 函式, 實作了影像處理上常用的 Mask, 或是稱為 Filter, Convolution, 的操作. 通常這也是影像相關的演算法的骨幹, 也是最耗費時間的環節.
Mask 的運算時間, 和 Mask 的組成有絕對的關係, 以下套用不同的 Mask, 來觀察他運算時間上的差異.
比較 filter2D()以及自行撰寫的 C 函式
Index Implement ms
C Function *output++ = saturate_cast<uchar>(5*current[i]
              -current[i-nChannels] - current[i+nChannels] - previous[i] - next[i]);
64.909
filter2D Mat kernel = (Mat_<char>(3,3) <<  0, -1,  0, -1,  5, -1,   0, -1,  0);
filter2D( src, dst1, src.depth(), kernel );
3.030
以 C 的實作來說, 差不多就是以上所列出來的程度. OpenCV 可以做到將近 20 倍的速度, 應該是用了一些硬體加速的方法.
不同 Mask 的時間比較
Index Implement ms
1x1 Mat kernel_1x1 = (Mat_<char>(1,1) <<  1); 1.134
3x3 Mat kernel_3x3 = (Mat_<char>(3,3) <<  0, -1, 0, -1, 5, -1, 0, -1, 0); 2.718
5x5 Mat kernel_5x5 = (Mat_<char>(5,5) <<  0,0,-1,0,0,0,0,-1,0,0,-1,-1,9,-1,-1,0,0,-1,0,0,0,0,-1,0,0); 4.313
7x7-1 Mat kernel_7x7 = (Mat_<char>(7,7) <<
        0,0,0,-1,0,0,0,
        0,0,0,-1,0,0,0,
        0,0,0,-1,0,0,0,
        -1,-1,-1,13,-1,-1,-1,
        0,0,0,-1,0,0,0,
        0,0,0,-1,0,0,0,
        0,0,0,-1,0,0,0);
6.170
7x7-2 Mat kernel_7x7_2 = (Mat_<char>(7,7) <<
        -4,-3,-2,-1,-2,-3,-4,
        -3,-3,-2,-1,-2,-3,-3,
        -2,-2,-2,-1,-2,-2,-2,
        -1,-1,-1,107,-1,-1,-1,
        -2,-2,-2,-1,-2,-2,-2,
        -3,-3,-2,-1,-2,-3,-3,
        -4,-3,-2,-1,-2,-3,-4);
22.44
隨著 Mask 的 size 變大, 所耗費時間也跟著增加, 有趣的是 Mask 的內容也有很大的影響, 可見 OpenCV 會對於 零項作刪去的最佳化. 

沒有留言:

張貼留言

請提供您寶貴的意見