Python数字图像处理实战——基于OpenCV实现多种滤波器(附完整代码和结果图)

Python数字图像处理实战——基于OpenCV实现多种滤波器(附完整代码和结果图)


关于作者


作者:小白熊

作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。

联系邮箱:xbx3144@163.com

科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~



1 前言

  图像处理是计算机视觉中非常重要的一部分,而滤波器是用于增强图像、减少噪声、检测边缘等的核心工具。通过不同的滤波器,我们可以处理图像中的噪声、模糊和细节,从而让图像在后续的处理步骤中更加清晰和准确。在本文中,我们将基于OpenCV展示如何实现多种常见的滤波操作,包括:

  1. 均值滤波
  2. 高斯滤波
  3. 中值滤波
  4. 双边滤波
  5. 自适应滤波
  6. Sobel 边缘检测
  7. Scharr 滤波



2 代码实现

2.1 导入所需库

首先我们导入一些常用的库,如 OpenCV 用于图像处理,Matplotlib 用于结果可视化。

import cv2
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")

# 配置Matplotlib显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

2.2 均值滤波

  均值滤波是一种简单的平滑滤波,它通过取周围像素的平均值来减小图像中的噪声。均值滤波的效果较为温和,适合用于去除随机噪声。

mean_filter = cv2.blur(img, (5, 5))

2.3 高斯滤波

  高斯滤波是一种常用的平滑滤波器,它使用高斯函数对邻域内的像素进行加权平均,能够较好地去除图像中的高斯噪声,同时保持图像边缘的细节。

gaussian_filter = cv2.GaussianBlur(img, (5, 5), 0)

2.4 中值滤波

  中值滤波是非线性滤波的一种,特别适用于去除椒盐噪声。它通过选取邻域中的中值代替中心像素,能够在保留边缘的同时去除噪声。

median_filter = cv2.medianBlur(img, 5)

2.5 双边滤波

  双边滤波在去除噪声的同时能够很好地保留边缘细节。它根据像素间的空间距离和颜色差异进行加权平均,是一种非常适合图像增强的滤波方法。

bilateral_filter = cv2.bilateralFilter(img, 9, 75, 75)

2.6 自适应滤波

自适应滤波是一种根据图像局部特征动态调整滤波方式的滤波器。在本例中,我们使用自适应阈值滤波对图像进行二值化处理,适合处理光照不均匀的图像。

adaptive_filter = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

2.7 Sobel 边缘检测滤波

  Sobel 滤波是经典的边缘检测方法,通过计算图像的梯度来提取边缘信息。Sobel 滤波器可以分别检测水平和垂直方向的边缘,最终将它们结合,得到完整的边缘图。

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
sobel_filter = np.hypot(sobelx, sobely)

2.8 Scharr 滤波

  Scharr 滤波是一种增强版的Sobel滤波器,在边缘检测时有更高的精度和更好的效果,尤其是在检测细微的边缘时表现更出色。

scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharr_filter = np.hypot(scharrx, scharry)


3 完整代码

import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import wiener
from skimage import restoration
import warnings
warnings.filterwarnings("ignore")

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 读取原始图像
img = cv2.imread('messi.jpg', cv2.IMREAD_GRAYSCALE)


# 均值滤波
mean_filter = cv2.blur(img, (5, 5))

# 高斯滤波
gaussian_filter = cv2.GaussianBlur(img, (5, 5), 0)

# 中值滤波
median_filter = cv2.medianBlur(img, 5)

# 双边滤波
bilateral_filter = cv2.bilateralFilter(img, 9, 75, 75)

# 自适应滤波(自适应阈值滤波)
adaptive_filter = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

# Sobel 边缘检测滤波
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
sobel_filter = np.hypot(sobelx, sobely)  # 计算梯度幅度

# Scharr 滤波
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharr_filter = np.hypot(scharrx, scharry)

# 创建子图来显示结果
plt.figure(figsize=(15, 15))

# 显示原始图像
plt.subplot(3, 3, 1)
plt.imshow(img, cmap='gray')
plt.title('原始图片')
plt.axis('off')

# 均值滤波
plt.subplot(3, 3, 2)
plt.imshow(mean_filter, cmap='gray')
plt.title('均值滤波')
plt.axis('off')

