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

文章目录

      • [1. 均值滤波 (Mean Filtering)](#1. 均值滤波 (Mean Filtering))
      • [2. 高斯滤波 (Gaussian Filtering)](#2. 高斯滤波 (Gaussian Filtering))
      • [3. 中值滤波 (Median 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=−2k∑2kn=−2k∑2kI(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=−2k∑2kn=−2k∑2kG(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实现上述三种滤波方法的代码示例:

python 复制代码
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.效果展示

在本次实验中,明显中值滤波的效果更优

相关推荐
CHANG_THE_WORLD8 分钟前
python 批量终止进程exe
开发语言·python
liann11914 分钟前
3.2_红队攻击框架--MITRE ATT&CK‌
python·网络协议·安全·网络安全·系统安全·信息与通信
云天AI实战派24 分钟前
AI 智能体问题排查指南:ChatGPT、API 调用到 Agent 上线失灵的全流程修复手册
大数据·人工智能·python·chatgpt·aigc
我的xiaodoujiao1 小时前
API 接口自动化测试详细图文教程学习系列15--项目实战演练2
python·学习·测试工具·pytest
多思考少编码2 小时前
PAT甲级真题1001 - 1005题详细题解(C++)(个人题解)
c++·python·最短路·pat·算法竞赛
ZhengEnCi2 小时前
M5-markconv自定义CSS样式指南 📝
前端·css·python
www_comsci2 小时前
【生物EI会议】2026年计算机技术与生物医学国际学术会议(CTBS 2026)
图像处理·神经网络·计算机视觉
ZhengEnCi2 小时前
M4-更新日志v0.1.3-Mermaid图表支持 📝
python
hsjcjh3 小时前
多模态长文本协同:用Gemini 3.1 Pro镜像官网破解复杂办公场景的效率困局(国内实测方案)
python
凯瑟琳.奥古斯特3 小时前
SQLAlchemy核心功能解析
开发语言·python·flask