opencv入门10:平滑和模糊-SMOOTHING AND BLURRING

blurring:图像中的每个像素都与其周围的像素强度混合在一起。这个邻域像素的“混合”成为我们模糊的像素。

事实上,如果图像首先被平滑或模糊,许多图像处理和计算机视觉功能,如阈值和边缘检测,性能会更好。

一、平均-averaging

我们要探索的第一个模糊方法是平均,
为了平均模糊图像,我们使用cv2.blur(image,kernel)
image是我们希望模糊的图片,kernel 希望模糊的颗粒度值

平滑和模糊blurring.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np 
import argparse
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i","--image",required =True, help="Path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])
cv2.imshow("Original",image)

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)

二、高斯-gaussian

高斯模糊与平均模糊相似,但是不是使用简单的均值,而是使用加权平均值,其中靠近中心像素的邻近像素对平均值贡献更多的“权重”。
最终的结果是我们的图像比使用上一节中讨论的平均方法更不明显,但更自然地模糊了。

平滑和模糊blurring.py
1
2
3
4
5
6
7
8
9
blurred =  np.hstack([cv2.GaussianBlur(image,(3,3),0),cv2.GaussianBlur(image,(5,5),0),cv2.GaussianBlur(image,(7,7),0)])
# cv2.GaussianBlur(image,(3,3),0)
#需要指定高斯核的宽和高(必须是奇数)。以及高斯函数沿X,Y 方向的标准
#差。如果我们只指定了X 方向的的标准差,Y 方向也会取相同值
# 0 是指根据窗口大小(3,3)来计算高斯函数标准差
# 最后一个参数是在x轴方向上的标准偏差。通过设置这个值为0,我们正在指示OpenCV根据我们的内核大小自动计算它们
cv2.imshow("Gaussian",blurred)
cv2.waitKey(0)

三、中值模糊

传统上,中值模糊方法在去除椒盐噪声时效果最好,
这种噪音听起来就像是想象一样:想象一下把照片放在餐桌上,然后撒上盐和胡椒。使用中值模糊方法,您可以从图像中去除盐和胡椒粉。

当应用中值模糊时,我们首先定义我们的内核大小k。然后,如在平均模糊方法中,我们考虑大小为k * k的邻域中的所有像素。但是,与平均方法不同,不是用邻域的平均值替换中心像素,而是用邻域的中值代替中心像素。(When applying a median blur, we first define our kernel size k. Then, as in the averaging blurring method, we consider all pixels in the neighborhood of size k x k. But, unlike the averaging method, instead of replacing the central pixel with the average of the neighborhood, we instead replace the central pixel with the median of the neighborhood.)

平均和高斯方法可以计算邻域的平均值或加权平均值-这个平均像素强度可能存在或不存在于邻域中。但是根据定义,中值像素必须存在于我们的邻域中。通过用中位数而不是平均数来代替我们的中心像素,我们可以大大降低噪声(Averaging and Gaussian methods can compute means or weighted means for the neighborhood – this average pixel intensity may or may not be present in the neighborhood. But by definition, the median pixel must exist in our neighborhood. By replacing our central pixel with a median rather than an average, we can substantially reduce noise.)

使用 cv2.medianBlur(image,kernel) 方法进行中值模糊
内核大小k

平滑和模糊blurring.py
1
2
3
4
5
6
blurred =  np.hstack([cv2.medianBlur(image,3),cv2.medianBlur(image,5),cv2.medianBlur(image,7)])
# 前面的滤波器都是用计算得到的一个新值来取代中
# 心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他。
# 他能有效的去除噪声。卷积核的大小也应该是一个奇数。
cv2.imshow("Median",blurred)
cv2.waitKey(0)

四、双边滤波-bilateral

到目前为止,我们的模糊方法的目的是降低图像中的噪声和细节;但是,我们往往会失去图像的边缘。
函数cv2.bilateralFilter() 能在保持边界清晰的情况下有效的去除噪音。
但是这种操作与其他滤波器相比会比较慢。我们已经知道高斯滤波器是求中心点邻近区域像素的高斯加权平均值。这种高斯滤波器只考虑像素之间的空间关系,而不会考虑像素值之间的关系(像素的相似度)。所以这种方法不会考虑一个像素是否位于边界。因此边界也会别模糊掉,而这正不是我们想要。双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。


#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
#d – Diameter of each pixel neighborhood that is used during filtering.我们的像素邻域的直径
# If it is non-positive, it is computed from sigmaSpace
#5 邻域直径,两个21 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差

# 第三个参数是我们的颜色标准差。颜色标准差值越大意味着在计算模糊时将考虑邻域中更多的颜色。
# 最后,我们需要提供空间标准差。空间标准差值越大意味着离中心像素越远的像素也会影响模糊计算,只要它们的颜色足够相似即可。
平滑和模糊blurring.py
1
2
3
4
5
6
7
8
9
10
blurred =  np.hstack([cv2.bilateralFilter(image,5,21,21),cv2.bilateralFilter(image,7,31,31),cv2.bilateralFilter(image,9,41,41)])
#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
#d – Diameter of each pixel neighborhood that is used during filtering.
# If it is non-positive, it is computed from sigmaSpace
#5 邻域直径,两个21 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差

# 第三个参数是我们的颜色标准差。颜色标准差值越大意味着在计算模糊时将考虑邻域中更多的颜色。
# 最后,我们需要提供空间标准差。空间标准差值越大意味着离中心像素越远的像素也会影响模糊计算,只要它们的颜色足够相似即可。
cv2.imshow("Median",blurred)
cv2.waitKey(0)
在机会的世界里,没有太多机会可以争取;如果你真想成功,要设法抢夺别人的机会。
坚持原创技术分享,您的支持将鼓励我继续创作!