自适应局部降噪滤波器的python实现-------冈萨雷斯数字图像处理

news2024/11/30 15:37:49

自适应局部降噪滤波器

自适应局部降噪滤波器是一种信号处理技术,用于降低图像或信号中的噪声水平,同时保留图像或信号的细节。其原理基于局部区域内信号的统计特性和噪声的特征,通过动态调整滤波器的参数来适应不同区域的信号和噪声属性。
自适应局部降噪滤波器的基本原理:
**局部区域选择:**滤波器首先选择信号中的局部区域,例如使用一个固定大小的窗口或者动态选择尺寸以包含相邻像素或信号点。这个局部区域是用来估计噪声和信号特性的基础。
**估计信号和噪声特性:**在选定的局部区域内,通过统计方法(例如均值、方差等)对信号和噪声的特性进行估计。这些特性通常用于确定滤波器的参数,以便在滤波过程中更好地区分信号和噪声。
参数调整和滤波:基于对局部区域内信号和噪声特性的估计,滤波器动态调整其参数。这些参数可能包括滤波器的增益、阈值或者卷积核的权重等。滤波器根据这些参数对局部区域进行滤波,以抑制噪声并尽可能地保留信号的细节。
重复应用到整个信号或图像:上述步骤被迭代应用到整个信号或图像的每个局部区域,以处理整个信号并减少整体的噪声水平。

自适应局部降噪滤波器的关键在于其能够根据局部区域内信号和噪声的特性来自动调整滤波器参数,以更有效地降低噪声而不丢失重要的信号信息。这种方法常用于图像处理、音频处理和信号处理领域,用于提高图像质量或改善信号清晰度。

编写python代码,输出如下图所示的结果:

在这里插入图片描述
文件是一幅被均值为0,方差为1000的高斯噪声污染的图像。结果依次显示了算术均值滤波器、几何均值滤波器、自适应局部降噪滤波器对该图像滤波的结果。计算公式为:
在这里插入图片描述

代码实现

import cv2
import numpy as np
import skimage
from matplotlib import pyplot as plt

img = cv2.imread('Fig0513.tif',0)
img_n = skimage.util.random_noise(img, mode='gaussian', seed=None, clip=False, mean=0, var=0.01)
img_n = 255*(img_n-img_n.min())/(img_n.max()-img_n.min())
img_n = img_n.astype(np.uint8)

def calculate_sigma_eta(image):
    hist, bins = np.histogram(image.flatten(), bins=256, range=[0, 256], density=True)
    r = bins[:-1]
    m = np.sum(r * hist)
    sigma = np.sum((r - m) ** 2 * hist)
    return sigma

def calculate_sigma_sxy(block):
    hist, bins = np.histogram(block.flatten(), bins=256, range=[0, 256], density=True)
    r = bins[:-1]
    m = (r * hist).sum()
    sigma = ((r - m) ** 2 * hist).sum()
    return sigma, m

def adaptive_local_denoise(image, kernel, sigma_eta=1):

    epsilon = 1e-8
    height, width = image.shape[:2]
    m, n = kernel.shape[:2]

    padding_h = int((m - 1) / 2)
    padding_w = int((n - 1) / 2)

    image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \
                               (padding_w, n - 1 - padding_w)), mode="edge")

    img_result = np.zeros(image.shape)
    for i in range(height):
        for j in range(width):
            block = image_pad[i:i + m, j:j + n]
            gxy = image[i, j]
            z_sxy = np.mean(block)
            sigma_sxy = np.var(block)
            rate = sigma_eta / (sigma_sxy + epsilon)
            if rate >= 1:
                rate = 1
            img_result[i, j] = gxy - rate * (gxy - z_sxy)
    return img_result

def ArithmeticMeanAlogrithm(image):
    # 算术均值滤波
    new_image = np.zeros(image.shape)
    image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
    for i in range(1,image.shape[0]-1):
        for j in range(1,image.shape[1]-1):
            new_image[i-1,j-1] = np.mean(image[i-1:i+2,j-1:j+2])
    new_image = (new_image-np.min(image))*(255/np.max(image))
    return new_image.astype(np.uint8)

def GeometricMeanOperator(roi):
    roi = roi.astype(np.float64)
    p = np.prod(roi)
    return p ** (1 / (roi.shape[0] * roi.shape[1]))

def GeometricMeanAlogrithm(image):
    # 几何均值滤波
    new_image = np.zeros(image.shape)
    image = cv2.copyMakeBorder(image, 1, 1, 1, 1, cv2.BORDER_DEFAULT)
    for i in range(1, image.shape[0] - 1):
        for j in range(1, image.shape[1] - 1):
            new_image[i - 1, j - 1] = GeometricMeanOperator(image[i - 1:i + 2, j - 1:j + 2])
    new_image = (new_image - np.min(image)) * (255 / np.max(image))
    return new_image.astype(np.uint8)

# 自适应局部降噪滤波器处理高斯噪声
kernel = np.ones([7, 7])
img_arithmentic_mean = ArithmeticMeanAlogrithm(img_n)
img_geometric_mean = GeometricMeanAlogrithm(img_n)
img_adaptive_local = adaptive_local_denoise(img, kernel=kernel, sigma_eta=1000)

plt.figure(figsize=(7,7))

plt.subplot(2,2,1),plt.imshow(img, cmap = 'gray'),plt.title('original')
plt.xticks([]),plt.yticks([])
plt.subplot(2,2,2),plt.imshow(img_arithmentic_mean, cmap = 'gray'),plt.title('arithmentic')
plt.xticks([]),plt.yticks([])
plt.subplot(2,2,3),plt.imshow(img_geometric_mean, cmap = 'gray'),plt.title('geomentric')
plt.xticks([]),plt.yticks([])
plt.subplot(2,2,4),plt.imshow(img_adaptive_local, cmap = 'gray'),plt.title('adaptive')
plt.xticks([]),plt.yticks([])
plt.tight_layout()
plt.show()


实验结果

在这里插入图片描述

自适应滤波器是指根据环境的改变,使用自适应算法来改变滤波器的参数和结构的滤波器。一般情况下,不改变自适应滤波器的结构。而自适应滤波器的系数是由自适应算法更新的时变系数。即其系数自动连续地适应于给定信号,以获得期望响应。自适应滤波器的最重要的特征就在于它能够在未知环境中有效工作,并能够跟踪输入信号的时变特征。

自适应局部滤波器设计流程

① 生成高斯噪声
设计出高斯噪声,并添加到原图像中。
②设计均值滤波器
设计过程为:取出当前n*n阶滤波器对应的像素点,求其均值,并将结果放至结果矩阵中,输出。
③设计自适应均值滤波器
设计过程为:求噪声方差;以矩阵为整体运算,求出n阶滤波器对应的像素点像素的均值,方差;将局部方差与噪声方差进行比较,按照规则计算新的像素,并存在结果矩阵中,输出。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1290583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多平台展示预约的服装小程序效果如何

线下实体服装店非常多,主要以同城生意为主,但随着电商经济增长,传统线下自然流量变少,商家们会选择线上入驻平台开店获得更多线上用户,包括自建私域小程序等。 而除了直接卖货外,线上展示预约在服装行业也…

html通过CDN引入使用Vue和ElementUI

html通过CDN引入使用Vue和ElementUI 近期遇到个需求,就是需要在.net MVC的项目中,对已有的项目的首页进行优化,也就是写原生html和js。但是咱是一个写前端的,写html还可以,.net的话,开发也不方便&#xff0…

【开源】基于JAVA的APK检测管理系统

项目编号: S 038 ,文末获取源码。 \color{red}{项目编号:S038,文末获取源码。} 项目编号:S038,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软…

Apache Flink(七):Apache Flink快速入门 - DataStream BATCH模式

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 下面使用Java代码使用DataStream…

784. 字母大小写全排列 dfs + 回溯算法 + 图解 + 笔记

784. 字母大小写全排列 - 力扣(LeetCode) 给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出 示例 1: 输入&#xf…

Meta开源最大多模态视频数据集—Ego-Exo4D

社交、科技巨头Meta联合15所大学的研究机构,经过两年多的努力发布了首个多模态视频训练数据集和基础套件Ego-Exo4D,用于训练和研究AI大模型。 据悉,该数据集收集了来自13个城市839名参与者的视频,总时长超过1400小时,包含舞蹈、足球、篮球、…

TCP实现一对一聊天

一,创建类 二,类 1.ChatSocketServer类 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Sca…

Windows 下 PyTorch 入门深度学习环境安装与配置 GPU 版

1.确定自己的硬件信息,确定电脑有英伟达 (NVIDIA)显卡 在任务栏上右键打开任务管理器 2.下载安装 Anaconda (建议安装迅雷下载,同时浏览器添加扩展 “迅雷Chrome支持”) https://www.anaconda.com/ https://repo.anaconda.com/arc…

挑选数据可视化工具:图表类型、交互功能与数据安全

作为一名数据分析师,我经常需要使用各种数据可视化工具来将数据以直观、清晰的方式呈现出来,以便更好地理解和分析。在市面上的众多可视化工具中,我根据实际需求和项目特点进行选择。本文将从以下几个角度对市面上的数据可视化工具进行对比&a…

bert其他内容个人记录

Pre-training a seq2seq model BERT只是一个预训练Encoder,有没有办法预训练Seq2Seq模型的Decoder? 在一个transformer的模型中,将输入的序列损坏,然后Decoder输出句子被破坏前的结果,训练这个模型实际上是预训练一个…

2023_Spark_实验二十七:Linux中Crontab(定时任务)命令详解及使用教程

Crontab介绍: Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ…

MySQL生僻字修改编码utf8mb4

1、查看你编码 SHOW VARIABLES WHERE Variable_name LIKE character_set_% OR Variable_name LIKE collation%;(如果不是下图则继续) 2、修改默认参数 /etc/my.cnf [mysqld] datadir/usr/local/mysql/data basedir/usr/local/mysql socket/usr/local/my…

Python内置类属性__str__的使用教程

概要 在Python中,每个类都有一些内置的特殊属性和方法,用于实现一些特殊的功能。其中一个特殊属性是__str__,它允许我们定义一个类的对象在打印时的输出格式。在本文中,我们将详细介绍__str__属性的使用教程,帮助读者…

MySQL:update set的坑

目录 一、问题描述 二、为何会出现这样的问题? 三、正确的方案 一、问题描述 我在修改mysql数据表时,看到下面的现象。 我表中原始数据如下: 执行了下面的修改,显示执行成功。 update user_function_record_entity set open_…

华为数通---配置ARP安全综合功能案例

简介 ARP(Address Resolution Protocol)安全是针对ARP攻击的一种安全特性,它通过一系列对ARP表项学习和ARP报文处理的限制、检查等措施来保证网络设备的安全性。ARP安全特性不仅能够防范针对ARP协议的攻击,还可以防范网段扫描攻击…

微信小程序 长按录音+录制视频

<view class"bigCircle" bindtouchstart"start" bindtouchend"stop"><view class"smallCircle {{startVedio?onVedio:}}"><text>{{startVedio?正在录音:长按录音}}</text></view> </view> <…

unity 2d 入门 飞翔小鸟 下坠功能且碰到地面要停止 刚体 胶囊碰撞器 (四)

1、实现对象要受重力 在对应的图层添加刚体 改成持续 2、设置胶囊碰撞器并设置水平方向 3、地面添加盒状碰撞器 运行则能看到小鸟下坠并落到地面上

排针排母是什么

排针排母 电子元器件百科 文章目录 排针排母前言一、什么是排针排母二、排针排母有哪些类别三、排针排母的应用实例四、排针排母的作用原理总结前言 排针排母连接器广泛应用于电子行业中,如电脑、手机、电视、打印机、工控设备等。它们提供了一种简单、可靠且灵活的连接解决方…

借助文档控件Aspose.Words,比较 Word、PDF 和 PPT 文档

在当今的数字时代&#xff0c;文档比较已成为一项重要任务&#xff0c;尤其是在法律、金融和合规相关行业。在比较 C# 中的文档时&#xff0c;Aspose API 提供了强大的解决方案。在这篇博文中&#xff0c;我们将探讨如何在 C# 中比较文档。分步指南和代码示例将演示如何比较两个…

MFC对话框集成OSG无法响应键盘事件

最近编译了OSG3.7的源码&#xff0c;通过MFC对话框集成显示。使用过程中&#xff0c;自定义的按键消息无法正常响应&#xff08;控制台窗口通过openGL的设备上下文环境可以正常响应&#xff0c;所以不是输入法的问题&#xff09;。网上搜了一下&#xff0c;发现相关文章很少&am…