从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

摘要:常用于消除噪声的图像平滑方法包括三种线性滤波(均值滤波、方框滤波、高斯滤波)和两种非线性滤波(中值滤波、双边滤波),本文将详细讲解两种非线性滤波方法。

本文分享自华为云社区《[Python从零到壹] 五十六.图像增强及运算篇之图像平滑(中值滤波、双边滤波)》,作者:eastmount。

常用于消除噪声的图像平滑方法包括三种线性滤波(均值滤波、方框滤波、高斯滤波)和两种非线性滤波(中值滤波、双边滤波),本文将详细讲解两种非线性滤波方法。

一.中值滤波

前面讲述的都是线性平滑滤波,它们的中间像素值都是由邻域像素值线性加权得到的,接下来将讲解一种非线性平滑滤波——中值滤波。中值滤波通过计算每一个像素点某邻域范围内所有像素点灰度值的中值,来替换该像素点的灰度值,从而让周围的像素值更接近真实情况,消除孤立的噪声。

中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护图像的边缘和细节,使之不被模糊处理,这些优良特性是线性滤波方法所不具有的,从而使其常常被应用于消除图像中的椒盐噪声[1-2]。

中值滤波算法的计算过程如图1所示。选择含有五个点的窗口,依次扫描该窗口中的像素,每个像素点所对应的灰度值按照升序或降序排列,然后获取最中间的值来替换该点的灰度值。

从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

上图展示的是矩形窗口,常用的窗口还包括正方形、十字形、环形和圆形等,不同形状的窗口会带来不同的过滤效果,其中正方形和圆形窗口适合于外轮廓边缘较长的图像,十字形窗口适合于带尖角形状的图像。

OpenCV将中值滤波封装在medianBlur()函数中,其函数原型如下所示:

  • dst = medianBlur(src, ksize[, dst])
    – src表示待处理的输入图像
    – dst表示输出图像,其大小和类型与输入图像相同
    – ksize表示内核大小,其值必须是大于1的奇数,如3、5、7等

