2020.11.05 使用OpenCV进行自定义线性滤波 【OpenCV C++ Robert/Sobel/Laplace】

使用OpenCV进行自定义线性滤波/Robert/Sobel/Laplace

源代码:

// testOpencv14.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

const char* inWin = "input window";
const char* outWin = "output window";

Mat src, dst;


int main()
{
   // std::cout << "Hello World!\n";
    src = imread("E:/imageSources/3.jpg");
    if (!src.data) {
        printf("cannot load image,please check your code!");
        return -1;
    }

    namedWindow(inWin, WINDOW_AUTOSIZE);
    namedWindow(outWin, WINDOW_AUTOSIZE);
    imshow(inWin,src);
    //===========================robert=====================================//
    robert算子 X轴方向
    //Mat kernal_robert_X=(Mat_<int>(2,2) << 1,0,0,-1);
    robert算子 Y轴方向
    //Mat kernal_robert_Y = (Mat_<int>(2, 2) << 0, 1, -1, 0);

    //filter2D(src,dst,-1, kernal_robert_X,Point(-1,-1),0.0);
    //imshow(outWin,dst);
    //filter2D(src, dst, -1, kernal_robert_Y, Point(-1, -1), 0.0);
    //imshow("Robert_Y", dst);

    //==========================sobel======================================//
    Sobel算子 X轴方向
    //Mat kernal_sobel_X=(Mat_<int>(3,3) << -1,0,1,-2,0,2,-1,0,1);
    Sobel算子 Y轴方向
    //Mat kernal_sobel_Y = (Mat_<int>(3, 3) << -1,-2,-1,0,0,0,1,2,1);

    //filter2D(src,dst,-1, kernal_sobel_X,Point(-1,-1),0.0);
    //imshow(outWin,dst);
    //filter2D(src, dst, -1, kernal_sobel_Y, Point(-1, -1), 0.0);
    //imshow("Y", dst);

    //=======================Laplace Operator===============================//
    Laplace算子
    //Mat kernal_laplace = (Mat_<int>(3, 3) << 0, -1, 0, -1, 4, -1, 0, -1, 0);

    //filter2D(src, dst, -1, kernal_laplace, Point(-1, -1), 0.0);
    //imshow(outWin, dst);

    //========================自定义模糊算子================================//
    int c = 0;
    int index = 0;
    int kernalSize = 0;
    while (true)
    {
        c = waitKey(500);
        if ((char)c == 27) //按下ESC键  
        {
            break;
        }

        kernalSize = 0 + (index % 5)*2 + 1 ;//一定要保证Kernal的值为单数
        Mat kernalCustomalized = Mat::ones(Size(kernalSize, kernalSize), CV_32F) / (float)(kernalSize * kernalSize);
        filter2D(src,dst,-1,kernalCustomalized,Point(-1,-1),0.0);
        index++;
        imshow(outWin, dst);
    }


    waitKey(0);
    return 0;
}

RobertX,Y算子处理结果:

Sobel算子X,Y处理结果:

Laplace算子处理结果:

自定义线性滤波处理效果(动态模糊处理):

(代码运行结果为动态模糊,即模糊程度逐渐加深,没有上传视频截取的图片)