图像滤波常用于平滑图像、去除噪音和边缘检测等任务。基于局部图像。
基本原理:像素p的输出值由输入图像中像素p及其周围邻域N中的像素值确定。
计算方法:将邻域N的像素值和一个与邻域同样尺寸的子图像(模板、核、滤波器)进行模板运算。
模板:可看作一幅尺寸为n x n 的小图像W,n一般取奇数,称为模板尺寸,每个位置上的值w被称为权重。在进行计算时,将模板的中心和像素p对齐,选取原始图像中和模板相同范围的邻域N的像素值作为输入。常用的模板运算:模板卷积和模板排序。
模板卷积:用模板与需处理图像空间进行卷积的运算过程。padding
模板排序:用模板来提取待处理图像中与模板同尺寸的图像子集,将邻域N的像素值进行排序,选择特定次序的灰度值作为像素p位置的输出值。最大值、最小值、中位数。
分类:
线性滤波器:盒式滤波器、均值滤波器、高斯滤波器
非线性滤波器:中值滤波器
1、盒式滤波器(方框滤波)
将像素p邻域的平均值作为输出结果。
盒式滤波器与均值滤波器的区别:盒式滤波器中的每个像素的权重相同,计算均值时,每个像素的贡献相等。
normalize表示在滤波时是否进行归一化:
①当normalize为True时,用邻域像素值的和除以面积,与均值滤波效果一样。
②当normalize为False时,不进行归一化,直接使用领域像素值的和。大于255时取255。
normalize 表示在滤波时是否进行归一化。 1.当值为True时,归一化,用邻域像素值的和除以面积。此时方框滤波与均值滤波效果相同。 2.当值为False时,不归一化,直接使用邻域像素值的和。和>255时使用255
def add_peppersalt_noise(image, n=10000):
result = image.copy()
w, h = image.shape[:2] # 测量图片的长和宽
for i in range(n): # 生成n个椒盐噪声
x = np.random.randint(1, w)
y = np.random.randint(1, h)
if np.random.randint(0, 2) == 0:
result[x, y] = 0
else:
result[x, y] = 255
return result
img = cv2.imread("Cat.jpg")
noise = add_peppersalt_noise(img)
boxFilter_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True)
boxFilter_2 = cv2.boxFilter(noise, -1, (5, 5), normalize=False)
plt.figure()
plt.subplot(221), plt.imshow(img, "gray"), plt.title("original")
plt.subplot(222), plt.imshow(noise, None), plt.title("salt")
plt.subplot(223), plt.imshow(boxFilter_1, None), plt.title("boxFilter_1")
plt.subplot(224), plt.imshow(boxFilter_2, None), plt.title("boxFilter_2")
plt.show()
2、均值滤波
模板的权重都为1的滤波器,将像素的邻域平均值作为输出结果。常用于图像平滑,去除噪声,图像模糊(随模板尺寸的增加,图像变得模糊)
def add_peppersalt_noise(image, n=10000): # 定义一个函数 利用这个函数生成噪声图
result = image.copy()
w, h = image.shape[:2] # 测量图片的长和宽
for i in range(n): # 生成n个椒盐噪声
x = np.random.randint(1, w)
y = np.random.randint(1, h)
if np.random.randint(0, 2) == 0:
result[x, y] = 0
else:
result[x, y] = 255
return result
img = cv2.imread("Cat.jpg")
noise = add_peppersalt_noise(img)
blur_1 = cv2.blur(noise, (3, 3))
blur_2 = cv2.blur(noise, (5, 5))
plt.figure()
plt.subplot(221), plt.imshow(img, "gray"), plt.title("original")
plt.subplot(222), plt.imshow(noise, None), plt.title("salt")
plt.subplot(223), plt.imshow(blur_1, None), plt.title("3x3")
plt.subplot(224), plt.imshow(blur_2, None), plt.title("5x5")
plt.show()
3、高斯滤波
模板根据高斯分布来确定模板系数,接近中心的权重比边缘大,可以减少由模板尺寸增加所造成的图像模糊。
gaussian_blur = cv2.GaussianBlur(img, (5, 5), 1) # 高斯滤波
4、中值滤波
将邻域内排序后的中位数值作为输出以代替原像素值(模板排序)。可用于降噪,能保持原图像锐度,对椒盐噪声抑制效果好。属于非线性滤波,可能会破坏像素点的线性关系,不适用于点、线等细节较多的图像或高精度图像。
median = cv2.medianBlur(img, 5) # 中值滤波