下面是调用medianBlur()函数实现中值滤波的代码。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取图片
img = cv2.imread('lena-zs.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#中值滤波
result = cv2.medianBlur(source, 3)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图形
titles = ['原始图像', '中值滤波']
images = [source, result]
for i in range(2):
 plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')
 plt.title(titles[i])
 plt.xticks([]),plt.yticks([])
plt.show()

其运行结果如图2所示,它有效地过滤掉了“lena”图中的噪声,并且很好地保护了图像的边缘信息,使之不被模糊处理。

从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

二.双边滤波

双边滤波(Bilateral filter)是由Tomasi和Manduchi在1998年发明的一种各向异性滤波,它一种非线性的图像平滑方法,结合了图像的空间邻近度和像素值相似度(即空间域和值域)的一种折中处理,从而达到保边去噪的目的。双边滤波的优势是能够做到边缘的保护,其他的均值滤波、方框滤波和高斯滤波在去除噪声的同时,都会有较明显的边缘模糊,对于图像高频细节的保护效果并不好[3]。

双边滤波比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数。所以在图像边缘附近,离的较远的像素点不会过于影响到图像边缘上的像素点,从而保证了图像边缘附近的像素值得以保存。但是双边滤波也存在一定的缺陷,由于它保存了过多的高频信息,双边滤波不能有效地过滤掉彩色图像中的高频噪声,只能够对低频信息进行较好地去噪[4]。

在双边滤波器中,输出的像素值依赖于邻域像素值的加权值组合,对输入图像进行局部加权平均得到输出图像 的像素值,其公式如下所示:

从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

式中表示中心点(x,y)的(2N+1)×(2N+1)的领域像素,值依赖于领域像素值的加权平均。权重系数取决于空间域核(domain)和值域核(range)的乘积。空间域核的定义如公式(2)所示。

从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

值域核的定义如公式(3)所示。

从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

两者相乘之后,就会产生依赖于数据的双边滤波权重函数,如下所示:

从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

从式子(4)可以看出,双边滤波器的加权系数是空间邻近度因子和像素亮度相似因子的非线性组合。前者随着像素点与中心点之间欧几里德距离的增加而减小,后者随着像素亮度之差的增大而减小[5-6]。

在图像变化平缓的区域,邻域内亮度值相差不大,双边滤波器转化为高斯低通滤波器;在图像变化剧烈的区域,邻域内像素亮度值相差较大,滤波器利用边缘点附近亮度值相近的像素点的亮度平均值替代原亮度值。因此,双边滤波器既平滑了图像,又保持了图像边缘,其原理图如图3所示。

从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

OpenCV将中值滤波封装在bilateralFilter()函数中,其函数原型如下所示:

  • dst = bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
    – src表示待处理的输入图像
    – dst表示输出图像,其大小和类型与输入图像相同
    – d表示在过滤期间使用的每个像素邻域的直径。如果这个值我们设其为非正数,则它会由sigmaSpace计算得出
    – sigmaColor表示颜色空间的标准方差。该值越大,表明像素邻域内较远的颜色会混合在一起,从而产生更大面积的半相等颜色区域
    – sigmaSpace表示坐标空间的标准方差。该值越大,表明像素的颜色足够接近,从而使得越远的像素会相互影响,更大的区域中相似的颜色获取相同的颜色,当d>0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace
    – borderType表示边框模式,用于推断图像外部像素的某种边界模式,默认值为BORDER_DEFAULT,可省略

下面是调用bilateralFilter()函数实现双边滤波的代码,其中d为15,sigmaColor设置为150,sigmaSpace设置为150。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取图片
img = cv2.imread('lena-zs.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#双边滤波
result = cv2.bilateralFilter(source, 15, 150, 150)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图形
titles = ['原始图像', '双边滤波'] 
images = [source, result]
for i in range(2):
 plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')
 plt.title(titles[i])
 plt.xticks([]),plt.yticks([])
plt.show()

其运行结果如图4所示:

从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

三.总结

本文主要讲解了常用于消除噪声的图像平滑方法,常见方法包括三种线性滤波(均值滤波、方框滤波、高斯滤波)和两种非线性滤波(中值滤波、双边滤波)。这篇文章介绍了中值滤波和双边滤波,通过原理和代码进行对比,分别讲述了各种滤波方法的优缺点,有效地消除了图像的噪声,并保留图像的边缘轮廓。

 

点击关注,第一时间了解华为云新鲜技术~

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波 - Python技术站

(0)
上一篇 2023年4月2日 下午4:14
下一篇 2023年4月2日

相关文章

  • 工业互联网:加速从“中国制造”迈向“中国智造”

    摘要:在推进制造业智能化的过程中,除设备本身数字化外,基于工业互联网实现设备互联和全流程智能化已成为最重要方向之一。 本文分享自华为云社区《【华为云Stack】【大架光临】第18期:工业互联网:加速从“中国制造”迈向“中国智造”》,作者:华为云Stack 制造行业总经理 崔新。 随着全球数字化浪潮的到来,中国制造业也在快速转型。国家“十一五”和“十二五”提出…

    云计算 2023年5月4日
    00
  • 云图说|图解开天企业工作台MSSE

    摘要:开天企业工作台是面向企业用户的一站式数字工作台。 本文分享自华为云社区《【开天aPaaS】图解开天企业工作台MSSE》,作者:开天aPaaS小助手。 开天企业工作台(MacroVerse SmartStage for Enterprises,MSSE)是面向企业用户的一站式数字工作台,为企业提供用户、组织、应用、授权等统一管理能力和灵活的门户编排能力,…

    云计算 2023年4月17日
    00
  • 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效

    摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现。 本文分享自华为云社区《[Python图像处理] 二十四.图像特效处理之毛玻璃、浮雕和油漆特效》,作者:eastmount。 一.图像毛玻璃特效 图像毛玻璃特效如图所示,左边为原始图像,右边为毛玻璃特效图像。它是用图像邻域内随机一个像素点的颜色来替代…

    2023年4月2日
    00
  • 跟我学Python图像处理丨何为图像的灰度非线性变换

    摘要:本文主要讲解灰度线性变换,基础性知识希望对您有所帮助。 本文分享自华为云社区《[Python图像处理] 十六.图像的灰度非线性变换之对数变换、伽马变换》,作者:eastmount 。 本篇文章主要讲解非线性变换,使用自定义方法对图像进行灰度化处理,包括对数变换和伽马变换。 一.图像灰度非线性变换 图像的灰度非线性变换主要包括对数变换、幂次变换、指数变换…

    2023年4月2日
    00
  • 详解目标检测模型的评价指标及代码实现

    摘要:为了评价模型的泛化能力,即判断模型的好坏,我们需要用某个指标来衡量,有了评价指标,就可以对比不同模型的优劣,并通过这个指标来进一步调参优化模型。 本文分享自华为云社区《目标检测模型的评价指标详解及代码实现》,作者:嵌入式视觉。 前言 为了了解模型的泛化能力,即判断模型的好坏,我们需要用某个指标来衡量,有了评价指标,就可以对比不同模型的优劣,并通过这个指…

    云计算 2023年4月17日
    00
  • 云图说|云数据库GaussDB如何做到卓越性能

    摘要:对于数据库来说,性能一直被视为最关键的部分。GaussDB作为华为自主创新研发的分布式关系型数据库,那么华为云数据库GaussDB在提升数据库性能方面都有哪些黑科技呢? 本文分享自华为云社区《【云图说】第275期 云数据库GaussDB如何做到卓越性能》,作者:阅识风云。 对于数据库来说,性能一直被视为最关键的部分。GaussDB作为华为自主创新研发的…

    MySQL 2023年4月17日
    00
  • Python代码用在这些地方,其实1行就够了!

    摘要:都说 Python 简单快捷,那本篇博客就为大家带来一些实用的 Python 技巧,而且仅需要 1 行代码,就可以解决一些小问题。 本文分享自华为云社区《你猜 1 行Python代码能干什么呢?神奇的单行 Python 代码》,作者:梦想橡皮擦。 1 行代码的由来 都说 Python 简单快捷,那本篇博客就为大家带来一些实用的 Python 技巧,而且…

    Python开发 2023年4月2日
    00
  • Serverless冷启动:如何让函数计算更快更强?

    摘要:借助Serverless计算,开发者仅需上传业务代码并进行简单的资源配置便可实现服务的快速构建部署,云服务商则按照函数服务调用量和实际资源使用收费,从而帮助用户实现业务的快速交付和低成本运行。 本文分享自华为云社区《Serverless冷启动:如何让函数计算更快更强?》,作者:DevAI 。 问题背景 Serverless计算也称服务器无感知计算或函数…

    云计算 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部