OpenCV 4.12.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\) 是一个内核。更多细节可以在相关论文中找到。

代码

/* 示例 - 滤波
* 目标是使用 F 变换对图像进行滤波
* 在图像“input.png”上。两个不同的内核
* 被使用,其中更大的半径(在本例中为 100)
* 意味着更高的模糊度级别。
*
* 图像“output1_filter.png”由“input.png”创建
* 使用半径为 3 的“kernel1”。
*
* 图像“output2_filter.png”由“input.png”创建
* 使用半径为 100 的“kernel2”。
*
* 两个内核都由线性函数创建,使用
* 线性插值(参数 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:830
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 core.hpp:107
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)