OpenCV笔记之八——图像平滑和模糊

本文介绍了图像处理中的平滑、模糊、锐化和滤波概念,重点讲解了均值模糊、高斯模糊、中值模糊和双边模糊四种平滑滤波方法。通过代码示例展示了每种滤波技术的应用,并分析了它们在图像去噪和边缘保持上的效果。均值滤波和高斯滤波会使得图像变得模糊,中值滤波能有效去除椒盐噪声,而双边滤波则能在保持边缘清晰的同时减少噪声。最后,文章探讨了相关与卷积的区别以及边缘填充的作用。
摘要由CSDN通过智能技术生成

八、图像平滑和模糊

1、平滑、模糊、锐化、滤波之间的关系/区别?

在这里插入图片描述

对图像滤波包括平滑锐利。对图像应用平滑滤波可以平滑图像,也可以达到降噪的效果,其实质是低通滤波;对图像应用锐利滤波能够突出增强图像边缘,但同时会引入噪声,其实质是高通滤波。本章主要讨论对图像进行平滑和模糊处理的方法。

2、图像平滑滤波

在对图像进行处理或应用计算机视觉函数(如阈值化、边缘检测)之前,对图像进行平滑或模糊处理,去除图像中的噪点十分有必要。

在进行图像滤波之前,首先需要定义一个滤波器,滤波器是一个k×k(k一定为奇数)大小的滑动窗口,从上到下、从左到右地由图像的左上角滑动到图像的右下角。滤波的实质就是根据尺寸为k×k的核(kernel)的中心像素点周围像素值的强度分布采用设定的方法对中心点像素值进行赋值。

关于平滑滤波,书中给出了四种方法:均值模糊高斯模糊中值模糊双边模糊

接下来通过结合代码和运行结果对这四种方法进行解释。

a.源代码呈现

【来自 Practical Python and OpenCV, 3rd Edition 的随书代码】
blurring.py

# Import the necessary packages
import numpy as np
import argparse
import cv2

# Construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True,
	help = "Path to the image")
args = vars(ap.parse_args())

# Load the image and show it
image = cv2.imread(args["image"])
cv2.imshow("Original", image)

# Let's apply standard "averaging" blurring first. Average blurring (as the name suggests),
# takes the average of all pixels in the surrounding area and replaces the centeral
# element of the output image with the average. Thus, in order to have a central element,
# the area surrounding the central must be odd. Here are a few examples with varying kernel sizes.
# Notice how the larger the kernel gets, the more blurred the image becomes
blurred = np.hstack([
	cv2.blur(image, (3, 3)),
	cv2.blur(image, (5, 5)),
	cv2.blur(image, (7, 7))])
cv2.imshow("Averaged", blurred)
cv2.waitKey(0)

# We can also apply Gaussian blurring, where the relevant parameters are the image we want to blur and
# the standard deviation in the X and Y direction. Again, as the standard deviation size increases,
# the image becomes progressively more blurred
blurred = np.hstack([
	cv2.GaussianBlur(image, (3, 3), 0),
	cv2.GaussianBlur(image, (5, 5), 0),
	cv2.GaussianBlur(image, (7, 7), 0)])
cv2.imshow("Gaussian", blurred)
cv2.waitKey(0)

# The cv2.medianBlur function is mainly used for removing what is called "salt-and-pepper" noise.
# Unlike the Average method mentioned above, the median method (as the name suggests),
# calculates the median pixel value amongst the surrounding area.
blurred = np.hstack([
	cv2.medianBlur(image, 3),
	cv2.medianBlur(image, 5),
	cv2.medianBlur(image, 7)])
cv2.imshow("Median", blurred)
cv2.waitKey(0)

# You may have noticed that blurring can help remove noise, but also makes edge less sharp.
# In order to keep edges sharp, we can use bilateral filtering. We need to specify the diameter
# of the neighborhood (as in examples above), along with sigma values for color and coordinate space.
# The larger these sigma values, the more pixels will be considered within the neighborhood.
blurred = np.hstack([
	cv2.bilateralFilter(image, 5, 21, 21),
	cv2.bilateralFilter(image, 7, 31, 31),
	cv2.bilateralFilter(image, 9, 41, 41)])
cv2.imshow("Bilateral", blurred)
cv2.waitKey(0)
b.代码分析

Line 1-14

导入需要的宏包,创建Argument Parser对象解析命令行参数,读入图像并显示。

【均值模糊】

均值模糊是一种线性平滑滤波(中心点像素值是邻域像素值的线性组合)方式,其原理是计算卷积核中所有像素的均值并将其赋值给中心像素点。其特点是卷积核中所有像素点的权重一致。

Line 21-26

借助cv2.blur( )函数,我们可以对图像进行均值滤波。函数中第一个参数指输入图像,第二个参数表示滤波器核的大小。我们依次定义三个从小到大的kernel为3×3、5×5和7×7,观察随着滤波器核增大图像发生的变化。

