OpenCV实现可分离滤波

 更新时间:2021年06月23日 11:54:55   作者:我有一個夢想  
这篇文章主要为大家详细介绍了OpenCV实现可分离滤波,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

自定义滤波

无论是图像卷积还是滤波,在原图像上移动滤波器的过程中每一次的计算结果都不会影响到后面过程的计算结果,因此图像滤波是一个并行的算法,在可以提供并行计算的处理器中可以极大的加快图像滤波的处理速度。

图像滤波还具有可分离性

先对X(Y)方向滤波,再对Y(X)方向滤波的结果与将两个方向的滤波器联合后整体滤波的结果相同。两个方向的滤波器的联合就是将两个方向的滤波器相乘,得到一个矩形的滤波器

void filter2D( InputArray src, OutputArray dst, int ddepth,
                            InputArray kernel, Point anchor = Point(-1,-1),
                            double delta = 0, int borderType = BORDER_DEFAULT );
  • src:待滤波图像
  • dst:输出图像,与输入图像src具有相同的尺寸、通道数和数据类型。
  • ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围,具体的取值范围在表5-1给出,当赋值为-1时,输出图像的数据类型自动选择。
  • kernel:滤波器。
  • anchor:内核的基准点(锚点),其默认值为(-1,-1)代表内核基准点位于kernel的中心位置。基准点即卷积核中与进行处理的像素点重合的点,其位置必须在卷积核的内部。
  • delta:偏值,在计算结果中加上偏值。
  • borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
void sepFilter2D( InputArray src, OutputArray dst, int ddepth,
                               InputArray kernelX, InputArray kernelY,
                               Point anchor = Point(-1,-1),
                               double delta = 0, int borderType = BORDER_DEFAULT );
  • src:待滤波图像
  • dst:输出图像,与输入图像src具有相同的尺寸、通道数和数据类型。
  • ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围,具体的取值范围在表5-1给出,当赋值为-1时,输出图像的数据类型自动选择。
  • kernelX:X方向的滤波器,
  • kernelY:Y方向的滤波器。
  • anchor:内核的基准点(锚点),其默认值为(-1,-1)代表内核基准点位于kernel的中心位置。基准点即卷积核中与进行处理的像素点重合的点,其位置必须在卷积核的内部。
  • delta:偏值,在计算结果中加上偏值。
  • borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。

简单示例

//
// Created by smallflyfly on 2021/6/15.
//
 
#include "opencv2/highgui.hpp"
#include "opencv2/opencv.hpp"
 
#include <iostream>
 
using namespace std;
using namespace cv;
 
int main() {
    float points[] = {
            1, 2, 3, 4, 5,
            6, 7, 8, 9, 10,
            11, 12, 13, 14, 15,
            16, 17, 18, 19, 20,
            21, 22, 23, 24, 25
    };
    Mat data(5, 5, CV_32FC1, points);
 
    // 验证高斯滤波器可分离
    Mat gaussX = getGaussianKernel(3, 1);
    cout << gaussX << endl;
    Mat gaussDstData, gaussDataXY;
    GaussianBlur(data, gaussDstData, Size(3, 3), 1, 1, BORDER_CONSTANT);
    sepFilter2D(data, gaussDataXY, -1, gaussX, gaussX, Point(-1, -1), 0, BORDER_CONSTANT);
    cout << gaussDstData << endl;
    cout << gaussDataXY << endl;
    cout << "######################################" << endl;
 
    // Y方向上滤波
    Mat a = (Mat_<float>(3, 1) << -1, 3, -1);
    // X方向上滤波
    Mat b = a.reshape(1, 1);
    // XY联合滤波
    Mat ab = a * b;
    Mat dataX, dataY, dataXY1, dataXY2, dataSepXY;
    filter2D(data, dataX, -1, b);
    filter2D(dataX, dataXY1, -1, a);
    filter2D(data, dataXY2, -1, ab);
    sepFilter2D(data, dataSepXY, -1, a, b);
 
    // 验证结果
    cout << dataXY1 << endl;
    cout << dataXY2 << endl;
    cout << dataSepXY << endl;
 
    Mat im = imread("test.jpg");
    resize(im, im, Size(0, 0), 0.5, 0.5);
 
    Mat imX, imY, imXY, imSepXY;
    filter2D(im, imX, -1, b);
    filter2D(imX, imXY, -1, a);
    sepFilter2D(im, imSepXY, -1, a, b);
 
    imshow("imXY", imXY);
    imshow("imSepXY", imSepXY);
 
    waitKey(0);
    destroyAllWindows();
 
    return 0;
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 一文带你了解C语言中的0长度数组(可变数组/柔性数组)

    一文带你了解C语言中的0长度数组(可变数组/柔性数组)

    众所周知, GNU/GCC 在标准的 C/C++ 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展,本文就来聊聊零长度数组的相关知识吧
    2023-03-03
  • C语言实现贪吃蛇超详细教程

    C语言实现贪吃蛇超详细教程

    本文详细讲解了C语言实现贪吃蛇的方法,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • C++之友元:友元函数和友元类详解

    C++之友元:友元函数和友元类详解

    友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
    2013-09-09
  • Qt实现转动轮播图

    Qt实现转动轮播图

    这篇文章主要为大家详细介绍了Qt实现转动轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C语言实现贪吃蛇游戏演示

    C语言实现贪吃蛇游戏演示

    这篇文章主要为大家详细介绍了C语言实现贪吃蛇游戏演示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Linux下实现C++操作Mysql数据库

    Linux下实现C++操作Mysql数据库

    由于工作需要抽出一周的时间来研究C/C++访问各种数据库的方法,并打算封装一套数据库操作类,现在奉上最简单的一部分:在Linux下访问MySQL数据库。
    2017-05-05
  • C++深入探究引用的使用

    C++深入探究引用的使用

    引用是C++一个很重要的特性,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价,这篇文章主要给大家总结介绍了C++中引用的相关知识点,需要的朋友可以参考下
    2022-05-05
  • 深入理解C语言的指针

    深入理解C语言的指针

    这篇文章主要为大家介绍了C语言的指针,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • opencv实现图像平移

    opencv实现图像平移

    这篇文章主要为大家详细介绍了opencv实现图像平移,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++中的按位与&、按位与或|、按位异或^运算符详解

    C++中的按位与&、按位与或|、按位异或^运算符详解

    这篇文章主要介绍了C++中的按位与&、按位与或|、按位异或^运算符,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01

最新评论