OpenCV计算机视觉 03 椒盐噪声的添加与常见的平滑处理方式(均值、方框、高斯、中值)

发布于:2025-02-11 ⋅ 阅读:(53) ⋅ 点赞:(0)

上一篇文章:OpenCV计算机视觉 02 图片修改 图像运算 边缘填充 阈值处理

目录

添加椒盐噪声

图像平滑常见处理方式

均值滤波 (blur)

方框滤波 (boxFilter)

高斯滤波 (GaussianBlur)

中值滤波 (medianBlur)


添加椒盐噪声

def add_peppersalt_noise(image, n=10000):
    result = image.copy()
    h, w = image.shape[:2]    # 获取图片的高和宽
    for i in range(n):    # 生成n个椒盐噪声
        x = np.random.randint(1, h)
        y=  np.random.randint(1, w)
        if np.random.randint(0, 2) == 0:
            result[x, y] = 0
        else:
            result[x,y] = 255
    return result
​
image = cv2.imread('tu.png')
cv2.imshow('original',image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imwrite(r'noise.png',noise)#保存一下,等会我们做平滑操作
cv2.imshow('noise',noise)
cv2.waitKey(0)

图像平滑常见处理方式

图像平滑(smoothing)也称为“模糊处理”(bluring), 是一项简单且使用频率很高的图像处理方法。图像平滑处理可以用来压制、弱化或消除图像中的细节、突变、边缘和噪声。但最常见的是用来减少图像上的噪声或者失真。降低图像分辨率时,平滑处理是很重要的。下面是常用的一些滤波器

  • 均值滤波(邻域平均滤波)–> blur函数

  • 方框滤波–> boxFilter函数

  • 高斯滤波–>GaussianBlur函数

  • 中值滤波–>medianBlur函数

均值滤波 (blur)

是指用当前像素点周围 n*n 个像素值的均值来代替当前像素值。边界点的处理可以扩展当前图像的周围像素点padding.

特别注意,核数尽量选奇数不选偶数,原因是当核大小为奇数时,能够明确地定义一个中心像素。这样在计算平均值时,更容易确定以哪个像素为中心进行周边像素值的平均计算。当边界像素周围的像素数量不足 n×n 个,为了能够对边界像素也进行均值滤波计算,就通过在图像的四周添加额外的像素(即 padding)来补足所需的像素数量。这些添加的像素值可以是 0、图像边缘像素的重复值或者通过其他特定的算法计算得到的值,从而使得边界像素也能像内部像素一样进行完整的 n×n 区域的均值计算。

     

'''
dst=cv2.blur(src,ksize,anchor,borderType)
    dst是返回值
    src是需要处理的图像
    kszie是滤波核(卷积核)的大小
    anchor是锚点,默认值是(-1,-1)一般无需更改
    borderType是边界样式,一般无需更改
    一般情况下,使用dst=cv2.blur(src,ksize)即可
'''
blur_1 = cv2.blur(noise,(3,3))  #卷积核为3,3   效果一般,清晰度一般
cv2.imshow('blur_1',blur_1)
cv2.waitKey(0)
​
blur_2 = cv2.blur(noise,(5,5))#卷积核为5,5    效果好但模糊
cv2.imshow('blur_2',blur_2)
cv2.waitKey(0)
cv2.destroyAllWindows()

优点:

  • 算法简单,计算效率高。
  • 能有效地平滑均匀分布的噪声。

缺点:

  • 会使图像变得比较模糊,因为它对所有像素一视同仁,丢失了图像的细节和边缘信息。
方框滤波 (boxFilter)

方框滤波是指用当前像素点周围nxn个像素值的和来代替当前像素值。

'''
dst=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)式中:
   ● dst是返回值,表示进行方框滤波后得到的处理结果。
   ● src 是需要处理的图像,即原始图像。
   ● ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。
   ● ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高 度和宽度。
   ● anchor 是锚点,(指对应哪个区域)
   ● normalize 表示在滤波时是否进行归一化。
      1.当值为True时,归一化,用邻域像素值的和除以面积。  此时方框滤波与 均值滤波 效果相同。
      2.当值为False时,不归一化,直接使用邻域像素值的和。和>255时使用255
'''
boxFilter_1 = cv2.boxFilter(noise,-1,(3,3),normalize = True)
cv2.imshow('boxFilter_1',boxFilter_1)
cv2.waitKey(0)
boxFilter_2 = cv2.boxFilter(noise,-1,(3,3),normalize = False)
cv2.imshow('boxFilter_2',boxFilter_2)
cv2.waitKey(0)

优点:

  • 计算相对简单,速度较快。
  • 对于一些平滑程度要求不高的情况,可以快速达到一定的平滑效果。

缺点:

  • 如果未进行归一化,可能会导致像素值超出正常范围(例如 0 - 255),出现异常的结果。
  • 与均值滤波类似,可能会使图像变得模糊,丢失部分细节。
高斯滤波(GaussianBlur)

使用高斯函数来确定滤波核中每个像素的权重。离中心像素越近,权重越大;离中心像素越远,权重越小。再对滤波核覆盖区域内的像素进行加权平均,得到中心像素的新值。

'''
cv2.GaussianBlur(src, ksize[, sigmaX[, sigmaY[, dst]]])高斯滤波
参数说明:
src:输入图像,通常是一个NumPy数组。
ksize:滤波器的大小,它是一个元组,表示在水平和垂直方向上的像素数量。例如,(5, 5)表示一个5x5的滤波器。
sigmaX和sigmaY:分别表示在X轴和Y轴方向上的标准差。这些值与滤波器大小相同。默认情况下,它们都等于0,这意味着没有高斯模糊。
dst:输出图像,通常是一个NumPy数组。如果为None,则会创建一个新的数组来存储结果。
'''
GaussianB = cv2.GaussianBlur(noise,(3,3),1) #标准差为1,标准正太分布。
cv2.imshow('GaussianBlur_k=3_s=1',GaussianB)
cv2.waitKey(0)
GaussianB = cv2.GaussianBlur(noise,(3,3),2) 
cv2.imshow('GaussianBlur_k=3_s=2',GaussianB)
cv2.waitKey(0)
GaussianB = cv2.GaussianBlur(noise,(5,5),1) #标准差为1,标准正太分布。
cv2.imshow('GaussianBlur_k=5_s=1',GaussianB)
cv2.waitKey(0)

优点:

  • 相比均值滤波,能更好地保留图像的边缘和细节,因为其权重分配更符合图像的特征。
  • 对高斯噪声有较好的抑制效果。

缺点:

  • 计算复杂度相对较高,因为需要计算每个像素的权重。
中值滤波(medianBlur)

会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值从小到大排序,然后将位于中间位置的像素值作为当前像素点的像素值。

medianBlur函数:

'''
cv2.medianBlur(src, ksize[, dst])中值滤波
参数说明:
src:输入图像。
ksize:滤波器的大小,它是一个整数,表示在水平和垂直方向上的像素数量。例如,5表示一个5x5的滤波器。
dst:输出图像,通常是一个NumPy数组。如果为None,则会创建一个新的数组来存储结果。
'''
medianB = cv2.medianBlur(noise,3)
cv2.imshow('medianBlur_k=3',medianB)
cv2.waitKey(0)
medianB = cv2.medianBlur(noise,5)
cv2.imshow('medianBlur_k=5',medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()

优点:

  • 对椒盐噪声有非常好的去除效果。
  • 能够在去除噪声的同时较好地保护图像的边缘信息。

缺点:

  • 对于一些细节丰富的图像,可能会使部分细节变得模糊。

综合来看,中值滤波处理椒盐噪声效果最好!


网站公告

今日签到

点亮在社区的每一天
去签到