良许Linux教程网 干货合集 通过OpenCV实现可分离滤波

通过OpenCV实现可分离滤波

这篇文章主要为大家详细介绍了OpenCV实现可分离滤波,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

通过OpenCV实现可分离滤波

自定义滤波

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

图像滤波还具有可分离性

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

详细介绍OpenCV实现可分离滤波详细介绍OpenCV实现可分离滤波
详细介绍OpenCV实现可分离滤波详细介绍OpenCV实现可分离滤波
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
 
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 "######################################" "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;
 
}

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部