图像构成与信号处理之二——信号滤波

一、信号滤波与图像滤波

信号滤波和图像滤波都是信号处理的重要任务,它们在不同领域中有广泛的应用。

(一)信号滤波

信号滤波是对信号进行处理的过程,通过去除或抑制不需要的频率成分,以实现信号的平滑或去噪。信号滤波的目标是改变信号的频谱分布,以达到特定的信号处理目的。常用的信号滤波方法有低通滤波、高通滤波、带通滤波等。

(二)图像滤波

图像滤波是对图像进行处理的过程,通过对像素值进行平滑或增强,以实现图像的去噪、增强、边缘检测等目的。图像滤波可以分为频域滤波和空域滤波两类。频域滤波利用图像的傅里叶变换来处理频率信息,而空域滤波则在图像的像素域上直接进行操作。

二、信号滤波示例

(一)限幅滤波法(又称程序判断滤波法)

原理:该方法通过设定一个上下限,将信号限制在该范围内,超过该范围的信号值将被修正。

公式: o u t p u t = m i n ( m a x ( i n p u t , l o w e r l i m i t ) , u p p e r l i m i t ) output = min(max(input, lower_limit), upper_limit) output=min(max(input,lowerlimit),upperlimit)

def limit_amplitude_filter(input_signal, lower_limit, upper_limit):
    output_signal = []
    for value in input_signal:
        output_signal.append(min(max(value, lower_limit), upper_limit))
    return output_signal

(二)中位值滤波法

原理:取一组数据的中位数作为滤波后的输出值,用于去除异常值或突发噪声。(涉及窗口的问题,比如每次只对窗口的波进行处理

公式: o u t p u t = m e d i a n ( i n p u t ) output = median(input) output=median(input)

import numpy as np

def median_filter(input_signal):
    output_signal = []
    for i in range(len(input_signal)):
        window = input_signal[max(i-1, 0):min(i+2, len(input_signal))]
        output_signal.append(np.median(window))
    return output_signal

(三)算术平均滤波法

原理:将一组数据的平均值作为滤波后的输出值,平滑信号。涉及窗口的问题,比如每次只对窗口的波进行处理

公式: o u t p u t = s u m ( i n p u t ) / l e n ( i n p u t ) output = sum(input) / len(input) output=sum(input)/len(input)

def mean_filter(input_signal):
    output_signal = []
    for i in range(len(input_signal)):
        window = input_signal[max(i-2, 0):min(i+3, len(input_signal))]
        output_signal.append(sum(window) / len(window))
    return output_signal

(四)递推平均滤波法(又称滑动平均滤波法)

原理:采用递推方式计算滑动窗口内数据的平均值,每次新数据进入窗口时,旧数据移除,保持窗口大小不变。

公式: o u t p u t [ i ] = o u t p u t [ i − 1 ] + ( i n p u t [ i ] − i n p u t [ i − n ] ) / n output[i] = output[i-1] + (input[i] - input[i-n]) / n output[i]=output[i1]+(input[i]input[in])/n

def recursive_mean_filter(input_signal, window_size):
    output_signal = []
    current_sum = sum(input_signal[:window_size])
    output_signal.append(current_sum / window_size)
    for i in range(window_size, len(input_signal)):
        current_sum = current_sum - input_signal[i - window_size] + input_signal[i]
        output_signal.append(current_sum / window_size)
    return output_signal

(五)中位值平均滤波法(又称防脉冲干扰平均滤波法)

原理:该方法先用中位值滤波法处理数据,然后再使用算术平均滤波法进一步平滑数据。

公式: o u t p u t = m e a n ( m e d i a n ( i n p u t ) ) output = mean(median(input)) output=mean(median(input))

def median_mean_filter(input_signal):
    median_filtered = median_filter(input_signal)
    output_signal = mean_filter(median_filtered)
    return output_signal

(六)限幅平均滤波法

原理:该方法先使用限幅滤波法处理数据,再对处理后的数据使用算术平均滤波法进行平滑。

公式: o u t p u t = m e a n ( l i m i t a m p l i t u d e f i l t e r ( i n p u t ) ) output = mean(limit_amplitude_filter(input)) output=mean(limitamplitudefilter(input))

def limit_amplitude_mean_filter(input_signal, lower_limit, upper_limit):
    limited_signal = limit_amplitude_filter(input_signal, lower_limit, upper_limit)
    output_signal = mean_filter(limited_signal)
    return output_signal

(七)一阶滞后滤波法

原理:该方法利用当前数据与上一时刻的滤波结果之间的差值进行滤波,适用于平稳变化的信号。

公式: o u t p u t [ i ] = ( 1 − a l p h a ) ∗ o u t p u t [ i − 1 ] + a l p h a ∗ i n p u t [ i ] output[i] = (1 - alpha) * output[i-1] + alpha * input[i] output[i]=(1alpha)output[i1]+alphainput[i]

def first_order_lag_filter(input_signal, alpha):
    output_signal = [input_signal[0]]
    for i in range(1, len(input_signal)):
        output_signal.append((1 - alpha) * output_signal[i - 1] + alpha * input_signal[i])
    return output_signal

(八)加权递推平均滤波法

原理:对滑动窗口内的数据进行加权平均,以增加对新数据的重视程度。

公式: o u t p u t [ i ] = ( 1 − w ) ∗ o u t p u t [ i − 1 ] + w ∗ i n p u t [ i ] output[i] = (1 - w) * output[i-1] + w * input[i] output[i]=(1w)output[i1]+winput[i]

def weighted_recursive_mean_filter(input_signal, weight):
    output_signal = [input_signal[0]]
    for i in range(1, len(input_signal)):
        output_signal.append((1 - weight) * output_signal[i - 1] + weight * input_signal[i])
    return output_signal

(九)消抖滤波法

原理:消除信号中的抖动或短时波动,只有当信号值连续n次出现在某一范围内时,才接受该值。

公式: o u t p u t [ i ] = i n p u t [ i ] output[i] = input[i] output[i]=input[i]

def debouncing_filter(input_signal, n):
    output_signal = []
    count = 0
    for i in range(len(input_signal)):
        if input_signal[i] == input_signal[i - 1]:
            count += 1
        else:
            count = 1
        if count >= n:
            output_signal.append(input_signal[i])
    return output_signal

(十)卡尔曼滤波(非扩展卡尔曼)

原理:卡尔曼滤波是一种递归算法,利用状态估计和观测值来融合多个数据来源,优化信号估计。具体原理以及简单示例见下述两个优秀的链接。

图说卡尔曼滤波,一份通俗易懂的教程 - 知乎 (zhihu.com)

(53条消息) Kalman滤波通俗理解+实际应用_南叔先生的博客-CSDN博客

from filterpy.kalman import KalmanFilter

def kalman_filter(input_signal, process_noise, measurement_noise):
    kf = KalmanFilter(dim_x=1, dim_z=1)
    kf.x = input_signal[0]  # 初始状态估计
    kf.F = np.array([[1]])  # 状态转移矩阵
    kf.H = np.array([[1]])  # 观测矩阵
    kf.P *= 1000           # 初始协方差矩阵
    kf.R = measurement_noise  # 观测噪声协方差
    kf.Q = process_noise      # 过程噪声协方差

    output_signal = []
    for z in input_signal:
        kf.predict()
        kf.update(z)
        output_signal.append(kf.x[0])
    
    return output_signal
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值