# 高斯滤波
plt.subplot(3, 3, 3)
plt.imshow(gaussian_filter, cmap='gray')
plt.title('高斯滤波')
plt.axis('off')

# 中值滤波
plt.subplot(3, 3, 4)
plt.imshow(median_filter, cmap='gray')
plt.title('中值滤波')
plt.axis('off')

# 双边滤波
plt.subplot(3, 3, 5)
plt.imshow(bilateral_filter, cmap='gray')
plt.title('双边滤波')
plt.axis('off')


# 自适应滤波
plt.subplot(3, 3, 6)
plt.imshow(adaptive_filter, cmap='gray')
plt.title('自适应滤波')
plt.axis('off')

# Sobel 滤波
plt.subplot(3, 3, 7)
plt.imshow(sobel_filter, cmap='gray')
plt.title('Sobel 滤波')
plt.axis('off')

# Scharr 滤波
plt.subplot(3, 3, 8)
plt.imshow(scharr_filter, cmap='gray')
plt.title('Scharr 滤波')
plt.axis('off')

plt.tight_layout()
# 保存图像
plt.savefig('results.png')

# 显示结果
plt.show()




结果图:

结果



4 滤波器的选择

  • 均值滤波:适合处理细微噪声,但可能模糊图像边缘。
  • 高斯滤波:适合去除高斯噪声,具有更好的边缘保留能力。
  • 中值滤波:适合去除椒盐噪声,保留边缘细节。
  • 双边滤波:在平滑图像的同时保留边缘,是图像增强的理想选择。
  • 自适应滤波:在光照变化较大的情况下,可以动态调整阈值处理图像。
  • Sobel 和 Scharr 滤波:用于边缘检测,后者精度更高,适合处理细微的边缘。



5 总结

  本文演示了几种常见滤波器的使用方法及其处理效果。每种滤波器都有各自的优势和适用场景,在实际应用中,选择合适的滤波器能够有效提高图像处理的效果。



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分辨率提高4到8倍!AI高清修复工具-upscayl使用方法!

你还在为手中的模糊照片苦恼吗? 是不是想把老照片或低分辨率的图片用于大尺寸印刷,却因为画质糟糕而无从下手? 现在你不再需要高深的Photoshop技能,也不用花费巨资找人修图。借助AI高清修复工具Upscayl,只需几秒钟&am…

Python、R语言Lasso、Ridge岭回归、XGBoost分析Airbnb房屋数据:旅游市场差异、价格预测

全文链接:https://tecdat.cn/?p37839 原文出处:拓端数据部落公众号 分析师: Kefan Yu 在大众旅游蓬勃发展的背景下,乡村旅游已成为推动乡村经济、社会和文化发展的关键力量。当前,乡村旅游接待设施主要以招待所、…

基于Python的抑郁症患者看护系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

如何实现Vue2项目升级Vue3?

Vue3正式版已经发布有两年多了,如今它也已成为Vue的默认开发版本,如果你想要对之前Vue2项目进行升级重构,可以从以下几个维度入手: ① 构建工具 ② 入口文件 ③ 插件 ④ 指令 ⑤ 路由 ⑥ 状态管理 ⑦ 其他 一、构建工具 Vue3推荐使…

