OpenCV  4.10.0
开放源码计算机视觉
正在加载...
正在搜索...
没有匹配项
使用 F 变换进行滤波

目标

本教程演示如何使用 F 变换对图像进行滤波。你将看到

  • 背后的基本理论,
  • 不同设置的图解。

模糊变换应用

正如我在前面的教程中展示的,F 变换是一种模糊数学工具,在图像处理中非常有用。让我重新写一下使用之前介绍的核 \(g\) 的公式

\[ F^0_{kl}=\frac{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} \iota_{kl}(x,y) g(x,y)}{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} g(x,y)}, \]

其中 \(\iota_{kl} \subset I\) 以像素 \((k \cdot h,l \cdot h)\) 为中心,且 \(g\) 是核。可以在相关论文中找到更多详细信息。

代码

/* 样例 - 滤波
* 目标是对图像“input.png”应用使用
* F 变换的滤波。使用两种不同的核
* ,其中半径较大(本例中为 100)
* 意味着模糊级别更高。
*
* 根据“kernel1”使用半径 3 创建图像“output1_filter.png”
* 。
*
* 根据“kernel2”使用半径 100 创建图像“output2_filter.png”
* 。
*
* 使用线性插值(参数 ft:LINEAR)根据线性函数创建两个核
* 。
*/
#include "opencv2/core.hpp"
using namespace std;
using namespace cv;
int main(void)
{
// 输入图像
Mat I = imread("input.png");
// 创建核
Mat kernel1, kernel2;
ft::createKernel(ft::LINEAR, 3, kernel1, 3);
ft::createKernel(ft::LINEAR, 100, kernel2, 3);
// 滤波
Mat output1, output2;
ft::filter(I, kernel1, output1);
ft::filter(I, kernel2, output2);
// 保存输出
imwrite("output1_filter.png", output1);
imwrite("output2_filter.png", output2);
return 0;
}
n 维密集数组类
定义 mat.hpp:812
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上的文件关联的文件存储的“黑匣子”表示。
定义 core.hpp:102
STL 命名空间。

说明

图像滤波以定义的方式更改输入,以增强或简单更改某些具体特征。让我演示一下简单的模糊处理。

第一步,我们加载输入图像。

// 输入图像
Mat I = imread("input.png");

遵循 F 变换公式,我们必须指定一个核。

// 核创建
Mat kernel1, kernel2;
ft::createKernel(ft::LINEAR, 3, kernel1, 3);
ft::createKernel(ft::LINEAR, 100, kernel2, 3);

‍所以现在,我们有在radius 中不同的两个核。较大的半径会导致更大的模糊。

滤波本身如下图所示应用。

// 滤波
Mat output1, output2;
ft::filter(I, kernel1, output1);
ft::filter(I, kernel2, output2);

输出图像如下所示。

输入、输出 1(半径 3)、输出 2(半径 100)