线性滤波器与非线性滤波器有啥区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性滤波器与非线性滤波器有啥区别?相关的知识,希望对你有一定的参考价值。
《MATLAB图像滤波去噪分析及其应用》,双线性滤波、Kirsch滤波、超限邻域滤波、逆滤波、双边滤波、同态滤波、小波滤波、六抽头滤波、约束最小平方滤波、非线性复扩散滤波、Lee滤波、Gabor滤波、Wiener滤波、Kuwahara滤波、Beltrami流滤波、Lucy Richardson滤波、NoLocalMeans滤波等研究内容。《MATLAB图像滤波去噪分析及其应用》全面而系统地讲解了MATLAB图像滤波去噪分析及其应用;结合算法理论,详解算法代码(代码全部可执行且验证通过),以帮助读者更好地学习本书内容。对于网上讨论的大部分疑难问题,本书均有涉及。 ——北京航天航空大学出版社。
第1章 图像颜色空间相互转换与MATLAB实现
第10章 高级滤波器设计与MATLAB实现
10.1 逆滤波
10.1.1 算法原理
10.1.2 算法仿真与MATLAB实现
10.2 双边滤波
10.2.1 算法原理
10.2.2 算法仿真与MATLAB实现
10.3 同态滤波
10.3.1 算法原理
10.3.2 算法仿真与MATLAB实现
10.4 小波滤波
10.4.1 算法原理
10.4.2 算法仿真与MATLAB实现
10.5 六抽头插值滤波
10.5.1 算法原理
10.5.2 算法仿真与MATLAB实现
10.6 形态学滤波
10.6.1 算法原理
10.6.2 算法仿真与MATLAB实现
10.7 约束最小平方滤波
10.7.1 算法原理
10.7.2 算法仿真与MATLAB实现
10.8 非线性复扩散滤波
10.8.1 算法原理
10.8.2 算法仿真与MATLAB实现 参考技术A 线性滤波器:滤波器输出量是其输入量的线性函数 参考技术B 可以参照线性系统和非线性系统间的区别
创建您自己的线性滤波器
【中文标题】创建您自己的线性滤波器【英文标题】:Creating Your Own Linear Filter 【发布时间】:2018-02-07 10:29:53 【问题描述】:我是 Opencv C++ 的新手。我正在尝试将蒙版与图像进行卷积。为此,我想创建自己的蒙版,以便可以使用 filter2D 数组函数将蒙版与图像进行卷积。我要创建的面具是:
char mask [3][3]= -1,0,1,-1,0,1,-1,0,1;
为此,我尝试了以下代码(生成此掩码):-
Mat kernel(3,3, CV_8UC1, Scalar(-1,0,1));
我已将掩码值打印为
std::cout << kernel;
但我得到的答案是 0, 0, 0; 0, 0, 0; 0, 0, 0
我期待答案是 -1, 0, 1; -1, 0, 1; -1, 0, 1
我知道我在正确编写频道时犯了一个错误。谁能帮我理解通道(CV_8UC1....)的含义以及如何纠正它并获得正确的输出。
【问题讨论】:
Mat kernel(3,3, CV_8UC1, Scalar(-1,0,1));意味着,您将第一个通道设置为 -1,将第二个通道设置为 0,将第三个通道设置为 1。但是由于您只有一个通道矩阵,因此只使用第一个通道:-1。但是由于你有无符号类型,它会饱和到 0。所以你的示例图像的每个像素都是 0。 【参考方案1】:CV_8UC1 表示 1 通道,8 位,uchar 图像。
标量用于设置每个通道的值,而不是每个像素/坐标。
例 1:
Mat kernel(3,3, CV_8UC1, Scalar::all(0))
意味着创建一个 0 的 3X3 矩阵,由于它是 CV_8UC1 类型,因此您只能提及一个值,在本例中为 0。
EX 2:
Mat kernel(3,3, CV_8UC3, Scalar(0,0,255))
表示创建一个具有 3 个通道的 3X3 矩阵,因为类型为 CV_8UC3,并将通道 1 设置为 0,通道 2 设置为 0,通道 3 设置为 255。
因此,为了设置行值,您不能使用标量。 而是这样做:
Mat C = (Mat_<double>(3,3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
查看this了解更多信息。
希望这会有所帮助!
【讨论】:
【参考方案2】:您想为filter2D
创建一个带有negative
元素的kernel
,那么您不应该使用CV_8UC1
的数据类型。 There is no negative value in unsigned type
.
而Mat kernel(3,3, CV_8UC1, Scalar(-1,0,1));
表示创建一个信号通道无符号字符内核。您将Scalar(-1,0,1)
设置为kernel
,则只使用the first element(that is double -1)
,而saturate_cast<unchar>(-1) = 0
。
一般情况下,请改用CV_32FC1
。
例如:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
float mask[9] = -1,0,1, -1, 0, 1, -1,0,1;
Mat kernel(3,3, CV_32FC1);
memcpy(kernel.data, mask, sizeof(float)*9);
cout << kernel<<endl;
结果:
[-1, 0, 1;
-1, 0, 1;
-1, 0, 1]
一个类似的问题:
How to create cv::Mat from buffer (array of T* data) using a template function?
【讨论】:
以上是关于线性滤波器与非线性滤波器有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章