HTB:Base[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which two TCP ports are open on the remote host? 2.What is the relative path on the webserver for the login page? 3.How many files are present in the /login directory? 4.What is the file extension of a swap file? …

springboot如何集成mybatis?

背景:以前一直是直接cv一个项目中现成的xml文件,然后再去自己配置mapper等数据。自己准备做一个单独的例子试一下。 步骤1:在pom.xml文件中插入mybatis-generator插件,这里选的版本是1.3.2,然后指定的generator文件是在…

IDM6.42下载器!下载速度就像坐上了火箭,嗖嗖的快到飞起!

亲爱的朋友们,今天我要给大家安利一款下载神器——Internet Download Manager 6.42(简称IDM)!这款软件简直就是下载界的“速度与激情”,用了它之后,你会发现下载速度就像坐上了火箭,嗖嗖的快到飞…

Python 如何使用 SQLAlchemy 进行复杂查询

Python 如何使用 SQLAlchemy 进行复杂查询 一、引言 SQLAlchemy 是 Python 生态系统中非常流行的数据库处理库,它提供了一种高效、简洁的方式与数据库进行交互。SQLAlchemy 是一个功能强大的数据库工具,支持结构化查询语言(SQL)…

Windows 通过 Docker 安装 GitLab

1. 安装 Docker Desktop 下载网站:Windows | Docker Docs 2. 拉取 GitLab Docker 镜像 打开 PowerShell 或 命令提示符,拉取 GitLab 镜像: docker pull gitlab/gitlab-ee:latest或则使用社区版: docker pull gitlab/gitlab-ce…

【C++】STL——stack和queue

目录 前言容器配接器(适配器)stack的使用stack的模拟实现queue的使用queue的模拟实现双端队列(deque) 前言 前面我们已经学习了STL容器中的string、vector还有list。 【C】string的模拟实现 【C】STL——vector的模拟实现 【C】S…

CTF-PWN方向 栈溢出等基础知识笔记(2)

ret2syscall 要求有0x80这种系统调用存在 (0x0A是回车的意思) 案例 通过file查看这个文件 发现是静态编译的文件 所以很多库函数都被编译进去了 但是不存在bin/sh字符串 不存在system和backdoor函数 系统调用需要用到的寄存器 通过ROPgadget工具来查找…

传统图像处理Opencv分割不同颜色的夹子

任务要求🍉 1. 计算图像中夹子的总数。 2. 分别计算不同颜色夹子的个数。 3. 使用以下方法适应三张图片,并在每张图像上显示结果: - 阈值方法 - HSV颜色空间 - 连通域分析 - 形态学图像处理 - Canny边缘检测 4. 在结果中显示计…

《数据密集型应用系统设计》笔记——第二部分 分布式数据系统(ch5-9)

第5章 数据复制 目的: 地理位置更近,降低延迟故障冗余提高读吞吐量 主节点与从节点(主从复制) 主从复制: 写请求发送给主节点,主节点将新数据写入本地存储;主节点将数据更改作为复制的日志发送…

使用java做一个微信机器人

微信机器人这个功能,目前在市面上运用的还是不是很多,每个人实现机器人的目的也不一样,有的为了自动加好友;有的为了自动拉群:也有的为了机器人对话聊天等等一系列。想必大家对微信机器人感兴趣的伙伴,但是大多数走到一半遇到各种…

Android Jetpack Compose中UI刷新的几种方式

Android Jetpack Compose中UI刷新的几种方式 在 Jetpack Compose 中,如果你想强制刷新 UI,可以使用 remember 和 mutableStateOf 来创建一个可观察的状态。当这个状态变化时,Compose 会自动重组 UI。以下是一些常见的方法来实现这一点: 1. 使用 mutableStateOf 你可以使…

[SQL] 安装

一 Windows 1.1 下载 进入Mysql的官方网站,点击下载->找到社区版本 选择对应操作系统进行下载。 点击下载 选择直接下载即可 1.2 安装 选择Full安装: MySQL服务器、客户端程序和其他附加工具如果只需要服务端那就选择Server only即可 点击执行,等待组件下载完…

【Unity踩坑】UWP项目安装包认证失败

问题:在Unity导出的VS项目,打包生成appx后,进行应用认证时失败。提示部分API不支持。 API __C_specific_handler in kernel32.dll is not supported for this application type. UnityPlayer.dll calls this API.API DXGIGetDebugInterface1 …

Windows 搭建 Gitea

一、准备工作 1. 安装 Git:Gitea 依赖 Git 进行代码管理,所以首先需要确保系统中安装了 Git。 下载地址:https://git-scm.com/downloads/win 2. 安装数据库(可选) 默认情况下,Gitea 使用 SQLite 作为内…

k8s部署学习

8s的架构 一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件 1 master:集群的控制平面,负责集群的决策 ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、…

【每天学点AI】大模型如何做情感分类?BERT是如何做情感分类的?

BERT是如何做情感分类的呢?今天,让我们一起揭开BERT模型的神秘面纱,看看它是如何巧妙地进行情感分类的! BERT,作为一个双向编码器模型,它的独特之处在于能够全面吸收一段文本或句子的精髓。 通过tokenizer…