python学opencv|读取图像(五十七)使用cv2.bilateralFilter()函数实现图像像素双边滤波处理

server/2025/2/7 13:13:11/

【1】引言

前序学习过程中,已经掌握了对图像的基本滤波操作技巧,具体的图像滤波方式包括均值滤波、中值滤波和高斯滤波,相关文章链接有:

pythonopencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理-CSDN博客

pythonopencv|读取图像(五十五)使用cv2.medianBlur()函数实现图像像素中值滤波处理-CSDN博客

pythonopencv|读取图像(五十六)使用cv2.GaussianBlur()函数实现图像像素高斯滤波处理-CSDN博客

进过前序文章的实践探索,随着像素核的增大,实际的滤波效果都出现了图像模糊的情形,因此,有必要继续探索新的滤波方式。

这就是本次文章的学习目的:掌握双边滤波函数cv.bilateralFilter()。

双边滤波函数cv.bilateralFilter()的工作原理为:在图像的中心区域,采用类似高斯滤波的方式处理,在图像的边缘区域,加大边缘区域像素点的权重,以保证图像的清晰度。

【2】官网教程

点击下方链接,直达双边滤波函数cv.bilateralFilter()的官网教程:

OpenCV: Image Filtering

官网页面对双边滤波函数cv.bilateralFilter()的说明为:

图1   官网页面对双边滤波函数cv.bilateralFilter()的说明

官网页面对双边滤波函数cv.bilateralFilter()的参数说明为:

void cv::bilateralFilter     (    

        InputArray     src,                       #输入图像
        OutputArray     dst,                    #输出图像
        int     d,                                      #像素核直径
        double     sigmaColor,               #像素点颜色值和周围颜色值差值小于此值时进行滤波
        double     sigmaSpace,             #像素坐标开关,值越大,参与计算的像素点越多
        int     borderType = BORDER_DEFAULT )  #边界样式,可选参数

【3】代码测试

首先是引入模块和相关图像:

python">import cv2 as cv  # 引入CV模块# 读取图片
srcm = cv.imread('srcx.png')  # 读取图像srcx.png

然后是对图像进行双边滤波处理:

python">#滤波计算
src1 = cv.bilateralFilter(srcm,3,180,200)  # 图像取平均值,像素核大小为(3,3)
src2 = cv.bilateralFilter(srcm,5,180,200)  # 图像取平均值,像素核大小为(5,5)
src3 = cv.bilateralFilter(srcm,7,180,200)  # 图像取平均值,像素核大小为(7,7)

之后显示图像:

python"># 显示结果
cv.imshow('srcm ', srcm)
cv.imshow('src1 ', src1)
cv.imshow('src2 ', src2)
cv.imshow('src3 ', src3)
cv.imwrite('src1b.png',src1)
cv.imwrite('src2b.png',src2)
cv.imwrite('src3b.png',src3)
# 窗口控制
cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

程序运行使用的相关图像为:

图2  初始图像scrx.png

图3  双边滤波图像scr1.png

图3  双边滤波图像scr2.png

图3  双边滤波图像scr3.png

由图2至图5可见,双边滤波函数cv.bilateralFilter()处理后的图像,随着像素核的增大,虽然也出现了模糊的效果,但模糊的程度较小,较大程度保证了图像的清晰度。

【4】细节说明

调用cv2.bilateralFilter()滤波函数进行双边滤波时,给出的是像素核直径。

而其他三种滤波方式不一样:

调用cv2.medianBlur()函数进行中值滤波时,使用的像素核只需要写出边长n,但这个边长也应该是奇数,cv2.medianBlur()函数会自动根据这个边长划定一个正方形的像素核。

调用cv2.blur()函数进行均值滤波和调用cv2.GaussianBlur()函数进行高斯滤波处理时,均需要给出(nXn)大小的像素核,这个n应使用奇数。

像素核使用奇数大小会比较好,是因为奇数大小会在最中间围成一个方格,这个方格就是核心方格,滤波计算的值直接赋给这个核心方格。

图6 图像滤波技术对比

【5】总结

掌握了使用python+opencv实现调用cv2.bilateralFilter()函数进行双边滤波处理图像的技巧。


http://www.ppmy.cn/server/165685.html

相关文章

[c语言日寄]浮点数在内存中的储存

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

android 适配 api 35(android 15) 遇到的问题

首先升级 targetSdkVersion 和 compileSdkVersion 到 35,升级后发生的报错 一、 解决方案: 升级gradle 和gradle 插件版本 com.android.tools.build:gradle -> 8.3.0-alpha02 gradle-wrapper.properties : distributionUrl -> gradle-8.6-bin.zip https…

【LeetCode】5. 贪心算法:买卖股票时机

太久没更了,抽空学习下。 看一道简单题。 class Solution:def maxProfit(self, prices: List[int]) -> int:cost -1profit 0for i in prices:if cost -1:cost icontinueprofit_ i - costif profit_ > profit:profit profit_if cost > i:cost iret…

C#面试常考随笔12:游戏开发中常用的设计模式【C#面试题(中级篇)补充】

C#面试题(中级篇),详细讲解,帮助你深刻理解,拒绝背话术!-CSDN博客 简单工厂模式 优点: 根据条件有工厂类直接创建具体的产品 客户端无需知道具体的对象名字,可以通过配置文件创建…

基于Typescript,使用Vite构建融合Vue.js的Babylon.js开发环境

一、创建Vite项目 使用Vite初始化一个VueTypeScript项目: npm create vitelatest my-babylon-app -- --template vue-ts cd my-babylon-app npm create vitelatest my-babylon-app -- --template vue-ts 命令用于快速创建一个基于 Vite 的 Vue TypeScript 项目。…

Python分享10个Excel自动化脚本

在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式。通过Python,我们可以实现对Excel文件的各种自动化操作,提高工作效率。 本文将再次分享10个实用的Excel自动化脚本,以帮助新手小白更轻松地掌握这些技能。 1. Exc…

vue3新建组件库项目并上传到私库

创建vue3项目,步骤省略 # nexus配置 访问 http://192.168.0.9:8081/ 账号密码 admin Yanfabu01! 参考网址 https://www.jb51.net/javascript/3178205jj.htm # 项目满足的条件 [tsconfig.json]中 添加"baseUrl": "." [package.json]中 添加 &…

C++实现状态模式

首先上代码&#xff1a; #include <iostream> #include <memory>class Context;class State { public:virtual void Handle(Context * context) 0; //纯虚函数virtual ~State() default; //虚析构函数 };//创建状态A class ConcreateStateA : public State{…