010 OpenCV中的4种平滑滤波

news2024/11/13 9:53:04

目录

一、环境

二、平滑滤波

2.1、均值滤波

2.2、高斯滤波

2.3、中值滤波

2.4、双边滤波

三、完整代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、平滑滤波

2.1、均值滤波

在OpenCV库中,blur函数是一种简单而有效的图像平滑处理方法,也被称为均值滤波。该函数通过将图像中每个像素的值设置为其邻域中像素值的平均值,从而消除图像中的噪声。

函数原型如下:

cv2.blur(src, ksize[, dst[, anchor]])

参数解释:

  • src: 输入图像。它必须是8位或32位浮点型。
  • ksize: 这是均值滤波器的大小,它必须是奇数,并且可以有两种形式:例如 (5,5) 或 5. 在第二种情况下,滤波器将是正方形的,而在第一种情况下,滤波器将是矩形的。
  • dst: 输出图像。它的类型和源图像相同。
  • anchor: 锚点的位置。默认值是 (-1,-1),这表示锚点在滤波器的中心。

下面是一个简单的示例:

import cv2 
import numpy as np 
# 加载图像 
img = cv2.imread('image.jpg') 
# 应用blur函数 
blurred = cv2.blur(img, (5,5)) # 使用5x5的滤波器 
# 显示原图和处理后的图像 
cv2.imshow('Original Image', img) 
cv2.imshow('Blurred Image', blurred) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

需要注意的是,虽然blur函数可以有效地消除噪声,但它也可能导致图像失去一些细节。因此,在使用此函数时,您可能需要考虑在消除噪声和保留细节之间取得平衡。

2.2、高斯滤波

GaussianBlur是OpenCV库中的一个函数,它用于对图像进行高斯模糊。高斯模糊是一种图像处理技术,通过对图像的每个像素应用一个高斯函数来达到模糊效果。这种方法在消除噪声和细节提取方面非常有效。

函数原型如下:

cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])

参数解释:

  • src: 输入图像。它必须是8位或32位浮点型。
  • ksize: 高斯核的大小。这个值必须是正整数,并且可以有两种形式:例如 (5,5) 或 5. 在第二种情况下,滤波器将是正方形的,而在第一种情况下,滤波器将是矩形的。
  • sigmaX: 表示高斯核函数在X方向的标准偏差。如果sigmaX是0,那么标准偏差将根据核大小ksize计算。
  • dst: 输出图像。它的类型和源图像相同。
  • sigmaY: 表示高斯核函数在Y方向的标准偏差。如果sigmaY是0,那么标准偏差将根据核大小ksize计算。
  • borderType: 像素外插法,默认值为cv2.BORDER_DEFAULT。

下面是一个简单的示例:

python
import cv2  
import numpy as np  
  
# 加载图像  
img = cv2.imread('image.jpg')  
  
# 应用GaussianBlur函数  
blurred = cv2.GaussianBlur(img, (5,5), 0) # 使用5x5的高斯滤波器,无sigmaY值,所以根据核大小计算标准偏差  
 
# 显示原图和处理后的图像  
cv2.imshow('Original Image', img)  
cv2.imshow('Blurred Image', blurred)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

与blur函数相比,GaussianBlur可以提供更加柔和的模糊效果,因为它考虑了图像的更多频率内容。但是,这也会导致更多的细节丢失。因此,在使用此函数时,您可能需要考虑在消除噪声和保留细节之间取得平衡。

2.3、中值滤波

medianBlur函数是OpenCV库中的一个函数,用于对图像进行中值滤波处理,即使用中值滤波器来平滑图像。

函数原型如下:

cv2.medianBlur(src, ksize[, dst])
  • src: 输入图像,必须是8位或32位浮点型。
  • ksize: 滤波器的大小,必须是奇数,可以有两种形式:例如 (5,5) 或 5。当ksize为3或者5的时候,图像深度需为CV_8U,CV_16U,或CV_32F其中之一,而对于较大孔径尺寸的图片,它只能是CV_8U。
  • dst: 输出图像,类型和源图像相同。可以用Mat::Clone来初始化得到目标图。

