1、中值滤波
使用中值滤波去除图像的异常像素点,使用cv2.cv2.medianBlur(img, 3)表示再图像在中值滤波窗口3*3的范围内,从下到大排序,将当前值替换为排序中值(如下图所示)将56替换为(56,66,90,91,93,95,97,101)中的中值93。
Python代码如下:
将输入图像经过中值滤波后:
noise_img = './noiseimg.png'
image = cv2.imread(noise_img)
image = cv2.medianBlur(image, 5)
cv2.imwrite('./img.png', image)
原图与中值滤波后得到对比:
注意:中值滤波较大的核尺寸会考虑更大的邻域,虽然能更有效地去除噪声,但也会更加模糊图像细节和边缘。
2、均值滤波
均值滤波是指任意一点的像素值,都是周围 N×M 个像素值的均值。opencv中使用cv2.blur()
实现代码与效果如下:
def mean_denoise(noise_image='./noiseimg1.png', result_path='./mean_result1.png', kernel_size=(7,7)):
image = cv2.imread(noise_image)
image = cv2.blur(image, kernel_size)
cv2.imwrite(result_path, image)
原图与均值滤波效果对比:
注意:kernel_size越大,滤波范围越大,去噪效果强,但会导致图象边缘模糊。
3、双边滤波
参考:https://blog.csdn.net/qq_49478668/article/details/123488527
去噪的同时,考虑到了图像边缘信息。
def bilateral_filter_noise(noise_image='./noiseimg1.png', result_path='./bilateral_result1.png'):
image = cv2.imread(noise_image)
filtered_image = cv2.bilateralFilter(image, 9,200,200)
cv2.imwrite(result_path, filtered_image)
原图与双边滤波效果对比:
注意:
cv2.bilateralFilter(image, d=9,sigmaColor=200,sigmaSpace=200)● d是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。如果滤波空间较大(d>5),则速度较慢。因此,在实时应用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9。
● sigmaColor是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为0时,滤波失去意义;该值为255时,指定直径内的所有点都能够参与运算。
● sigmaSpace是坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来。当d>0时,无论sigmaSpace的值如何,d都指定邻域大小;否则,d与 sigmaSpace的值成比例。
原文链接:https://blog.csdn.net/qq_49478668/article/details/123488527