使用opencv實現自定義卷積


對圖像進行卷積是圖像處理的基本操作,最近在研究圖像濾波,經常要用到自定義卷積,所以實現了一下

 1 #include "opencv2/imgproc/imgproc.hpp"
 2 #include "opencv2/highgui/highgui.hpp"
 3 
 4 using namespace cv;
 5 
 6 Mat get_blur_kernel(int kernel_size);//獲得歸一化濾波的卷積核
 7 
 8 int main(int argc, char ** argv)
 9 {
10     Mat src, dst;
11     Point anchor;
12     double delta;
13     int ddepth;
14     int kernel_size = 5;
15     // 生成一個掩模核 大小為kernel_size*kernel_size,這里我們用歸一化塊濾波的卷積核做示例
16     Mat kernel = get_blur_kernel(kernel_size);
17     // 載入一張圖片
18     src = imread("a.jpg");
19     if (!src.data)
20         return -1;
21 
22     // 創建窗口
23     imshow("before",src);
24     waitKey(500);
25     // 初始化濾波器參數
26     anchor = Point(-1, -1);
27     delta = 0;
28     ddepth = -1;
29     //將核設置好之后,使用函數 filter2D 就可以生成濾波器:
30     filter2D(src, dst, ddepth, kernel, anchor, delta, BORDER_DEFAULT);
31 
32     imshow("after", dst);
33     waitKey(0);
34     return 0;
35 }
36 
37 //生成歸一化濾波的卷積核,通過對kernel.ptr(i)[j]的操作來進行
38 Mat get_blur_kernel(int kernel_size)
39 {
40     Mat kernel = (Mat_<float>(kernel_size, kernel_size));
41     for (int i = 0; i < kernel_size; i++)
42     {
43         for (int j = 0; j < kernel_size; j++)
44             kernel.ptr<float>(i)[j] = 1.0 / (kernel_size*kernel_size);
45     }
46     return kernel;
47 }

卷積核kernel其實也是一個Mat對象,我們可以通過kernel.ptr(i)[j]實現對矩陣元素的直接操作,

將核設置好之后,使用opencv提供的函數 filter2D 就可以生成濾波器:

filter2D(src, dst, ddepth, kernel, anchor, delta, BORDER_DEFAULT);
其中各參數含義如下:

src : 源圖像
dst : 目標圖像
ddepth : dst 的深度。若為負值(如 - 1 ),則表示其深度與源圖像相等。
kernel : 用來遍歷圖像的核
anchor : 核的錨點的相對位置,其中心點默認為(-1, -1) 。
delta : 在卷積過程中,該值會加到每個像素上。默認情況下,這個值為 0 。
BORDER_DEFAULT : 這里我們保持其默認值,更多細節將在其他教程中詳解

只需改變卷積核,我們就可以使用類似的方法創造自定義濾波了。

 

作者: Elliott Zheng

出處: http://www.cnblogs.com/elliottzheng/p/6616869.htmlp/6664218.html>

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出, 原文鏈接 如有問題, 可郵件(elliott.zheng@foxmail.com)咨詢.


免責聲明!

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



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