medianBlur函数使用中值滤波器来平滑图像。对于多通道图片,每一个通道都单独进行处理,并且支持就地操作(In-place operation)。在边界类型(BorderTypes)方面,使用的是BORDER_REPLICATE。

2.4、双边滤波

双边滤波(Bilateral Filter)是一种非线性的滤波方法,结合了图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。

双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。 但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

三、完整代码

import sys
import cv2 as cv
import numpy as np

#  Global Variables

DELAY_CAPTION = 1500
DELAY_BLUR = 100
MAX_KERNEL_LENGTH = 31

src = None
dst = None
window_name = 'Smoothing Demo'


def main(argv):
    cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE)
    # 读取图片
    imageName = argv[0] if len(argv) > 0 else 'data/lena.jpg'
    global src
    src = cv.imread(cv.samples.findFile(imageName))
    if src is None:
        print ('Error opening image')
        return -1
    if display_caption('Original Image') != 0:
        return 0

    global dst
    dst = np.copy(src)
    if display_dst(DELAY_CAPTION) != 0:
        return 0
    # 均值滤波
    if display_caption('Homogeneous Blur') != 0:
        return 0
    for i in range(1, MAX_KERNEL_LENGTH, 2):
        dst = cv.blur(src, (i, i))
        if display_dst(DELAY_BLUR) != 0:
            return 0
    # 高斯滤波
    if display_caption('Gaussian Blur') != 0:
        return 0
    for i in range(1, MAX_KERNEL_LENGTH, 2):
        dst = cv.GaussianBlur(src, (i, i), 0)
        if display_dst(DELAY_BLUR) != 0:
            return 0
    # 中值滤波
    if display_caption('Median Blur') != 0:
        return 0
    for i in range(1, MAX_KERNEL_LENGTH, 2):
        dst = cv.medianBlur(src, i)
        if display_dst(DELAY_BLUR) != 0:
            return 0
    # 双边滤波
    if display_caption('Bilateral Blur') != 0:
        return 0
    # 双边滤波计算量相对大,所以当kernel半径很大的时候,就会较慢
    for i in range(1, MAX_KERNEL_LENGTH, 2):
        dst = cv.bilateralFilter(src, i, i * 2, i / 2)
        if display_dst(DELAY_BLUR) != 0:
            return 0

    display_caption('Done!')
    return 0

# 显示黑色背景+文字
def display_caption(caption):
    global dst
    dst = np.zeros(src.shape, src.dtype)
    rows, cols, _ch = src.shape
    cv.putText(dst, caption, (int(cols / 4), int(rows / 2)), cv.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255))
    return display_dst(DELAY_CAPTION)

# 显示效果图
def display_dst(delay):
    cv.imshow(window_name, dst)
    c = cv.waitKey(delay)
    if c >= 0 : return -1
    return 0


if __name__ == "__main__":
    main(sys.argv[1:])

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

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

相关文章

vue3 echarts滑动条datazoom怎么设置圆角

