使用nlmeas对图像进行去噪

使用nlmeas对图像进行去噪

效果展示

在这里插入图片描述

代码实现

#使用nlmeans方法对图像进行降噪处理

import cv2
import numpy as np
import matplotlib.pyplot as plt

import skimage
from skimage import data,img_as_float
from skimage.restoration import denoise_nl_means,estimate_sigma
from skimage.metrics import  peak_signal_noise_ratio
from skimage.util import  random_noise

#使用 skimage 库自带的nlmeans 算法进行操作
def nlmeansSkimage(src):
    #首先加载图片
    img=skimage.io.imread(src)
    img=skimage.img_as_float(img)

    #人为给图片添加噪声,可以删掉
    sigma=0.08
    noisy=random_noise(img,var=sigma**2)

    #估计当前输入图片中的噪声的标准差
    sigma_est=np.mean(estimate_sigma(noisy,channel_axis=-1))
    print(f'the estimate Image noise is{sigma_est}')

    #将pathch 块的一些属性固定下来
    patch_kw=dict(
            patch_size=5,
            patch_distance=6,
            channel_axis=-1
    )
#denoise_nl_means(image, patch_size=7, patch_distance=11, h=0.1, multichannel=False, fast_mode=True, sigma=0.0,, preserve_range=False, channel_axis=None)
    #image=要输入的去噪图像,可以是灰度图,也可使rgb图
    #patch_size:用于去噪的patch的大小
    #patch_distance:搜索用于去噪的patch的最大像素距离
    #h:截止距离,h值越高,接受patch的自由度越高,同时图像越平滑,但边界也会变得模糊。对于标准偏差sigma的高斯噪声,经验选择是比sigma值更小些
    #multichannel/channel_axis:指定输入的图像的是否是多通道的,若不指定则默认为灰度图
    #fastmode:指定是否使用 nlmeans的快速版本
    #sigma:高斯噪声的标准差,若提供则计算的pach权重将把预期噪声方差考虑进去
    #preserve_range:是否保留原始值的范围,否则,则跟韩剧img_as_float的规则转换输入u的图像

    denoiseNlmeans=denoise_nl_means(noisy,h=1.15*sigma_est,fast_mode=False,**patch_kw)

    #提供预测的sigma估计值
    denoiseNlmeansSigma=denoise_nl_means(noisy,h=0.8*sigma_est,sigma=sigma_est,
                                        fast_mode=False,**patch_kw)

    #使用快速的nlmeans方法
    denoiseNlmeansFast=denoise_nl_means(noisy,h=0.8*sigma_est,
                                        fast_mode=True,**patch_kw)

    #使用快速的nlmeans并结合sigma_est
    denoiseNlmeansFastSigma=denoise_nl_means(noisy,h=0.8*sigma_est,sigma=sigma_est,
                                        fast_mode=True,**patch_kw)


    #计算得到的图像的PSNR
    psnr_noisy=peak_signal_noise_ratio(img,noisy)
    psnr_denoiseNlmeans=peak_signal_noise_ratio(img,denoiseNlmeans)
    psnr_denoiseNlmeansSigma=peak_signal_noise_ratio(img,denoiseNlmeansSigma)
    psnr_denoiseNlmeansFast=peak_signal_noise_ratio(img,denoiseNlmeansFast)
    psnr_denoiseNlmeansFastSigma=peak_signal_noise_ratio(img,denoiseNlmeansFastSigma)





    #画出输出的图像

    fig,ax=plt.subplots(nrows=2, ncols=3, figsize=(8,6),
                       sharex=True,sharey=True)
    ax[0,0].imshow(noisy)
    ax[0,0].axis('off')
    ax[0,0].set_title(f'noisy Image\nPSNR={psnr_noisy}')

    ax[0, 1].imshow(denoiseNlmeans)
    ax[0, 1].axis('off')
    ax[0, 1].set_title(f'non-local means\n(slow,PSNR={psnr_denoiseNlmeans})')

    ax[0, 2].imshow(denoiseNlmeansSigma)
    ax[0, 2].axis('off')
    ax[0, 2].set_title('non-local means\n(slow,using $\\sigma_{est}$)'+f'PSNR={psnr_denoiseNlmeansSigma}')

    ax[1, 0].imshow(img)
    ax[1, 0].axis('off')
    ax[1, 0].set_title('Original Image')

    ax[1, 1].imshow(denoiseNlmeansFast)
    ax[1, 1].axis('off')
    ax[1, 1].set_title(f'non-local means\n(fast)PSNR={psnr_denoiseNlmeansFast}')

    ax[1, 2].imshow(denoiseNlmeansFastSigma)
    ax[1, 2].axis('off')
    ax[1, 2].set_title('non-local means\n(fast,using $\\sigma_{est}$)'+f'PSNR={psnr_denoiseNlmeansFastSigma}')

    fig.tight_layout()
    plt.show()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值