常见的图像平滑处理算法的比较(均值滤波、高斯滤波、双边滤波),并解析语法格式

  • Post author:
  • Post category:其他


  • 粗略的概念:图像平滑处理==图像模糊处理==图像滤波==图像质量增强;称呼是次要的,主要的是:使用算法处理问题;


  • 均值滤波只考虑空间信息,并且权重全为1;



  • 高斯滤波虽然只考虑空间信息,但是权重比例有所改变;



  • 双边滤波既考虑空间信息,又考虑色彩信息(权重比例根据色彩信息确定)。


目录


(1)均值滤波


(2)高斯滤波


(3)双边滤波


(4)代码实现


(5)语法格式解析(以高斯滤波为例)


(1)均值滤波

概念:均值滤波是指



当前像素点周围 N*N 个像素值的均值

来代替当前像素值

。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。

如下图所示:在进行均值滤波时,首先要考虑需要对周围多少个像素点取平均值。通常情况下,我们会

以当前像素点为中心

,对行数和列数相等的一块区域内的所有像素点的

像素值求平均

。针对图像中第 5 行第 5 列的像素点,其运算过程相当于与一个内部值都是 1/25 的 5×5 矩阵

进行相乘计算

,从而得到均值滤波的结果

126。

(2)高斯滤波

概念:在进行均值滤波时,其

邻域内每个像素的权重是相等的

。在高斯滤波中,会将

中心点的权重值加大,远离中心点的权重值减小

,在此基础上计算邻域内各个像素值不同权重的和。

如下图所示:针对最左侧的图像内第 4 行第 3 列位置上像素值为 226 的像素点进行高斯卷积,其运算规则为

将该点邻域内的像素点按照

不同的权重

计算和

不同大小的卷积核,如下图所示:


前述滤波方式基本都只考虑了空间的权重信息,这种情况计算起来比较方便,但是在边缘信息的处理上存在较大的问题。


(3)双边滤波

概念:双边滤波是

综合考虑空间信息和色彩信息

的滤波方式,在滤波过程中能够

有效地保护图像 内的边缘信息



(a)是原始图像。 (b)是高斯滤波处理结果。(c)是双边滤波处理结果。

如下图所示:


(a)是原始图像

,左侧区域是白色(像素值为 255),右侧区域是黑色(像素值为 0)。


(b)是进行均值滤波的可能结果

。在进行均值滤波时,仅仅考虑空间信息,此时左右 两侧的像素的处理结果是综合考虑周边元素像素值,并对它们取均值得到的。

(

c)是进行双边滤波的可能结果

。在进行双边滤波时,不仅考虑空间信息,还考虑色彩差别信息。



注意:



色彩差异较大,颜色距离很远



权重占比越小

(颜色距离不是像素点之间的物理距离, 而是颜色值的距离。像素点的值分别是 0 和 255,差别很大,所以说它们颜色距离很远)。

(4)代码实现

import cv2

src = cv2.imread(r"G:\CSDN\python\lena.jpg")

src_blur = cv2.blur(src, (5, 5))                 # 均值滤波
src_GB = cv2.GaussianBlur(src, (5, 5), 0, 0)     # 高斯滤波
src_BF = cv2.bilateralFilter(src, 25, 100, 100)  # 双边滤波

cv2.imshow("src", src)
cv2.imshow("blur", src_blur)
cv2.imshow("GB", src_GB)
cv2.imshow("BF", src_BF)

cv2.waitKey(0)
cv2.destroyAllWindows()

>>>运行结果

(5)语法格式解析(以高斯滤波为例)

# 在 OpenCV 中,实现高斯滤波的函数是 cv2.GaussianBlur(),该函数的语法格式是:
# dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )

# 式中:
# dst 是返回值,表示进行高斯滤波后得到的处理结果。
# src 是需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度应该是 CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F 中的一种。
# ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,滤波核的值必须是奇数。
# borderType 是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。

# 官方文档建议显式地指定 ksize、sigmaX 和 sigmaY 三个参数的值,以避免将来函数修改后可能造成的语法错误。
# 当然,在实际处理中,可以显式指定 sigmaX 和 sigmaY 为默认值 0。

# 因此,函数 cv2.GaussianBlur()的常用形式为:
# dst = cv2.GaussianBlur( src, ksize, 0, 0 )

>>>如有疑问,欢迎评论区一起探讨



版权声明:本文为qq_54185421原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。