OpenCV平滑处理惩罚:图像去噪与含糊技能详解

[复制链接]
发表于 2025-10-10 01:44:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
弁言

        在图像处理惩罚中,噪声是一个常见的题目,它大概来自于图像收罗装备、传输过程或情况干扰。为了去除噪声并改善图像质量,平滑处理惩罚(Smoothing)是一种常用的技能。OpenCV提供了多种平滑处理惩罚方法,包罗均值滤波、高斯滤波和中值滤波。本文将具体先容这些方法,并通过代码示例展示它们的现实结果。

原理

      平滑处理惩罚是一种通过对图像举行滤波往复除噪声的技能。它的根本原理是利用像素邻域内的像素值来替换当前像素值,从而淘汰噪声的影响。常见的平滑处理惩罚方法包罗均值滤波、高斯滤波和中值滤波,每种方法都有其独特的上风和实用场景。

 1. 均值滤波(Averaging Filter)

        均值滤波是最简朴的平滑处理惩罚方法之一。它通过盘算像素邻域内像素值的匀称值来替换当前像素值。均值滤波可以有效地去除噪声,但也会导致图像变得含糊。
     均值滤波利用一个归一化的卷积核(通常是正方形)对图像举行卷积操纵。比方,一个3x3大概5x5的卷积核

 代码示例
  1. import cv2
  2. import numpy as np
  3. def add_peppersalt_noise(image,n=10000):
  4.     result = image.copy()
  5.     h,w = image.shape[:2]
  6.     for i in range(n):
  7.         x = np.random.randint(1,h)
  8.         y = np.random.randint(1,w)
  9.         if np.random.randint(0,2)==0:
  10.             result[x,y]=0
  11.         else:
  12.             result[x,y]=255
  13.     return result
  14. image = cv2.imread('csdn_test.png')
  15. cv2.imshow('yntu',image)
  16. cv2.waitKey(0)
  17. noise=add_peppersalt_noise(image)
  18. cv2.imshow('noise',noise)
  19. cv2.waitKey(0)
  20. ''' 均值滤波'''
  21. #  dst=cv2.blur(src,ksize,anchor,borderType)
  22. #      dst是返回值
  23. #      src是需要处理的图像
  24. #      kszie是滤波核(卷积核)的大小
  25. #      anchor是锚点,默认值是(-1,-1)一般无需更改
  26. #      borderType是边界样式,一般无需更改
  27. #
  28. # 一般情况下,使用dst=cv2.blur(src,ksize)即可
  29. #
  30. blur_1=cv2.blur(noise,(3,3))
  31. cv2.imshow('blur_1',blur_1)
  32. cv2.waitKey(0)
  33. blur_2=cv2.blur(noise,(5,5))
  34. cv2.imshow('blur_2',blur_2)
  35. cv2.waitKey(0)
  36. cv2.destroyAllWindows()
复制代码
- 均值滤波后的图像:噪声淘汰,但图像变得含糊。

2. 方框滤波(Box Filter)

     方框滤波是一种简朴的线性滤波方法,它通过盘算像素邻域内像素值的匀称值来替换当前像素值。与均值滤波类似,但方框滤波可以选择是否对结果举行归一化。
     框滤波利用一个矩形卷积查对图像举行卷积操纵。如果选择归一化,则结果与均值滤波雷同;如果不归一化,则直接对像素值求和。


代码示例
  1. import cv2
  2. import numpy as np
  3. def add_peppersalt_noise(image,n=10000):
  4.     result = image.copy()
  5.     h,w = image.shape[:2]
  6.     for i in range(n):
  7.         x = np.random.randint(1,h)
  8.         y = np.random.randint(1,w)
  9.         if np.random.randint(0,2)==0:
  10.             result[x,y]=0
  11.         else:
  12.             result[x,y]=255
  13.     return result
  14. image = cv2.imread('csdn_test.png')
  15. cv2.imshow('yntu',image)
  16. cv2.waitKey(0)
  17. noise=add_peppersalt_noise(image)
  18. cv2.imshow('noise',noise)
  19. cv2.waitKey(0)
  20. '''方框滤波'''
  21. # dst=cv2.boxFilter (src,ddepth,ksize,anchor,normalize,borderType)式中:
  22. #     dst是返回值,表示进行方框滤波后得到的处理结果。
  23. #     src 是需要处理的图像,即原始图像。
  24. #     ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。(可以理解为数据类型)
  25. #     ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。
  26. #     anchor 是错点,(指对应哪个区域)
  27. #     normalize 表示在滤波时是否进行归一化。
  28. #       1.当值为True时,归一化,用邻域像素值的和除以面积。此时方框滤波与均值滤波效果相同#
  29. #       2.当值为False时,不归一化,直接使用邻域像素值的和。和>255时使用255
  30. boxFilter_1=cv2.boxFilter(noise,-1,(3,3),normalize=True)
  31. cv2.imshow('boxFilter_1',boxFilter_1)
  32. cv2.waitKey(0)
  33. boxFilter_2=cv2.boxFilter(noise,-1,(3,3),normalize=False)
  34. cv2.imshow('boxFilter_2',boxFilter_2)
  35. cv2.waitKey(0)
  36. cv2.destroyAllWindows()
