利用OpenCV4.9制作自己的线性滤波器!

返回:OpenCV系列文章目录(持续更新中......)

上一篇:OpenCV4.9使用 inRange 的阈值操作

下一篇 :OpenCV系列文章目录(持续更新中......)

目标

在本教程中,您将学习如何:

  • 使用 OpenCV 函数 **filter2D()**建您自己的线性过滤器。

理论

注意:

下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。

相关

从非常一般的意义上讲,关联是图像的每个部分与运算符(内核)之间的操作。

什么是内核?

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

与内核的关联是如何工作的?

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

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

以等式的形式表示上述过程,我们将得到:

幸运的是,OpenCV 为您提供了 **filter2D()**函数,因此您不必编写所有这些操作。

这个程序是做什么的?

  • 加载图像
  • 执行规范化的框筛选器。例如,对于大小为 (size = 3) 的内核,内核为:

该程序将对大小为 3、5、7、9 和 11 的内核执行过滤器操作。

  • 筛选器输出(包括每个内核)将在 500 毫秒内显示

代码:

C++

教程代码如下行所示。
您也可以从这里下载

cpp 复制代码
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
 
using namespace cv;
 
int main ( int argc, char** argv )
{
 // Declare variables
 Mat src, dst;
 
 Mat kernel;
 Point anchor;
 double delta;
 int ddepth;
 int kernel_size;
 const char* window_name = "filter2D Demo";
 
 const char* imageName = argc >=2 ? argv[1] : "lena.jpg";
 
 // Loads an image
 src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image
 
 if( src.empty() )
 {
 printf(" Error opening image\n");
 printf(" Program Arguments: [image_name -- default lena.jpg] \n");
 return EXIT_FAILURE;
 }
 
 // Initialize arguments for the filter
 anchor = Point( -1, -1 );
 delta = 0;
 ddepth = -1;
 
 // Loop - Will filter the image with different kernel sizes each 0.5 seconds
 int ind = 0;
 for(;;)
 {
 // Update kernel size for a normalized box filter
 kernel_size = 3 + 2*( ind%5 );
 kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);
 
 // Apply filter
 filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
 imshow( window_name, dst );
 
 char c = (char)waitKey(500);
 // Press 'ESC' to exit the program
 if( c == 27 )
 { break; }
 
 ind++;
 }
 
 return EXIT_SUCCESS;
}

解释

C++

加载图像

cpp 复制代码
 const char* imageName = argc >=2 ? argv[1] : "lena.jpg";
 
 // Loads an image
 src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image
 
 if( src.empty() )
 {
 printf(" Error opening image\n");
 printf(" Program Arguments: [image_name -- default lena.jpg] \n");
 return EXIT_FAILURE;
 }

初始化参数

cpp 复制代码
 // Initialize arguments for the filter
 anchor = Point( -1, -1 );
 delta = 0;
 ddepth = -1;

循环

执行无限循环,更新内核大小,并将线性滤波器应用于输入图像。让我们更详细地分析一下:

  • 首先,我们定义过滤器将使用的内核。在这里:
cpp 复制代码
 // Update kernel size for a normalized box filter
 kernel_size = 3 + 2*( ind%5 );
 kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);

第一行是将kernel_size更新为以下范围内的奇数值:[3,11]。第二行实际上是通过将其值设置为填充1's 的矩阵并通过将其除以元素数对其进行归一化来构建内核的。

  • 设置完内核后,我们可以使用函数 **filter2D()**生成过滤器:
cpp 复制代码
 // Apply filter
 filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
  • 参数表示:
    • src:源图片
    • dst:目标图像
    • ddepthdst 的深度。负值(如 \(-1\))表示深度与源相同。
    • kernel:要通过图像扫描的内核
    • anchor :锚点相对于其内核的位置。位置 Point(-1, -1) 默认表示中心。
    • delta:在关联期间要添加到每个像素的值。默认情况下,它是 \(0\)
    • BORDER_DEFAULT:我们默认允许此值(以下教程中的更多详细信息)
  • 我们的程序将实现一个 while 循环,每 500 毫秒,我们过滤器的内核大小将在指示的范围内更新。

结果

  1. 编译上面的代码后,您可以执行它,并给出图像的路径作为参数。结果应为显示被归一化滤镜模糊的图像的窗口。每 0.5 秒,内核大小就会发生变化,如下面的一系列快照所示:

参考文献:

1:《Making your own linear filters!》---- Ana Huamán


相关推荐
码农的神经元4 分钟前
Claude Code 如何接入 DeepSeek V4 模型:从安装配置到实战验证
人工智能
AI进化营-智能译站4 分钟前
ROS2 C++开发系列07-高效构建机器人决策逻辑,运算符与控制流实战
开发语言·c++·ai·机器人
winner88816 分钟前
C++ 命名空间、虚函数、抽象类、protected 权限全套通俗易懂精讲(附与 Java 对比)
java·开发语言·c++
波动几何13 分钟前
通用行业业务技能体系技能universal-business-skill-system
人工智能
Robot_Nav15 分钟前
AI 编程助手 Skill 完全指南:VS Code · Trae CN · Claude Code
人工智能·vscode·skill·trae·claude code
不会编程的懒洋洋16 分钟前
C# P/Invoke 基础
开发语言·c++·笔记·安全·机器学习·c#·p/invoke
直奔標竿16 分钟前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
段一凡-华北理工大学17 分钟前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章06:智能决策:从经验驱动到数据驱动
网络·人工智能·数据挖掘·高炉炼铁·工业智能体·高炉炉温
rainbow72424419 分钟前
企业级AI人才培养方案:如何设计“训战结合”的学习项目
人工智能
郑寿昌20 分钟前
2026全球AI模型巅峰对决:谁主沉浮?
人工智能