当前位置: 首页 > ops >正文

OpenCV中对图像进行平滑处理的4种方式

OpenCV 提供了多种图像平滑(模糊)处理方法,用于减少图像噪声、平滑细节,常见的有以下四种:

一、均值滤波(Mean Blurring)

原理:用像素周围 n×n 邻域内所有像素的平均值替代该像素值。

特点:简单快速,但可能导致图像边缘模糊。

函数cv2.blur(src, ksize)

参数:src:输入图像

ksize:卷积核大小(如 (3,3)(5,5)

代码实现:

import cv2
import numpy as np
# 对图片进行噪声处理
def add_peppersalt_noise(image,n=10000):result = image.copy()h,w= image.shape[:2]        # 获取图片的高和宽for i in range(n):          # 生成n个椒盐噪声x=np.random.randint(1,h)y=np.random.randint(1,w)if np.random.randint(0,2) == 0:result[x,y]=0else:result[x,y]= 255return result
#导入图片
image =cv2.imread('2197.jpg')
image = cv2.resize(image,dsize=None,fx=0.2,fy=0.2)# 对图片进行缩放
cv2.imshow('yuantu',image) # 原图
cv2.waitKey(0)
noise = add_peppersalt_noise(image) # 噪声处理后的图片
cv2.imshow('noise',noise)
cv2.waitKey(0)
# 均值滤波 blur
blur_1 = cv2.blur(noise,(3,3))  # 均值处理后的图片
cv2.imshow('blur_1',blur_1)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

二、方框滤波 boxFilter

原理:方框滤波通过一个固定大小的矩形(方框)卷积核对图像进行卷积操作:

归一化方框滤波:计算方框内所有像素的平均值,替代中心像素值(效果与均值滤波完全一致)。

非归一化方框滤波:计算方框内所有像素的总和(不除以方框面积),可能导致像素值溢出(需注意数据类型)

特点:计算简单快速,适合对实时性要求高的场景

函数:cv2.boxFilter(src, ksize,ddepth,normalize)

参数:src:输入图像(必须是单通道或多通道的 numpy 数组)。

ddepth:输出图像的深度(数据类型),通常设为 -1 表示与输入图像深度相同。

ksize:卷积核大小(如 (3,3)(5,5)),必须是正奇数。

normalize:是否归一化(布尔值):

normalize=True(默认):归一化,等价于均值滤波(结果 = 像素和 / 方框面积)。normalize=False:非归一化,结果 = 像素总和(可能超过像素值范围,需后续处理)。

代码实现:

import cv2
import numpy as np
# 对图片进行噪声处理
def add_peppersalt_noise(image,n=10000):result = image.copy()h,w= image.shape[:2]        # 获取图片的高和宽for i in range(n):          # 生成n个椒盐噪声x=np.random.randint(1,h)y=np.random.randint(1,w)if np.random.randint(0,2) == 0:result[x,y]=0else:result[x,y]= 255return result
#导入图片
image =cv2.imread('2197.jpg')
image = cv2.resize(image,dsize=None,fx=0.2,fy=0.2)
cv2.imshow('yuantu',image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)
# 方框滤波  boxFilter
boxFilter_1 =cv2.boxFilter(noise,-1,(3,3),normalize = True)
cv2.imshow('boxFilter_1',boxFilter_1)
cv2.waitKey(0)
boxFilter_2 = cv2.boxFilter(noise,-1,(3,3),normalize = False)
cv2.imshow('boxFilter_2',boxFilter_2)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

三、高斯滤波(Gaussian Blurring)

原理:用高斯函数生成的权重矩阵(中心像素权重更高,边缘像素权重更低)对邻域像素加权平均。

特点:比均值滤波更保留图像细节,对高斯噪声(如相机传感器噪声)效果好。

函数cv2.GaussianBlur(src, ksize, sigmaX,sigmaY)

参数:src:输入图像,通常是一个NumPy数组。 ksize:滤波器的大小,它是一个元组,表示在水平和垂直方向上的像素数量。例如。(5,5)表示一个5x5的滤波器。

siqmaX和siqmaY:分别表示在X轴和Y轴方向上的标准差。这些值与滤波器大小相同。默认持况下、它们都等于0,这意味着没有高斯模糊。

dst:输出图像,通常是一个NumPy数组。如果为None,则会创建一个新的数组来存储结果

代码实现:

import cv2
import numpy as np
def add_peppersalt_noise(image,n=10000):result = image.copy()h,w= image.shape[:2]        # 获取图片的高和宽for i in range(n):          # 生成n个椒盐噪声x=np.random.randint(1,h)y=np.random.randint(1,w)if np.random.randint(0,2) == 0:result[x,y]=0else:result[x,y]= 255return result
# 导入图片
image =cv2.imread('2197.jpg')
image = cv2.resize(image,dsize=None,fx=0.2,fy=0.2)
cv2.imshow('yuantu',image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)
#  高斯滤波 GaussianBlur
GaussianB = cv2.GaussianBlur(noise,(3,3),1)
cv2.imshow('GaussianBlur',GaussianB)
cv2.waitKey(0)

结果:

四、中值滤波(Median Blurring)

原理:用像素周围 n×n 邻域内所有像素的中值替代该像素值。

特点:对椒盐噪声(图像中的黑白斑点)效果极佳,能有效保留边缘。

函数cv2.medianBlur(src, ksize,dst)

参数:src:输入图像。

ksize:滤波器的大小,它是一个整数,表示在水平和垂直方向上的像素数量。例如、5表示一个5x5的滤波器。

dst:输出图像,通常是一个NumPy数组。如果为None,则会创建一个新的数组来存储结果。

代码实现:

import cv2
import numpy as np
def add_peppersalt_noise(image,n=10000):result = image.copy()h,w= image.shape[:2]        # 获取图片的高和宽for i in range(n):          # 生成n个椒盐噪声x=np.random.randint(1,h)y=np.random.randint(1,w)if np.random.randint(0,2) == 0:result[x,y]=0else:result[x,y]= 255return result
# 导入图片
image =cv2.imread('2197.jpg')
image = cv2.resize(image,dsize=None,fx=0.2,fy=0.2)
cv2.imshow('yuantu',image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)
# 中值滤波 medianBlur
medianB =cv2.medianBlur(noise,3)
cv2.imshow('medianBlur',medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

总结

由四种滤波方式得到的结果可以看到对于去除椒盐噪声优先使用中值滤波

http://www.xdnf.cn/news/17716.html

相关文章:

  • 《多级缓存架构设计与实现全解析》
  • 【跨越 6G 安全、防御与智能协作:从APT检测到多模态通信再到AI代理语言革命】
  • 机器视觉的磁芯定位贴合应用
  • GraphRAG查询(Query)流程实现原理分析
  • Java+Vue构建的MES信息管理系统,含完整源码,功能涵盖生产跟踪、质量管控等,助力企业实现精细化、智能化生产管理
  • 【16-softmax回归】
  • AI 赋能的软件工程全生命周期应用
  • springboot+vue实现通过poi完成excel
  • Postman 平替 技术解析:架构优势与实战指南
  • 观察者模式(C++)
  • 【Leetcode hot 100】76.最小覆盖字串
  • 【HarmonyOS】Window11家庭中文版开启鸿蒙模拟器失败提示未开启Hyoer-V
  • SwiftUI 页面弹窗操作
  • 用飞算JavaAI一键生成电商平台项目:从需求到落地的高效实践
  • 使用免费API开发口播数字人
  • [机器学习]07-基于多层感知机的鸢尾花数据集分类
  • c++中的Lambda表达式详解
  • Java基础07——基本运算符(本文为个人学习笔记,内容整理自哔哩哔哩UP主【遇见狂神说】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • k8s+isulad 网络问题
  • 如何使用 AI 大语言模型解决生活中的实际小事情?
  • 【P81 10-7】OpenCV Python【实战项目】——车辆识别、车流统计(图像/视频加载、图像运算与处理、形态学、轮廓查找、车辆统计及显示)
  • 网络协议序列化工具Protobuf
  • 4.1vue3的setup()
  • 2019 GPT2原文 Language Models are Unsupervised Multitask Learners - Reading Notes
  • Kotlin Data Classes 快速上手
  • Qt TCP 客户端对象生命周期与连接断开问题解析
  • 解锁Prompt秘籍:框架、技巧与指标全解析
  • Windows 11操作系统 Git命令执行速度慢
  • SpringMVC基本原理和配置
  • 第2节 如何计算神经网络的参数:AI入门核心逻辑详解