VB图像处理,(七)一种邻近均值滤波器的算法介绍(去尘,去噪音)

本文介绍了如何优化模糊算法以专门用于去除图像中的点和线状噪音。通过比较当前像素与周围像素,选取差异最小的K个像素的平均值来替换当前像素,从而有效地去除噪音点。算法适用于不同范围,但计算量较大,需要进行优化。文章提供了具体的VB代码实现,并展示了处理前后的图像效果。
摘要由CSDN通过智能技术生成

图像噪音来源众多,视图像来源而定:扫描仪,数码相机,摄像头等等,均会产生图像噪音。
而图像噪音又可以分为点,线,背景波纹等等。
这里简单介绍一下点和线类型的噪音去除算法。

看过我的系列的前几篇文章的朋友,可以发现“模糊”算法也具有去除噪音的效果,
这是因为模糊本身就是一个高频滤波器,但是由于这个模糊算法并非专门为去除噪音而设计,
如果你把它用来去除噪音,那么估计效果是惨不忍睹了。
(噪音点被平均分摊到周围的区域中去了,淡是淡了,范围却变大了)

现在我们要优化一下模糊算法,使之更适用于去除图像噪音,而又不会不分好坏,对正常图像影响太大。

首先,我们来看一下噪音点的形态。一般由于输入设备上的灰尘或划痕(扫描仪,数码相机),造成输入的
数码图像上带上了细微的杂色点或细线。
这些杂点或细线的宽度比较小,一般在1到数个象素之间。
(要是很大的斑点,估计大家就会去清理输入设备重新输入了)
并且,这些杂点的颜色(亮度)和正常图片的差异痕大。

因此我们可以针对每一个象素,取一个范围,比如它周围的最相邻的8个或24(或更多)像素 *注1
在这个范围内的所有象素和当前象素做一个比较,取差异最小的K个象素,用这几个象素的平均值来代替当前象素。

