图象去噪1-使用中值滤波与均值滤波

发布于:2024-06-28 ⋅ 阅读:(16) ⋅ 点赞:(0)

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