复制代码



  •         归一化的方框滤波:与均值滤波结果雷同。
  •         不归一化的方框滤波:像素值大概超出范围,图像变亮或变暗。
 

3. 高斯滤波(Gaussian Filter)

      高斯滤波是一种基于高斯函数的平滑处理惩罚方法。与均值滤波差别,高斯滤波在盘算像素值时,会给邻域内的像素赋予差别的权重,隔断中央像素越近的像素权重越大。这种方法在去除噪声的同时,可以或许更好地生存图像的边沿信息。
      高斯滤波利用一个高斯核举行卷积操纵。高斯核的权重由高斯函数盘算得出,比方一个3x3大概5x5的高斯核。

代码示例
  1. import cv2
  2. import numpy as np
  3. def add_peppersalt_noise(image,n=10000):
  4.     result = image.copy()
  5.     h,w = image.shape[:2]
  6.     for i in range(n):
  7.         x = np.random.randint(1,h)
  8.         y = np.random.randint(1,w)
  9.         if np.random.randint(0,2)==0:
  10.             result[x,y]=0
  11.         else:
  12.             result[x,y]=255
  13.     return result
  14. image = cv2.imread('csdn_test.png')
  15. cv2.imshow('yntu',image)
  16. cv2.waitKey(0)
  17. noise=add_peppersalt_noise(image)
  18. cv2.imshow('noise',noise)
  19. cv2.waitKey(0)
  20. '''高斯滤波'''
  21. # cv2.GaussianBlur(src,ksize,[,sigmaX[,sigmaY[,dst]]])高斯滤波   或
  22. # cv2.GaussianBlur(src,ksize, sigmaX[, dst[, sigmaY[, borderType]]]) → dst
  23. #
  24. #     src:输入图像,通常是一个numpy数组。
  25. #     ksize:滤波器的大小,它是一个元组,表示在水平和垂直方向上的像素数量。例如,(5,5)表示一个5x5的滤波器。
  26. #     siqmaX和siqmaY:分别表示在X轴Y轴方向上的标准差。这些值与滤波器大小相同。默认情况下,它们都等于0,这意味着没有高斯模糊
  27. #     dst:输出图像,通常是一个numpy数组。如果为one,则会创建一个新的数组来存储结果。
  28. #     borderType (可选):
  29. #        边界填充类型。默认是 cv2.BORDER_DEFAULT,表示使用镜像边界填充。其他可选值包括:
  30. #        cv2.BORDER_CONSTANT: 使用常数填充边界。
  31. #        cv2.BORDER_REPLICATE: 复制边界像素。
  32. #        cv2.BORDER_REFLECT: 镜像反射边界。
  33. #        cv2.BORDER_WRAP: 环绕边界
  34. GaussianB=cv2.GaussianBlur(noise,(3,3),1)
  35. cv2.imshow('GaussianBlur',GaussianB)
  36. cv2.waitKey(0)
  37. cv2.destroyAllWindows()
复制代码
- 高斯滤波后的图像:噪声淘汰,边沿信息生存较好。

4. 中值滤波(Median Filter)

     中值滤波是一种非线性平滑处理惩罚方法,它通过盘算像素邻域内像素值的中值来替换当前像素值。中值滤波特殊得当去除椒盐噪声(Salt-and-Pepper Noise),同时可以或许较好地生存图像的边沿信息。
