1. 程式人生 > >0024-利用OpenCV的filter2D函式作影象的卷積操作和協相關操作

0024-利用OpenCV的filter2D函式作影象的卷積操作和協相關操作

影象的卷積操作是影象處理中最常用的操作之一,一般是用核算子來實現卷積操作。什麼叫核算子?請移步博文https://blog.csdn.net/lehuoziyuan/article/details/84101788

OpenCV用函式filter2D來實現對影象或矩陣的卷積操作。這個函式本質上做的是協相關操作,但是當核算子是對稱的,則協相關操作也是卷積操作,計算公式如下。

當核算子不是對稱的時候,則需要把核算子旋轉180度,然後再把核算子的錨點改為(kernel.cols - anchor.x - 1, kernel.rows - anchor.y - 1),這樣做的運算就是卷積運算了

函式filter2D的原型如下


C++: void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )
引數意義說明
src:源矩陣或影象
dst:輸出矩陣或影象
ddepth:輸出影象的深度。如果這個值是負者,那麼輸出影象的深度和源影象一致。可以是如下的組合:
src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_64F, ddepth = -1/CV_64F
kerne
l:核算子,即我上面說的視窗矩陣。它的型別是單通道的浮點矩陣。如果你想處理多通道的影象矩陣,則可以一個通道一個通道的處理。
anchor:錨點。視窗遍歷運算結果替換的位置。預設值為(-1,-1),代表錨點是視窗的中心點。
delta:結果偏移值。
borderType: 這個引數的意義見博文https://blog.csdn.net/lehuoziyuan/article/details/84101788
還需要說明一下,預設值:BORDER_DEFAULT=BORDER_REFLECT_101,即上面的第三種

示例程式碼如下
影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!


程式碼中用到的影象的下載連結為:http://pan.baidu.com/s/1c2ETzwc 密碼:pvnz

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>

#include <iostream>

using namespace cv;
using namespace std;


int main()
{
        cv::Mat srcImage = cv::imread("zhi_zhi_hua.jpg", 0);
        if (srcImage.empty())
                return -1;
        // 定義低通濾波的卷積核算子
        cv::Mat kernel = (cv::Mat_<float>(3, 3) << 1, 1, 1,
                1, 1, 1,
                1, 1, 1);
        imshow("srcImage", srcImage);
        srcImage.convertTo(srcImage, CV_32F); 
        cv::Mat resultImage;

        int ddepth = -1;

        //卷積操作
        filter2D(srcImage, resultImage, -1, kernel);

        normalize(resultImage, resultImage, 0, 1, CV_MINMAX);
        cv::imshow("resultImage", resultImage);
        cv::waitKey(0);
        return 0;
}


程式碼說明
程式碼中的卷積核算子的效果相當於一個低通濾波器,則影象的高頻分量被濾除,這樣影象的細節就不清楚了。執行結果的截圖如下: