图像处理:Python使用OpenCV 减少图片噪音

news2024/12/25 9:22:04

文章目录

      • 1. 均值滤波 (Mean Filtering)
      • 2. 高斯滤波 (Gaussian Filtering)
      • 3. 中值滤波 (Median Filtering)
      • 4.代码实现示例
      • 5.效果展示

在图像处理中,均值滤波、高斯滤波和中值滤波是三种常用的降噪方法。它们的实现原理各有不同:

1. 均值滤波 (Mean Filtering)

实现原理
均值滤波是通过计算滤波窗口内所有像素值的平均值来平滑图像。它是一种线性滤波器,能有效地减少噪声,但也会模糊图像的边缘。

步骤

  1. 选择一个大小为 ( k \times k ) 的窗口(滤波器核)。
  2. 将窗口在图像上滑动,每次计算窗口内所有像素的均值。
  3. 用该均值替换窗口中心的像素值。

公式
对于每个像素 ((i, j)),新的像素值 (I’(i, j)) 计算如下:

I ′ ( i , j ) = 1 k 2 ∑ m = − k 2 k 2 ∑ n = − k 2 k 2 I ( i + m , j + n ) I'(i, j) = \frac{1}{k^2} \sum_{m=-\frac{k}{2}}^{\frac{k}{2}} \sum_{n=-\frac{k}{2}}^{\frac{k}{2}} I(i+m, j+n) I(i,j)=k21m=2k2kn=2k2kI(i+m,j+n)

2. 高斯滤波 (Gaussian Filtering)

实现原理
高斯滤波使用高斯函数的权重来计算滤波窗口内像素的加权平均值。相比均值滤波,它能更好地保留边缘信息。高斯滤波器是一种线性滤波器,权重的分布是中心对称的高斯分布。

步骤

  1. 选择一个大小为 ( k \times k ) 的高斯窗口(滤波器核),并计算其权重。
  2. 将窗口在图像上滑动,每次计算窗口内像素的加权平均值。
  3. 用该加权平均值替换窗口中心的像素值。

公式
高斯函数的权重 ( G(x, y) ) 计算如下:

G ( x , y ) = 1 2 π σ 2 exp ⁡ ( − x 2 + y 2 2 σ 2 ) G(x, y) = \frac{1}{2\pi\sigma^2} \exp\left(-\frac{x^2 + y^2}{2\sigma^2}\right) G(x,y)=2πσ21exp(2σ2x2+y2)
对于每个像素 ((i, j)),新的像素值 (I’(i, j)) 计算如下:
I ′ ( i , j ) = ∑ m = − k 2 k 2 ∑ n = − k 2 k 2 G ( m , n ) ⋅ I ( i + m , j + n ) I'(i, j) = \sum_{m=-\frac{k}{2}}^{\frac{k}{2}} \sum_{n=-\frac{k}{2}}^{\frac{k}{2}} G(m, n) \cdot I(i+m, j+n) I(i,j)=m=2k2kn=2k2kG(m,n)I(i+m,j+n)

3. 中值滤波 (Median Filtering)

实现原理
中值滤波是通过选择滤波窗口内所有像素值的中值来平滑图像。它是一种非线性滤波器,特别适用于去除椒盐噪声,并且能很好地保留图像边缘。

步骤

  1. 选择一个大小为 ( k \times k ) 的窗口。
  2. 将窗口在图像上滑动,每次提取窗口内所有像素值。
  3. 将提取的像素值排序,选择中间值作为新的像素值。

公式
对于每个像素 ((i, j)),新的像素值 (I’(i, j)) 计算如下:

I ′ ( i , j ) = median { I ( i + m , j + n ) ∣ m , n ∈ [ − k 2 , k 2 ] } I'(i, j) = \text{median} \{ I(i+m, j+n) | m, n \in [-\frac{k}{2}, \frac{k}{2}] \} I(i,j)=median{I(i+m,j+n)m,n[2k,2k]}

4.代码实现示例

下面是使用OpenCV实现上述三种滤波方法的代码示例:

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

def apply_mean_filter(image):
    return cv2.blur(image, (5, 5))

def apply_gaussian_filter(image):
    return cv2.GaussianBlur(image, (5, 5), 1.0)

def apply_median_filter(image):
    return cv2.medianBlur(image, 5)

def display_images(original, mean_filtered, gaussian_filtered, median_filtered):
    titles = ['Original Image', 'Mean Filtered Image', 'Gaussian Filtered Image', 'Median Filtered Image']
    images = [original, mean_filtered, gaussian_filtered, median_filtered]

    for i in range(4):
        plt.subplot(2, 2, i+1), plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])

    plt.show()

def main():
    image_path = 'path_to_your_image.jpg'  # 请替换为你的图像路径
    image = cv2.imread(image_path)

    if image is None:
        print(f"Error: Unable to load image at {image_path}")
        return

    mean_filtered = apply_mean_filter(image)
    gaussian_filtered = apply_gaussian_filter(image)
    median_filtered = apply_median_filter(image)

    display_images(image, mean_filtered, gaussian_filtered, median_filtered)

if __name__ == "__main__":
    main()
  1. 均值滤波:使用 cv2.blur(image, (5, 5)) 实现。
  2. 高斯滤波:使用 cv2.GaussianBlur(image, (5, 5), 1.0) 实现,其中 1.0 是标准差。
  3. 中值滤波:使用 cv2.medianBlur(image, 5) 实现。

5.效果展示

在本次实验中,明显中值滤波的效果更优
在这里插入图片描述

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

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

相关文章

SD文生图超详参数使用技巧和方法-看这一篇就懂了!!!

【Stable Diffusion】文生图超详参数使用技巧和方法推荐 仁者见仁,智者见智,一千个读者,一千个哈姆雷特。 此章为记录学习和分享,为后继初学者提供便利。 作者:AI时代社 链接:https://zhuanlan.zhihu.com…

hot100 -- 栈

目录 🚩有效的括号 🌼最小栈 AC 栈 AC 链表 🌼字符串解码 🐻每日温度 🍒柱状图中的最大矩形 解释 AC 单调栈 🚩有效的括号 20. 有效的括号 - 力扣(LeetCode) 1&#xf…

Seal^_^【送书活动第6期】——《Docker快速入门》

Seal^_^【送书活动第6期】——《Docker快速入门》 一、参与方式二、本期推荐图书2.1 作者荐语2.2 编辑推荐2.3 图书简介2.4 前 言2.5 目 录 三、正版购买 从Docker Desktop入手,快速掌握容器技术!!!! 一、参与方式 1、…

HALCON-从入门到入门-阈值分割定位算子综合运用

1.废话 之前我的一个师兄告诉我,针对图像上想要定位的内容,机器视觉中定位的方式有很多种,但是如果用阈值分割定位可以做的,就不要用模板匹配了。因为基于形状的模板匹配始终会存在匹配不到的风险,那如果打光效果可以…

VS2022使用C语言代码访问MariaDB数据库

第一步,先安装数据库服务器,如果你不想安装这个服务器,请看结尾: 第二步,建立数据库 第三步,配置VS2022 第四步,写代码 ,这里其实使用的是MariaDB 的C语言 API #include <stdio.h> #include <window

python添加两组实验显著性

Python-statannotations库添加显著性标注&#xff1a; 1、官网资料&#xff1a;https://github.com/trevismd/statannotations 官网例子&#xff1a; import seaborn as snsfrom statannotations.Annotator import Annotatordf sns.load_dataset("tips") x "…

使用 C# 学习面向对象编程:第 7 部分

多态性 我们在程序中使用多态的频率是多少&#xff1f;多态是面向对象编程语言的第三大支柱&#xff0c;我们几乎每天都在使用它&#xff0c;却不去想它。 这是一个非常简单的图表&#xff0c;它将解释多态性本身。 简单来说&#xff0c;我们可以说&#xff0c;只要我们重载类…

机器学习模型评价、模型与算法选择(综述)

摘要&#xff1a;本文主要讨论了模型评估、模型选择和算法选择的重要性&#xff0c;并回顾了解决这些任务的不同技术。文章强调了在小数据集上不推荐使用留出方法&#xff0c;而应使用bootstrap技术来评估性能的不确定性。在讨论偏差-方差权衡时&#xff0c;文章比较了leave-on…

【紧急警示】Locked勒索病毒利用最新PHP远程代码执行漏洞大规模批量勒索!文末附详细加固方案

1. Locked勒索病毒介绍 locked勒索病毒属于TellYouThePass勒索病毒家族的变种&#xff0c;其家族最早于2019年3月出现&#xff0c;擅长利用高危漏洞被披露后的短时间内&#xff0c;利用1Day对暴露于网络上并存在有漏洞未修复的机器发起攻击。该家族在2023年下半年开始&#xf…