(实际的做法是还要设置一个阀值,当这K个像素平均值和当前像素的差异超过这个阀值的时候,当前像素才会被替换)
这样就有两种情况会发生:
1:当前象素是噪音点:
如果当前象素是噪音点,那么即使是和它的差值最接近的K个象素也都是正常象素,他们的平均值也依然在正常范围内。
因此替代之后,当前的噪音点就被正常点给替代了,也就是说噪音点被去除了。
2:当前点是正常点:
如果当前点是正常点,那么和它差异最小的K个点的平均值代替当前点之后,新点和原来点的差异很小,图像基本不变。
(这里有个假定前提:自然图片,包括照片或摄像输入的图片的主体是色彩平滑的,突变点很少)
因此如果图像本身是一个有很多不平滑的突变点构成的话,那么这些突变点也会被认为是噪音点而被去除。
下面举例子:范围为1,一共9个点,取最接近的点数5点:
(当前点:6)
3  4  5     
6  5 =》最接近的5个点为4,5,5,7,8
3  7  8
均值=(4+5+5+7+8)/5=5.8=>6(四舍五入会比较精确点,当然也可以直接取整=5)
运算后结果为:
3  4  5           

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
巴特沃兹滤波vb.net程序。 ' 使用双线性变换法的 Butterworth 型 IIR 数字滤波设计程序 ' ' 形参说明如下 : ' ' PbType ----------- 输入整型量 ,滤波通带类型 : ' PbType = 0 : 低通滤波 ; ' PbType = 1 : 高通滤波 ; 2 ' PbType = 2 : 带通滤波 ; ' PbType = 3 : 带阻滤波 . ' fp1 ----------- 输入双精度量 , 低通或高通滤波的通带边界频率 ( Hz ); 带通或带阻滤波的通带低端边 ‘ 界频率 ( Hz ). ' fp2 ----------- 输入双精度量 , 带通或带阻滤波的通带低端边界频率 ( Hz ). ' Apass ----------- 输入双精度量 , 通带衰减 ( dB ). ' fs1 ----------- 输入双精度量 , 低通或高通滤波的阻带边界频率 ( Hz ); 带通或带阻滤波的阻带高端边 ‘ 界频率 ( Hz ). ' fs2 ----------- 输入双精度量 , 带通或带阻滤波的阻带高端边界频率 ( Hz ). ' Astop ----------- 输入双精度量 , 阻带衰减 ( dB ). ' fsamp ----------- 输入双精度量 , 采样频率 ( Hz ). ' points ----------- 输入整型量 , 幅频特性计算点数 . ' ord ----------- 输入整型量 , 滤波阶数 . ' NumSec( ) -------- 输出双精度量 , 转移函数二阶节的分子多项式系数二维数组 . ' 元素 NumSec( k, i ) 中 , ' k : 二阶节序号 ; ' i : 多项式系数 , i = 0 相应于常数项 . ' DenSec( ) -------- 输出双精度量 转移函数二阶节的分母多项式系数二维数组 . ' 元素 DenSec( k, i ) 中 , ' k : 二阶节序号 ; ' i : 多项式系数 , i = 0 相应于常数项 . ' NumSec_Z( ) ------ 输出双精度量 系统函数二阶节的分子多项式系数二维数组 . ' 元素 NumSec_Z( k, i ) 中 , ' k : 二阶节序号 ; ' i : 多项式系数 , i = 0 相应于常数项 . ' DenSec_Z( ) ------ 输出双精度量 系统函数二阶节的分母多项式系数二维数组 . ' 元素 DenSec_Z( k, i ) 中, ' k : 二阶节序号 ; ' i : 多项式系数 , i = 0 相应于常数项 . ' AR( ) ------------ 输出双精度量 ,滤波的幅频特性数组 . ' Sub Butterworth(PbType As Integer, fp1 As Double, fp2 As Double, Apass As Double, fs1 As Double, fs2 As Double, Astop As Double, fsamp As Double, points As Integer, ord As Integer, NumSec() As Double, DenSec() As Double, NumSec_Z() As Double, DenSec_Z() As Double, AR() As Double) Dim i%, j%, k%, ord_t% Dim angle#, emp1#, temp2#, temp3# Dim ratio(0 To 50) As Double '''''''''''''''''''' If PbType = 0 Then ' 低通滤波 ; wpass = 2# * Pi * fpass / fsamp: wstop = 2# * Pi * fstop / fsamp ' 通带、阻带边界频率 omikaP = Tan(wpass / 2#): omikaS = Tan(wstop / 2#) epass = epson(Apass): estop = epson(Astop) ' 根据对幅频特性的技术要求 ,计算模拟滤波的阶数 orde = Ne_B(estop, epass, omikaS, omikaP) ord = Fix(orde) + 1 omk0 = omika0(omikaP, epass, ord) ' 调用 Fz_LP 子程序, 将低通模拟滤波的转移函数变量 s 映射为低通数字滤波的系统函数变量 z Call Fz_LP(F1(), F2(), ord_t) ' End If '''''''''''''''''''' If PbType = 1 Then ' 高通滤波 ; wpass = 2# * Pi * fpass / fsamp: wstop = 2# * Pi * fstop / fsamp ' 通带、阻带边界频率 3 omikaP = 1# / Tan(wpass / 2#): omikaS = 1# / Tan(wstop / 2#) epass = epson(Apass): estop = epson(Astop) ' 根据对幅频特性的技术要求 ,计算模拟滤波的阶数 orde = Ne_B(estop, epass, omikaS, omikaP) ord = Fix(orde) + 1 omk0 = omika0(omikaP, epass, ord) ' 调用 Fz_HP 子程序,将高通模拟滤波的转移函数变量 s 映射为高通数字滤波的系统函数变量 z Call Fz_HP(F1(), F2(), ord_t) End If '''''''''''''''''''' If PbType = 2 Then ' 带通滤波 ; wp1 = 2# * Pi * fp1 / fsamp: wp2 = 2# * Pi * fp2 / fsamp ' 通带上下边界频率 ws1 = 2# * Pi * fs1 / fsamp: ws2 = 2# * Pi * fs2 / fsamp ' 阻带上下边界频率 Ci = BpC(wp1, wp2) omikaP = Abs((Ci - Cos(wp2)) / Sin(wp2)) omikaS1 = Abs((Ci - Cos(ws1)) / Sin(ws1)) omikaS2 = Abs((Ci - Cos(ws2)) / Sin(ws2)) If omikaS1 <= omikaS2 Then omikaS = omikaS1 Else omikaS = omikaS2 End If epass = epson(Apass): estop = epson(Astop) ' 根据对幅频特性的技术要求 ,计算模拟滤波的阶数 orde = Ne_B(estop, epass, omikaS, omikaP) ord = Fix(orde) + 1 omk0 = omika0(omikaP, epass, ord) ' 调用 Fz_BP 子程序,将带通模拟滤波的转移函数变量 s 映射为带通数字滤波的系统函数变量 z Call Fz_BP(fp1, fp2, fsamp, F1(), F2(), ord_t) End If
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值