中值滤波不须要卷积核,而是直接对邻域内的像素值举行排序,然后取中值作为当前像素值。

 代码示例
  1. import cv2
  2. import numpy as np
  3. def add_peppersalt_noise(image,n=10000):
  4.     result = image.copy()
  5.     h,w = image.shape[:2]
  6.     for i in range(n):
  7.         x = np.random.randint(1,h)
  8.         y = np.random.randint(1,w)
  9.         if np.random.randint(0,2)==0:
  10.             result[x,y]=0
  11.         else:
  12.             result[x,y]=255
  13.     return result
  14. image = cv2.imread('csdn_test.png')
  15. cv2.imshow('yntu',image)
  16. cv2.waitKey(0)
  17. noise=add_peppersalt_noise(image)
  18. cv2.imshow('noise',noise)
  19. cv2.waitKey(0)
  20. '''中值滤波'''
  21. #cv2.medianBlur(src,ksizel,dst])中值滤波
  22. #    src:输入图像。# # ksize:滤波器的大小,它是一个整数,表示在水平和垂直方向上的像素数量。例如,5表示:一个5x5 的滤波器
  23. #    dst:输出图像,通常是一个umPy数组。如果为None,则会创建一个新的数组来存储结果。
  24. medianB=cv2.medianBlur(noise,3)
  25. cv2.imshow('medianBlur',medianB)
  26. cv2.waitKey(0)
  27. cv2.destroyAllWindows()
复制代码
- 中值滤波后的图像:椒盐噪声被有效去除,边沿信息生存较好。

 5. 双边滤波(Bilateral Filter)

     双边滤波是一种非线性的平滑处理惩罚方法,它不光思量像素的空间隔断,还思量像素值的相似性。因此,双边滤波在去除噪声的同时,可以或许很好地生存图像的边沿信息。
     双边滤波利用两个高斯核:一个用于空间隔断,另一个用于像素值差别。通过这种方式,双边滤波可以在平滑图像的同时生存边沿。

代码示例
  1. import cv2
  2. import numpy as np
  3. def add_peppersalt_noise(image,n=10000):
  4.     result = image.copy()
  5.     h,w = image.shape[:2]
  6.     for i in range(n):
  7.         x = np.random.randint(1,h)
  8.         y = np.random.randint(1,w)
  9.         if np.random.randint(0,2)==0:
  10.             result[x,y]=0
  11.         else:
  12.             result[x,y]=255
  13.     return result
  14. image = cv2.imread('csdn_test.png')
  15. cv2.imshow('yntu',image)
  16. cv2.waitKey(0)
  17. noise=add_peppersalt_noise(image)
  18. cv2.imshow('noise',noise)
  19. cv2.waitKey(0)
  20. ''' 双边滤波'''
  21. #cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst
  22. #参数说明:
  23. # src:输入图像,可以是8位或浮点型单通道或三通道图像。(numpy.ndarray 类型)
  24. # d: 滤波过程中每个像素邻域的直径,如果设为非正数,则根据sigmaSpace自动计算直径。(类型:int)
  25. # sigmaColor:颜色空间的标准差,用于控制像素值差异的权重。值越大,表明像素值差异较大的像素也会被考虑进来,滤波效果越明显。(类型:float)
  26. # sigmaSpace:坐标空间的标准差,用于控制空间距离的权重。值越大,表明距离较远的像素也会被考虑进来,滤波效果越明显。(类型:float)
  27. # dst(可选):输出图像,与输入图像src具有相同的尺寸和类型。如果未提供,函数会创建一个新的数组。(类型:numpy.ndarray)
  28. # borderType(可选):边界填充方式。OpenCV提供了多种边界填充方式,如cv2.BORDER_CONSTANT、cv2.BORDER_REFLECT等。默认值为cv2.BORDER_DEFAULT。
  29. bilateral_blurred = cv2.bilateralFilter(image, 9, 75, 75)
  30. cv2.imshow('Bilateral Blurred Image', bilateral_blurred)
  31. cv2.waitKey(0)
  32. cv2.destroyAllWindows()
复制代码
- 双边滤波后的图像:噪声淘汰,边沿信息生存非常好。

总结

      平滑处理惩罚是图像处理惩罚中的紧张技能,可以或许有效去除噪声并改善图像质量。本文先容了OpenCV中五种常见的平滑处理惩罚方法:均值滤波、高斯滤波、中值滤波和双边滤波。每种方法都有其独特的上风和实用场景:

  •         均值滤波:简朴快速,得当一样平常噪声去除。
  •         方框滤波:机动选择是否归一化,得当特定场景。
  •         高斯滤波:生存边沿信息,得当须要生存细节的场景。
  •         中值滤波:得当去除椒盐噪声。
  •         双边滤波:在去除噪声的同时,可以或许很好地生存边沿信息。
通过把握这些方法,你可以根据现实需求选择符合的平滑处理惩罚技能,提升图像处理惩罚的结果。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表