通过NumPy中提供的hstack( )函数,我们将应用三个不同尺寸的kernel进行滤波的图像并列显示。

【高斯滤波】

高斯滤波同样属于线性滤波,但高斯滤波对kernel内每个像素点进行加权后计算均值赋给中心点。其特点是邻域内不同像素获得的权重不同,靠近中心点的像素值将对其产生更大的影响。

Line 31-36

在opencv中,可以通过cv2.GaussianBlur( )函数对图像应用高斯滤波。函数中前两个参数与均值滤波无异,最后一个参数表示高斯核的标准差参数σ,若设置为0,则将根据高斯核大小自动计算合适值。高斯核的kernel通常需要比σ大。

同样将应用三个不同大小的kernel进行滤波的图像输出。

【中值滤波】

中值滤波属于非线性滤波,中值滤波对卷积核内所有像素值进行排序后选取中值赋给中心像素点。中值滤波是去除椒盐噪声最高效的滤波方式。


椒盐噪声:随机出现的黑白像素点。胡椒噪声:黑点(0);盐噪声:白点(255)。椒噪声和盐噪声可以同时叠加在图像上,也可以单独存在。椒盐噪声的存在会使图像边缘模糊。

在这里插入图片描述


Line 41-46

在opencv中,可以通过cv2.medianBlur( )函数对图像进行中值滤波。函数中第一个参数是输入图像,第二个参数则指示了滤波器核的边长k。同样取不同大小的核,输出滤波后的图像。

【双边滤波】

双边滤波是一种非线性滤波方式,从空间相邻性和像素值相似性两个维度综合考虑对图像进行滤波。双边滤波不仅能用于消除噪声,并且相较上述几种滤波方式能够很好地保持图像的边缘。缺点是执行速度比其他三种滤波方式慢得多。

Line 41-46

借助cv2.bilateralFilter( )函数,设置相关参数,对图像进行双边滤波。函数中第一个参数是输入图像;第二个参数同样指示滤波器核的边长k;第三个参数是范围参数 σ r \sigma_r σr,该标准差越大,则邻域中更多像素值能被纳入平滑计算中;最后一个参数则是空间参数 σ s \sigma_s σs,该标准差越大,则表示能影响到核中心像素值的像素范围越远(只要其像素值与中心像素相似,就能参与平滑计算)。

分别输入恐龙和海滩的图像,分别观察应用不同滤波方式后图像的变化。

c.运行结果

①均值滤波

在这里插入图片描述在这里插入图片描述
OriginalAveraging blurring
在这里插入图片描述在这里插入图片描述
OriginalAveraging blurring

②高斯滤波

在这里插入图片描述在这里插入图片描述
OriginalGaussian blurring
在这里插入图片描述在这里插入图片描述
OriginalGaussian blurring

③中值滤波

在这里插入图片描述在这里插入图片描述
OriginalMedian blurring
在这里插入图片描述在这里插入图片描述
OriginalMedian blurring

④双边滤波

在这里插入图片描述在这里插入图片描述
OriginalBilateral blurring
在这里插入图片描述在这里插入图片描述
OriginalBilateral blurring

从对比图可以看出,随着滤波器核的增大,均值滤波和高斯滤波后图像越显模糊,仿佛图像中的物体在高速移动。而中值滤波并不会产生运动模糊,不过同样出现边缘丢失的现象。而双边滤波则很好地保持了图像的边缘,使其仍具有较高的清晰度,同时滤去了图像中存在的一些噪点。

3、四种平滑滤波的特点总结

在这里插入图片描述

4、高斯滤波器与双边滤波器

高斯滤波器

两个像素之间相互影响的强度仅依赖于像素之间的空间距离而不依赖于像素强度,因此较亮的像素对相邻较暗的像素有很大的影响,虽然两个像素值可能相差较大,故而图像边缘不可避免地会被模糊(不连续像素强度加权平均)。

双边滤波器——保持边缘的滤波

两个像素之间相互影响的强度不仅依赖于其空间距离,同时需要考虑其像素值的相似度。

与高斯滤波器的差异:考虑了像素值的差异,以便在平滑时保持边缘

5、相关(correlation)与卷积(convolution)的区别

相关:滤波器(滑动窗口)滑过图像时分别与图像像素相乘后相加
卷积:先对滤波器进行180°翻转,然后对图像进行相关操作。
对于对称核来说,对图像进行相关或是卷积没有区别。

6、边缘填充(padding)

在对图像进行相关操作的时候,图像边缘的像素点并不能被遍历,此时需要对这些像素点进行边缘填充。边缘填充的方式主要有以下四种方式:①零填充 ②常数填充 ③重复填充 ④镜像填充,有兴趣的朋友可以另加了解,在此惜墨不赘。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值