OpenCV中怎么实现可分离滤波

发布时间:2021-06-23 16:19:07 作者:Leah
来源:亿速云 阅读:193

本篇文章给大家分享的是有关OpenCV中怎么实现可分离滤波,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

自定义滤波

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

图像滤波还具有可分离性

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

OpenCV中怎么实现可分离滤波

void filter2D( InputArray src, OutputArray dst, int ddepth,
                            InputArray kernel, Point anchor = Point(-1,-1),
                            double delta = 0, int borderType = 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 );

简单示例

//
// 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;
 
}

以上就是OpenCV中怎么实现可分离滤波,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

推荐阅读:
  1. opencv+python实现均值滤波
  2. 高通滤波怎么实现Python opencv示例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

opencv

上一篇:mysql中的分区类型有哪些

下一篇:javascript中怎么调用父窗口的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》