非局部均值滤波算法的python实现

如题,比opencv自带的实现效果好

#coding:utf8
import cv2
import numpy as np
def psnr(A, B):
    return 10*np.log(255*255.0/(((A.astype(np.float)-B)**2).mean()))/np.log(10)

def double2uint8(I, ratio=1.0):
    return np.clip(np.round(I*ratio), 0, 255).astype(np.uint8)

def make_kernel(f):
    kernel = np.zeros((2*f+1, 2*f+1))
    for d in range(1, f+1):
        kernel[f-d:f+d+1, f-d:f+d+1] += (1.0/((2*d+1)**2))
    return kernel/kernel.sum()

def NLmeansfilter(I, h_=10, templateWindowSize=5,  searchWindowSize=11):
    f = templateWindowSize/2
    t = searchWindowSize/2
    height, width = I.shape[:2]
    padLength = t+f
    I2 = np.pad(I, padLength, 'symmetric')
    kernel = make_kernel(f)
    h = (h_**2)
    I_ = I2[padLength-f:padLength+f+height, padLength-f:padLength+f+width]

    average = np.zeros(I.shape)
    sweight = np.zeros(I.shape)
    wmax =  np.zeros(I.shape)
    for i in range(-t, t+1):
        for j in range(-t, t+1):
            if i==0 and j==0:
                continue
            I2_ = I2[padLength+i-f:padLength+i+f+height, padLength+j-f:padLength+j+f+width]
            w = np.exp(-cv2.filter2D((I2_ - I_)**2, -1, kernel)/h)[f:f+height, f:f+width]
            sweight += w
            wmax = np.maximum(wmax, w)
            average += (w*I2_[f:f+height, f:f+width])
    return (average+wmax*I)/(sweight+wmax)

if __name__ == '__main__':
    I = cv2.imread('lena.jpg', 0)

    sigma = 20.0
    I1 = double2uint8(I + np.random.randn(*I.shape) *sigma)
    print u'噪声图像PSNR',psnr(I, I1)
    R1  = cv2.medianBlur(I1, 5)
    print u'中值滤波PSNR',psnr(I, R1)
    R2 = cv2.fastNlMeansDenoising(I1, None, sigma, 5, 11)
    print u'opencv的NLM算法',psnr(I, R2)
    R3 = double2uint8(NLmeansfilter(I1.astype(np.float), sigma, 5, 11))
    print u'NLM PSNR',psnr(I, R3)
        

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于MATLAB实现传统图像去噪算法均值滤波、中值滤波、局部均值滤波NLM、三维块匹配滤波BM3D)和基于深度卷积神经网络的DnCNN图像去噪算法。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。关于机器学习深度学习的项目,项目真实可靠,欢迎下载学习。
以下是一维时序信号局部均值滤波的完整Python代码: ```python import numpy as np from scipy import signal def nl_means_filter(signal, window_size, sigma, h): # Compute the half window size half_window = window_size // 2 # Compute the padded signal padded_signal = np.pad(signal, half_window, mode='reflect') # Compute the distance weights weights = np.zeros_like(signal) for i in range(signal.size): for j in range(signal.size): # Compute the distance between the patches patch1 = padded_signal[i:i+window_size] patch2 = padded_signal[j:j+window_size] distance = np.sum((patch1 - patch2) ** 2) / (window_size * sigma ** 2) # Compute the weight weights[i, j] = np.exp(-distance) # Normalize the weights norm_weights = weights.sum(axis=1) for i in range(signal.size): weights[i, :] /= norm_weights[i] # Compute the filtered signal filtered_signal = np.zeros_like(signal) for i in range(signal.size): weights_i = weights[i, :] window = padded_signal[i:i+window_size] filtered_signal[i] = np.sum(weights_i * window) / np.sum(weights_i) # Apply the hard thresholding filtered_signal = signal - filtered_signal filtered_signal = np.where(filtered_signal < -h, -h, filtered_signal) filtered_signal = np.where(filtered_signal > h, h, filtered_signal) filtered_signal = signal - filtered_signal return filtered_signal # Example usage signal = np.sin(np.linspace(0, 2*np.pi, 100)) noisy_signal = signal + np.random.normal(0, 0.1, 100) filtered_signal = nl_means_filter(noisy_signal, window_size=5, sigma=0.1, h=0.1) import matplotlib.pyplot as plt plt.plot(signal, label='Original signal') plt.plot(noisy_signal, label='Noisy signal') plt.plot(filtered_signal, label='Filtered signal') plt.legend() plt.show() ``` 该代码使用了NumPy和SciPy库,实现了一维时序信号局部均值滤波算法。其中,`nl_means_filter`函数接受一个输入信号,以及窗口大小、标准差和硬阈值等参数,返回经过滤波后的信号。在例子中,我们使用了正弦波作为原始信号,加入了高斯噪声,并对噪声进行了局部均值滤波。最后,我们使用Matplotlib库将原始信号、噪声信号和滤波后的信号进行了可视化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值