smoothing and blurring平滑和模糊
什么是模糊呢,当我们拍照片没对上焦的时候,就是模糊。
实际上,这意味着图片中的每个像素点都和他旁边的像素点的值混在了一起,这种和相邻像素点进行混合的结果,就是模糊。
模糊通常是我们不希望的,但这在我们进行阈值处理,或者边缘检测的时候显得非常重要,通常第一步就是对图片进行平滑或者模糊。
1 averaging均值滤波
blurred = np.hstack([
# 第二个值表示k*k的一个核,通常k要求为奇数
# 这个k*k的滑动窗口就表示一个卷积核
cv2.blur(image, (3,3)),
cv2.blur(image, (5,5)),
cv2.blur(image, (7,7))])
cv2.imshow("averaged", blurred)
2 gaussian高斯滤波
均值滤波使用的是一个平均值,而高斯滤波使用的是加权平均值,离中心元素越近的地方权重越大,离中心元素越远的地方权重越小。得到的结果比均值滤波更自然。
blurred = np.hstack([
# 第二个值表示k*k的一个核,通常k要求为奇数
# 第3个数值表示x-axis的偏差
cv2.GaussianBlur(image, (3,3), 0),
cv2.GaussianBlur(image, (5,5), 0),
cv2.GaussianBlur(image, (7,7), 0)])
cv2.imshow("Gaussian", blurred)
3 median中值滤波
本质上是中位数滤波,中值滤波在去除椒盐(想象照片上撒满了胡椒粉和盐颗粒)噪声的时候非常有效,因为他总是用图像中已有的像素值来更新当前像素。
blurred = np.hstack([
# 第二个值表示k*k的一个核,通常k要求为奇数
cv2.mediaBlur(image, 3),
cv2.mediaBlur(image, 5),
cv2.mediaBlur(image, 7)])
cv2.imshow("median", blurred)
4 bilateral双边滤波
上面几个模糊方法有个问题,就是会丢失图像中的边缘。
为了解决这个问题,我们使用两个高斯分布,这就是双边滤波。
第一个高斯函数只考虑空间邻域,第二个高斯函数对邻域像素值进行建模,确保只有相似像素值的像素参与模糊计算,即那些与众不同的像素(他们其实是图像边缘和边界)被保留下来。
blurred = np.hstack([
# 第2个值,5代表像素邻域空间的直径,
# 第3个值,21表示颜色邻域,越大就会有更多的颜色参与计算
# 第4个值,21代表空间邻域,越大,那么更远的像素就会参与计算
cv2.bilateralFilter(image, 5, 21, 21),
cv2.bilateralFilter(image, 7, 31, 31),
cv2.bilateralFilter(image, 9, 41, 41)])
cv2.imshow("Bilateral", blurred)