给Windows软件添加异常捕获模块生成dump文件(附源码)

软件在运行过程中会时常发生内存越界、内存访问为例、stack overflow线程栈溢出、空指针与野指针等异常崩溃,仅仅是依靠Debug和Release下的调试是远远不够的,因为有些崩溃不是必现的,或者是Debug下很难出现的。所以我们需要在软件中添加异常捕获的模块,在捕获到异常时生成包…

盐酸酸洗废水合理的处理手段

盐酸酸洗废水处理是工业生产中一项重要的环保措施&#xff0c;特别是在钢铁、金属加工等行业中&#xff0c;酸洗废水因其高酸性和高金属离子含量而需要得到妥善处理。以下是对盐酸酸洗废水处理的详细分析和讨论。 一、盐酸酸洗废水的特性 盐酸酸洗废水主要来源于钢材的酸洗线&a…

一文读懂CRM系统到底怎么选?

CRM系统&#xff08;即客户关系管理系统&#xff09;能够帮助企业有效管理客户关系、提升客户满意度、增加销售机会以及优化业务流程。然而&#xff0c;面对市场上众多的CRM供应商&#xff0c;企业如何选择最适合自身需求的CRM软件显得尤为重要。 选择不当的CRM系统可能导致一系…

WordPress——Argon主题美化

文章目录 Argon主题美化插件类类别标签页面更新管理器文章头图URL查询监视器WordPress提供Markdown语法评论区头像设置发信设置隐藏登陆备份设置缓存插件 主题文件编辑器页脚显示在线人数备案信息(包含备案信息网站运行时间)banner下方小箭头滚动效果站点功能概览下方Links功能…

AI大模型的战场:通用与垂直的较量

AI大模型的战场&#xff1a;通用与垂直的较量 引言&#xff1a;AI界的“通才”与“专家” 在AI的大千世界里&#xff0c;有这样两类模型&#xff1a;一类是像瑞士军刀一样多功能的通用大模型&#xff0c;另一类则是像手术刀一样精准的垂直大模型。它们在AI战场上展开了一场激…

【Ardiuno】实验使用ESP32单片机实现高级web服务器暂时动态图表功能(图文)

接下来&#xff0c;我们继续实验示例代码中的Wifi“高级web服务器”&#xff0c;配置相关的无线密码后&#xff0c;开始实验 #include <WiFi.h> #include <WiFiClient.h> #include <WebServer.h> #include <ESPmDNS.h>const char *ssid "XIAOFE…

docker-compose启动oracle11、并使用navicat进行连接

一、docker-compose.yml version: 3.9 services:oracle:image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11grestart: alwaysprivileged: truecontainer_name: oracle11gvolumes:- ./data:/u01/app/oracleports:- 1521:1521network_mode: "host"logging:d…

[数据集][目标检测]胸部解剖检测数据集VOC+YOLO格式100张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;100 标注数量(xml文件个数)&#xff1a;100 标注数量(txt文件个数)&#xff1a;100 标注类别…

代理IP的稳定性与安全性应如何保障?

在数字化时代&#xff0c;代理IP作为访问网络的重要工具&#xff0c;其稳定性和安全性对于保障网络使用体验和隐私保护具有至关重要的意义。今天IPIDEA就为大家分享保障代理IP的稳定性与安全性的几个关键点。 一、选择可靠的代理服务提供商 确保代理IP稳定性的关键是选择一家可…

【工具】拉取或者review github上别人提的未合入开源项目的PR代码

一、pr id 链接后加.patch 举个例子说下吧。 比如我们有下面的PR链接&#xff1a; https://github.com/apache/hadoop/pull/6871/files 其界面如下所示&#xff1a; 我们只需要把URL改成&#xff1a; https://github.com/apache/hadoop/pull/6871.patch 它就会自动跳转后变…

解决el-table表格拖拽后,只改变了数据,表头没变的问题

先看看是不是你想要解决的问题 拖拽后表头不变的bug修复 这个问题一般是使用v-for对column的数据进行循环的时候&#xff0c;key值绑定的是个index导致的&#xff0c;请看我上篇文章&#xff1a;eleplus对el-table表格进行拖拽(使用sortablejs进行列拖拽和行拖拽)&#xff1a;-…