自定义线性滤波器

本文介绍如何使用OpenCV的cv::filter2D函数实现自定义线性滤波器,通过卷积操作来处理图像。文章详细解释了卷积的概念,包括核的作用、卷积计算过程,并给出了不同大小的归一化框滤波器的执行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标:

使用OpenCV中的函数cv::filter2D 自定义线性滤波器。


理论:

卷积

在一个非常普遍的意义上,卷积是一个图像的每一个部分和一个核之间的操作。


什么是核?

一个核实质上是一个固定大小矩阵,中心点被称为锚点,如下图所示。


如何利用卷积核进行卷积 ?

假设您想知道图像中某个特定位置的结果值。卷积的值以下列方式计算:
1) 将核的锚点(中心点)放在要计算像素上,卷积核剩余的部分对应在图像相应的像素上。
2) 用卷积核中的系数和图像中相应的像素值相乘,并求和。
3) 将最终结果赋值给锚点对应的像素。
4) 通过将核在整个图像滑动,重复以上计算过程直到处理完所有的像素。

用一个表达式表示以上过程如下:



代码

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
using namespace cv;
/* @function main */
int main ( int argc, char** argv )
{
  Mat src, dst;
  Mat kernel;
  Point anchor;
  double delta;
  int ddepth;
  int kernel_size;
  char* window_name = "filter2D Demo";
  int c;
  src = imread( argv[1] );
  if( !src.data )
  { return -1; }
  namedWindow( window_name, WINDOW_AUTOSIZE );
  anchor = Point( -1, -1 );
  delta = 0;
  ddepth = -1;
  int ind = 0;
  while( true )
    {
      c = waitKey(500);
      if( (char)c == 27 )
        { break; }
      kernel_size = 3 + 2*( ind%5 );
      kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);
      filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
      imshow( window_name, dst );
      ind++;
    }
  return 0;
}

结果


执行一个normalized box filter。例如核的大小为3.如下图:



代码执行时和的大小为3,5,7,9和11的结果如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值