图像滤波算法总结

该篇主要是对图像滤波算法一个整理,主要参考的大神的博客:
https://blog.csdn.net/qq_15606489/article/details/52755444
1:图像滤波既可以在实域进行,也可以在频域进行。图像滤波可以更改或者增强图像。通过滤波,可以强调一些特征或者去除图像中一些不需要的部分。滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最终的输出值。
图像滤波可以通过公式:
O(i,j)=m,nI(i+m,j+n)K(m,n) O ( i , j ) = ∑ m , n I ( i + m , j + n ) ∗ K ( m , n )
其中K为滤波器,在很多文献中也称之为核(kernel)。常见的应用包括去噪、图像增强、检测边缘、检测角点、模板匹配等。

2:均值滤波
用其像素点周围像素的平均值代替元像素值,在滤除噪声的同时也会滤掉图像的边缘信息。在OpenCV中,可以使用boxFilter和blur函数进行均值滤波。均值滤波的核为:
这里写图片描述

3:中值滤波
中值滤波用测试像素周围邻域像素集中的中值代替原像素。中值滤波去除椒盐噪声和斑块噪声时,效果非常明显。在OpenCV中,可以使用函数medianBlur进行操作。

4:高斯滤波
这里参考一位大神的博客写的很细很好明白:https://blog.csdn.net/nima1994/article/details/79776802
总结一下:

  • 像均值滤波,是简单的取平均值,模板系数都是1。而图像上的像素实际上是坐标离散但是值却连续的,因为越靠近的点关系越密切,越远离的点关系越疏远。因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。
  • 既然是依据距离来加权平均,那么很容易想到高斯函数 f(x)=1σ2πe(xμ)22σ2 f ( x ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 ,如图所示:
    这里写图片描述
    从高斯函数来看,离原点距离越近,得到的权重越高,越远离原点,得到的权重越小。
    上边是一维的高斯函数,当中心点为原地时, x x 的均值μ=0,此时 f(x)=1σ2πex22σ2 f ( x ) = 1 σ 2 π e − x 2 2 σ 2
    由于图像是二维矩阵,则采用二维高斯函数 f(x,y)=12πσ2e(x2+y2)2σ2 f ( x , y ) = 1 2 π σ 2 e − ( x 2 + y 2 ) 2 σ 2 有了这个函数就可以计算滤波模板中每个点的权重了。
    权重矩阵:
    假定中心点是(0,0),那么距离它最近的8个点的坐标如下:
    这里写图片描述
    更远的点以此类推。
    将这模板中的坐标x,y代入到二维高斯函数中,假定 μ=0 μ = 0 σ σ 为1.5,则模糊半径为1的权重矩阵如下:
    这里写图片描述
    这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。
    这里写图片描述
    计算高斯滤波的结果
    假设现在3*3高斯滤波器覆盖的图像的像素灰度值为:
    这里写图片描述
    每个点与上边计算得到的9个权重值相乘:
    这里写图片描述
    得到:
    这里写图片描述
    将这9个值加起来,就是中心点的高斯模糊的值。

对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。

边界处理
如果一个点处于边界,周边没有足够的点,怎么办?

一个变通方法,就是把已有的点拷贝到另一面的对应位置,模拟出完整的矩阵。

5:双边滤波
参考了大神的博客:http://www.360doc.com/content/17/0306/14/28838452_634420847.shtml
高斯滤波只考虑了周边点与中心点的空间距离来计算得到权重。首先,对于图像滤波来说,一个通常的intuition是:(自然)图像在空间中变化缓慢,因此相邻的像素点会更相近。但是这个假设在图像的边缘处变得不成立。如果在边缘处也用这种思路来进行滤波的话,即认为相邻相近,则得到的结果必然会模糊掉边缘,这是不合理的,因此考虑再利用像素点的值的大小进行补充,因为边缘两侧的点的像素值差别很大,因此会使得其加权的时候权重具有很大的差别。可以理解成先根据像素值对要用来进行滤波的邻域做一个分割或分类,再给该点所属的类别相对较高的权重,然后进行邻域加权求和,得到最终结果。
双边滤波与高斯滤波相比,对于图像的边缘信息能够更好的保留,其原理为一个与空间距离相关的高斯核函数与一个灰度距离相关的高斯函数相乘。
空间距离: e(xixc)2+(yiyc)22σ2 e − ( x i − x c ) 2 + ( y i − y c ) 2 2 σ 2 ,其中 (xc,yc) ( x c , y c ) 是中心点坐标,比如为(0,0), (xi,yi) ( x i , y i ) 为当前点的坐标, σ σ 为空间域标准差。
灰度距离: e(gray(xi,yi)gray(xc,yc))22σ2 e − ( g r a y ( x i , y i ) − g r a y ( x c , y c ) ) 2 2 σ 2 ,其中 gray(xi,yi) g r a y ( x i , y i ) 是当前像素点的灰度值, gray(xc,yc) g r a y ( x c , y c ) 是模板中覆盖图片区域的中心点像素的灰度值,也就是(0,0)处的灰度值, σ σ 为值域标准差。
对于高斯滤波,仅用空间距离的权值系数核与图像卷积后确定中心点的灰度值。即认为离中心点越近,其权值系数越大。
双边滤波中加入了对灰度信息的权重,即在领域内,灰度值越接近中心点灰度值的点的权值更大,灰度值相差大的点权重越小。其权重大小则由值域高斯函数确定。
两者权重系数相乘,得到最终的卷积模板,由于双边滤波需要每个中心点领域的灰度信息来确定其系数,所以速度比一般的滤波慢得多,而且计算量增长速度为核的大小的平方。
这里写图片描述
参数的选择:空间域 σ σ 的选取,和值域 σ σ 的选取。
结论: σ σ 越大,边缘越模糊; σ σ 越小,边缘越清晰。

  • 53
    点赞
  • 371
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: 低通滤波是一种数字信号处理算法,常用于去除高频成分,保留低频成分的信号处理过程。C语言是一种流行的编程语言,以下是用C语言实现低通滤波算法的基本步骤。 首先,需要定义信号数据的结构,包括信号的采样率、采样点数和信号数组等。 ```c #define SAMPLE_RATE 1000 // 采样率为1000Hz #define NUM_SAMPLES 1000 // 采样点数为1000个 typedef struct { float samples[NUM_SAMPLES]; } Signal; ``` 接下来,可以实现低通滤波函数,该函数的输入为原始信号和截止频率,输出为滤波后的信号。 ```c void lowPassFilter(Signal *input, Signal *output, float cutoffFrequency) { float RC = 1.0 / (2 * M_PI * cutoffFrequency); // RC常数 float alpha = SAMPLE_RATE / (SAMPLE_RATE + RC); // alpha系数 // 使用一阶低通滤波器进行滤波 output->samples[0] = input->samples[0]; for (int i = 1; i < NUM_SAMPLES; i++) { output->samples[i] = alpha * input->samples[i] + (1 - alpha) * output->samples[i - 1]; } } ``` 最后,可以在主函数中调用低通滤波函数并输出结果。 ```c int main() { Signal inputSignal; Signal outputSignal; // 假设已有原始信号数据,存放在inputSignal中 // ... float cutoffFrequency = 50.0; // 截止频率为50Hz lowPassFilter(&inputSignal, &outputSignal, cutoffFrequency); // 输出滤波后的信号数据 for (int i = 0; i < NUM_SAMPLES; i++) { printf("%f ", outputSignal.samples[i]); } printf("\n"); return 0; } ``` 以上就是用C语言实现低通滤波算法的基本步骤。通过定义信号结构和实现低通滤波函数,可以对原始信号进行滤波处理,得到保留低频成分的滤波后信号。 ### 回答2: 低通滤波算法是一种用于信号处理的常用算法,它通过去除信号中高频部分从而实现平滑信号的目的。在C语言中,我们可以使用数字滤波器来实现低通滤波。 首先,我们需要定义一个滤波器的阶数和截止频率。阶数决定了滤波器的复杂度,通常选择低阶滤波器可以平滑信号并避免过度衰减。截止频率决定了滤波器开始衰减的频率。 接下来,我们可以使用差分方程的方法来实现低通滤波器。差分方程描述了滤波器的输入和输出之间的关系。常见的差分方程形式是一阶和二阶差分方程。 在C语言中,我们可以使用循环语句和数组来实现低通滤波器的算法。我们首先读取输入信号的样本值,并将其存储在一个数组中。然后,我们根据定义的差分方程,使用循环语句计算滤波器的输出值,并将其存储在另一个数组中。 最后,我们可以使用输出数组的值来绘制滤波后的信号波形图。这将帮助我们更好地理解滤波算法的效果。 总结来说,低通滤波是一种常用的信号处理算法,在C语言中可以通过定义滤波器的阶数和截止频率,并使用差分方程的方法来实现。通过循环和数组来计算滤波器的输出值,并绘制滤波后的信号波形图,我们可以获得平滑的信号。 ### 回答3: 低通滤波算法是一种用于信号处理的算法,它能够去除信号中的高频成分,从而保留信号中的低频成分。低通滤波在很多领域都有广泛的应用,例如音频处理、图像处理等。 在C语言中,可以使用数字滤波器来实现低通滤波算法。常见的低通滤波器包括FIR滤波器和IIR滤波器。 FIR滤波器是一种有限脉冲响应滤波器,通过将输入信号与滤波器的冲激响应序列进行卷积运算来实现滤波。FIR滤波器的特点是稳定性好,易于设计,但计算复杂度较高。在C语言中,可以通过定义滤波器的冲激响应序列以及输入信号,使用循环等算法实现FIR滤波器。 IIR滤波器是一种无限脉冲响应滤波器,通过将输出信号与滤波器的差分方程进行递归运算来实现滤波。IIR滤波器的特点是计算复杂度低,但易于出现不稳定性。在C语言中,可以通过定义滤波器的差分方程以及输入信号,使用循环等算法实现IIR滤波器。 以上是关于低通滤波算法在C语言中的实现方法的简单介绍。实际的滤波算法实现还需要考虑信号的采样率、滤波器的截止频率以及过渡带宽等参数,以及相关的数值计算和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HaoRenkk123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值