目录
一、引言
二、均值滤波
三、方框滤波
四、总结
均值滤波(Mean Filter)和方框滤波(Box Filter)都是图像处理中常用的平滑滤波方法,它们的主要目的是减少图像中的噪声并平滑图像。
均值滤波是一种线性滤波方法,它的原理是将一个滤波器(通常是一个小的矩形窗口)在图像上滑动,计算窗口内像素的平均值,然后用这个平均值来替代窗口中心像素的值。这个操作可以用于去除噪声,平滑图像,以及模糊图像。
均值滤波的步骤:
在OpenCV中,你可以使用 cv2.blur函数来进行均值滤波例如:
dsr=cv2.blur(src,ksize,anchor,borderType)
● dst是返回值
● src是需要处理的图像
● kszie是滤波核(卷积核)的大小
● anchor是锚点,默认值是(-1,-1)一般无需更改
● borderType是边界样式,一般无需更改 一般情况下,使用dst=cv2.blur(src,ksize)即可。
下面是代码演示:
import cv2
import numpy as np #导入所需要的库
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
image = cv2.imread('xx.png') #读取图片
cv2.imshow('sro',image) #展示图片
cv2.waitKey(100000) #等待间隔
noise = add_peppersalt_noise(image) #调用函数
cv2.imshow('noise',noise)
cv2.waitKey(100000)
blur_1 = cv2.blur(noise,(3,3)) #卷积核为3,3
cv2.imshow('blur_1',blur_1)
cv2.waitKey(100000)
blur_2 = cv2.blur(noise,(5,5))#卷积核为5,5
cv2.imshow('blur_2',blur_2)
cv2.waitKey(100000)
cv2.destroyAllWindows()
运行结果如下:
方框滤波是一种均值滤波的特殊情况,也叫做盒子滤波。它的原理和均值滤波类似,但不同之处在于,方框滤波的滤波器中的每个像素都有相同的权重,即等权重。这意味着在计算平均值时,每个像素的贡献都是相等的。
在OpenCV中,你可以使用 cv2.boxFilter() 函数来进行方框滤波。例如:
dst=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)式中:
● dst是返回值,表示进行方框滤波后得到的处理结果。
● src 是需要处理的图像,即原始图像。
● ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。
● ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。
● anchor 是锚点。
● normalize 表示在滤波时是否进行归一化。
1.当值为True时,归一化,用邻域像素值的和除以面积。此时方框滤波与均值滤波效果相同。
2.当值为False时,不归一化,直接使用邻域像素值的和。和>255时使用255
下面是代码演示:
import cv2
import numpy as np
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
image = cv2.imread('xx.png')
noise = add_peppersalt_noise(image)
#进行归一化
boxFilter_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True)
cv2.imshow('boxFilter_1', boxFilter_1)
cv2.waitKey(100000)
#不进行归一化
boxFilter_2 = cv2.boxFilter(noise, -1, (3, 3), normalize=False)
cv2.imshow('boxFilter_2', boxFilter_2)
cv2.waitKey(100000)
cv2.destroyAllWindows()
运行结果如下:
均值滤波和方框滤波都是用于平滑图像和去除噪声的常见技术,你可以根据具体的需求选择合适的方法。