Opencv图像处理---线性滤波器

什么是内核?

内核本质上是固定大小的数值系数阵列以及该阵列中的锚点,其通常位于中心。

卷积如何与内核一起工作?

假设您想知道图像中特定位置的结果值。 卷积的值按以下方式计算:

  • 将内核锚点放在确定的像素上,内核的其余部分覆盖图像中相应的局部像素。
  • 将核系数乘以相应的图像像素值并对结果求和。
  • 将结果放在输入图像中锚点的位置。
  • 通过在整个图像上扫描内核,对所有像素重复此过程。

代码

代码的流程

  • 加载图像
  • 执行标准化的框过滤器。 例如,对于size size = 3的内核,内核将是:
  • 该程序将使用大小为3,5,7,9和11的内核执行过滤操作。
#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;
}

解释

  • 加载图像
  • 创建一个窗口以显示结果
  • 初始化线性过滤器的参数
  • 执行无限循环更新内核大小并将我们的线性过滤器应用于输入图像。 让我们更详细地分析一下。
  • 首先,我们定义我们的过滤器将要使用的内核。 这里是:
  • 设置内核后,我们可以使用函数cv :: filter2D生成过滤器:
  • 参数表示:
  1. src:源图像
  2. dst:目标图像
  3. ddepth:dst的深度。 负值(例如-1)表示深度与源相同
  4. kernel:要通过映像扫描的内核
  5. anchor:锚点相对于其内核的位置。 位置Point(-1,-1)默认表示中心。
  6. delta:卷积过程中要添加到每个像素的值。 默认情况下为0
  7. BORDER_DEFAULT:我们默认使用此值
  • 我们的程序将实现一个while循环,每500 ms我们的过滤器的内核大小将在指定的范围内更新。

效果

猜你喜欢

转载自blog.csdn.net/LYKymy/article/details/83154551