图像模糊是数字图像处理过程中经常用到的,主要包括以下几个方面:
导入库
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
图片显示函数
def show(img):
if img.ndim == 2:
plt.imshow(img,cmap='gray')
else:
plt.imshow(cv.cvtColor(img,cv.COLOR_RGB2BGR))
plt.show()
#卷积
K = np.ones((3,3))/9.0
img2 = cv.filter2D(img,-1,kernel=K)
show(np.hstack([img,img2]))
经过卷积之后的结果(貌似卷积之后的结果比卷积之前“柔滑”了一些):
#均值模糊两个函数
img2 = cv.blur(img,(3,3))
show(np.hstack([img,img2]))
img2 = cv.boxFilter(img,-1,(3,3))
show(np.hstack([img,img2]))
#中值滤波
img4 = cv.medianBlur(img,3)#3代表滤波模板的大小,必须是大于1的奇数,例如3,5,7等
show(np.hstack([img,img4]))
高斯模糊之所以叫高斯模糊,是因为它运用了高斯的正态分布的密度函数。在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。
计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。把它运用于图像算法中,就会使图像出现模糊的效果。
#高斯滤波
sigma = 1
img2 = cv.GaussianBlur(img,(5,5),sigmaX=sigma)
show(np.hstack([img,img2]))
双边滤波的目的:保留边缘等高频信息,平滑颜色(灰度)相近的地方。
不断计算卷积核,使得颜色差异越大、加权值越小;距离越远,加权值越小。
#双边滤波
img3 = cv.bilateralFilter(img,-1,sigmaColor=50,sigmaSpace=3)
show(np.hstack([img,img3]))