效果图 代码 dataZoom: [// {// type: "slider",// show: val.Ydata.length > 8 ? true : false, //隐藏或显示(true)组件// backgroundColor: "#1c3030", // 组件的背景颜色。// fillerColor: "#74adb2", // 选…

小叶子钢琴智能陪练 助力打牢钢琴基础

孩子在练琴过程中,经常会出现错音错节奏,为了能够帮助她更高效的练琴,最近开始使用智能钢琴陪练工具——小叶子钢琴智能陪练。 身边也有很多朋友在用这款应用,它比较知名的功能就是三大练琴模式,也就是识谱模式、提升…

Java Web 实战 21 - 用 Servlet 实现一个Hello World

用 Servlet 来写一个 Hello World~ 一 . 基本部署方式1.1 创建 Servlet 项目1.2 引入依赖1.3 创建目录1.4 编写代码继承 HttpServlet重写 doGet 方法删除 super 方法加上 WebServlet 注解写业务逻辑 1.5 打包1.6 部署1.7 验证1.8 小结 二 . 更方便的部署方式2.1 Smart Tomcat 的…

详解开源数据库审计平台Yearning

基本概念 数据库审计(简称DBAudit)能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断。它通过对用户访问数据库行为的记录、分析和汇报&…

python树的双亲存储结构

这种存储结构是一种顺序存储结构,采用元素形如“[结点值,双亲结点索引]”的列表表示。通常每个结点有唯一的索引(或者伪地址),根结点的索引为0,它没有双亲结点,其双亲结点的索引为-1。例如,所示的树对应的双…

项目中常用的 19 条 SQL 优化宝典

一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引…

Cobalt Strike之反向上线操作

前言 ​ Cobalt Strike 使用 GUI 框架 SWING(一种java GUI的库)开发,攻击者可通过CS木马在 beacon 元数据中注入恶意 HTML 标签,使得Cobalt Strike对其进行解析并且加载恶意代码(类似XSS攻击),…

【Proteus仿真】【51单片机】智能垃圾桶设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。 主要功能: 系统运行后&#xf…

【LeetCode刷题笔记】DFSBFS(三)

图的基础知识 邻接矩阵是一个二维表,其中横纵坐标交叉的格子值为 1 的表示这两个顶点是连通的,否则是不连通的。

BUUCTF [ACTF新生赛2020]outguess 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,得到一堆文件。 解题思路: 1、根据题目和flag.txt文件提示,猜测为outguess隐写。 outguess下载安装 kail 终端命…

竞赛YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快,YOLOv6还没用熟YOLOv7就来了,如果有同学的毕设项目想用上最新的技术,不妨看看学长的这篇文章,学长带大家简单的…

IP 代理的基础知识有哪些?

本文将介绍流冠IP代理的基础知识,帮助您了解IP代理的概念、类型、作用、设置方法和注意事项。 一、IP代理的概念 IP代理是一种网络代理服务,它通过代理服务器帮助用户访问互联网,并将用户的请求转发到目标网站,同时将目标网站的响…

技术面时,一定要掌握这3个关键点

前言 现在有这么多优秀的测试工程师,大家都知道技术面试是不可避免的一个环节,一般技术面试官都会通过自己的方式去考察你的技术功底与基础理论知识。 如果你参加过一些大厂面试,肯定会遇到一些这样的问题: 1、看你项目都用到了…

TCP/IP协议:最流行的电子邮件协议SMTP(简单邮件传输协议)详解

SMTP 是一种电子邮件协议,用于通过互联网从一个电子邮件帐户向另一个电子邮件帐户发送电子邮件。它是TCP/IP协议应用层的一部分。作为一种电子邮件协议,它建立了不同电子邮件客户端和帐户之间轻松信息交换的规则。这样,简单邮件传输协议就可以…

【SpringBoot系列】SpringBoot日志配置

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【JavaScript】3.1 项目实践:制作一个简单的网页应用

文章目录 项目需求HTML结构JavaScript逻辑添加待办事项标记待办事项删除待办事项保存待办事项 总结 在此章节中,我们将学习如何使用JavaScript创建一个简单的网页应用。这将是一个待办事项列表应用,用户可以添加新的待办事项,标记已完成的事项…

【C++学习手札】模拟实现list

​ 🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:リナリア—まるりとりゅうが 0:36━━━━━━️💟──────── 3:51 🔄 ◀️ ⏸ ▶️…

深入理解计算机系统(原书第三版)PDF 高清中文版

深入理解计算机系统 PDF 深入理解计算机系统 pdf, 这本书的全名是:Computer Systems:A Programmer’s Perspective(所以它又被称为 CSAPP),个人习惯把它翻译为程序员所需了解的计算机系统知识,尽…

基于GPRS的汽车碰撞自动报警系统(论文+源码)

1. 系统设计 本次基于GPRS的汽车碰撞自动报警系统的设计中,其主要的目标功能如下:1、实时检测当前的GPS精度和纬度坐标;2.当发生碰撞后系统自动将当前的信息通过GPRS数据发送到远端数据进行报警;3、系统在碰撞后一方面进行本地报警…

运放如何进行全波整流

对于一个双极性的交流信号,如果想要把负半轴的信号镜像到正半轴,我们可以接一个整流桥,这种叫做全波整流。 如果双极性的交流信号经过一个二极管,则交流信号的负半轴不能通过二极管,输出只有正半轴的信号,这…