• 图像处理:随机添加椒盐噪声和高斯噪声Python


    图像处理:随机添加椒盐噪声和高斯噪声Python

    目录

    图像处理:随机添加椒盐噪声和高斯噪声Python

    1.常见的图像噪声

    (1)高斯噪声

    (2) 椒盐噪声

    2.生成图像噪声

    (1)高斯噪声

    (2) 椒盐噪声(速度慢)

    (3) 椒盐噪声(快速版)

    3. Demo测试


            图像噪声是指存在于图像数据中的不必要的或多余的干扰信息。在噪声的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量图像噪声。通俗的讲就是信号占多少,噪声占多少,SNR越小,噪声占比越大。

    【尊重原则,转载请注明出处】https://panjinquan.blog.csdn.net/article/details/126542210


    1.常见的图像噪声

    (1)高斯噪声

            高斯噪声Gaussian noise,是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声,通常是因为不良照明和高温引起的传感器噪声。

    (2) 椒盐噪声

            椒盐噪声salt-and-pepper noise,又称为脉冲噪声,它是一种随机出现的白点(盐噪声)或者黑点(椒噪声),通常是由图像传感器,传输信道,解压处理等产生的黑白相间的亮暗点噪声(椒-黑,盐-白)。常用的去除这种噪声的有效手段是使用中值滤波器


    2.生成图像噪声

    在原始图像基础上加上噪声分量,即可生成图像噪声

    (1)高斯噪声

    1. def gaussian_noise(image, mean=0.1, sigma=0.1):
    2. """
    3. 添加高斯噪声
    4. :param image:原图
    5. :param mean:均值
    6. :param sigma:标准差 值越大,噪声越多
    7. :return:噪声处理后的图片
    8. """
    9. image = np.asarray(image / 255, dtype=np.float32) # 图片灰度标准化
    10. noise = np.random.normal(mean, sigma, image.shape).astype(dtype=np.float32) # 产生高斯噪声
    11. output = image + noise # 将噪声和图片叠加
    12. output = np.clip(output, 0, 1)
    13. output = np.uint8(output * 255)
    14. return output

    (2) 椒盐噪声(速度慢)

    常规的方法,需要遍历每个像素,添加椒盐噪声,该方法十分缓慢。Python语言十分不建议进行图像像素遍历操作,毕竟性能太差,速度太慢了(除非写成C/C++版本)。我们可以借助numpy的矩阵处理,实现快速的添加椒盐噪声。

    1. def salt_pepper_noise(image: np.ndarray, prob=0.01):
    2. """
    3. 添加椒盐噪声,该方法需要遍历每个像素,十分缓慢
    4. :param image:
    5. :param prob: 噪声比例
    6. :return:
    7. """
    8. for i in range(image.shape[0]):
    9. for j in range(image.shape[1]):
    10. if random.random() < prob:
    11. image[i][j] = 0 if random.random() < 0.5 else 255
    12. else:
    13. image[i][j] = image[i][j]
    14. return image

    (3) 椒盐噪声(快速版)

    我们可以借助numpy的矩阵处理,实现快速的添加椒盐噪声。基本思路:利用np.random.uniform生成0~1的均匀噪声( uniform distribution noise),然后将noise > prob的像素设置0或者255,这样通过矩阵的处理,可以快速添加椒盐噪声。

    1. def fast_salt_pepper_noise(image: np.ndarray, prob=0.02):
    2. """
    3. 随机生成一个0~1的mask,作为椒盐噪声
    4. :param image:图像
    5. :param prob: 椒盐噪声噪声比例
    6. :return:
    7. """
    8. image = add_uniform_noise(image, prob * 0.51, vaule=255)
    9. image = add_uniform_noise(image, prob * 0.5, vaule=0)
    10. return image
    11. def add_uniform_noise(image: np.ndarray, prob=0.05, vaule=255):
    12. """
    13. 随机生成一个0~1的mask,作为椒盐噪声
    14. :param image:图像
    15. :param prob: 噪声比例
    16. :param vaule: 噪声值
    17. :return:
    18. """
    19. h, w = image.shape[:2]
    20. noise = np.random.uniform(low=0.0, high=1.0, size=(h, w)).astype(dtype=np.float32) # 产生高斯噪声
    21. mask = np.zeros(shape=(h, w), dtype=np.uint8) + vaule
    22. index = noise > prob
    23. mask = mask * (~index)
    24. output = image * index[:, :, np.newaxis] + mask[:, :, np.newaxis]
    25. output = np.clip(output, 0, 255)
    26. output = np.uint8(output)
    27. return output

    3. Demo性能测试

    需要用到pybaseutils工具,pip安装即可

    1. # -*-coding: utf-8 -*-
    2. """
    3. @Author : panjq
    4. @E-mail : pan_jinquan@163.com
    5. @Date : 2022-07-27 15:23:24
    6. @Brief :
    7. """
    8. import cv2
    9. import random
    10. import numpy as np
    11. from pybaseutils import time_utils
    12. @time_utils.performance("gaussian_noise")
    13. def gaussian_noise(image, mean=0.1, sigma=0.1):
    14. """
    15. 添加高斯噪声
    16. :param image:原图
    17. :param mean:均值
    18. :param sigma:标准差 值越大,噪声越多
    19. :return:噪声处理后的图片
    20. """
    21. image = np.asarray(image / 255, dtype=np.float32) # 图片灰度标准化
    22. noise = np.random.normal(mean, sigma, image.shape).astype(dtype=np.float32) # 产生高斯噪声
    23. output = image + noise # 将噪声和图片叠加
    24. output = np.clip(output, 0, 1)
    25. output = np.uint8(output * 255)
    26. return output
    27. @time_utils.performance("salt_pepper_noise")
    28. def salt_pepper_noise(image: np.ndarray, prob=0.01):
    29. """
    30. 添加椒盐噪声,该方法需要遍历每个像素,十分缓慢
    31. :param image:
    32. :param prob: 噪声比例
    33. :return:
    34. """
    35. for i in range(image.shape[0]):
    36. for j in range(image.shape[1]):
    37. if random.random() < prob:
    38. image[i][j] = 0 if random.random() < 0.5 else 255
    39. else:
    40. image[i][j] = image[i][j]
    41. return image
    42. @time_utils.performance("fast_salt_pepper_noise")
    43. def fast_salt_pepper_noise(image: np.ndarray, prob=0.02):
    44. """
    45. 随机生成一个0~1的mask,作为椒盐噪声
    46. :param image:图像
    47. :param prob: 椒盐噪声噪声比例
    48. :return:
    49. """
    50. image = add_uniform_noise(image, prob * 0.51, vaule=255)
    51. image = add_uniform_noise(image, prob * 0.5, vaule=0)
    52. return image
    53. def add_uniform_noise(image: np.ndarray, prob=0.05, vaule=255):
    54. """
    55. 随机生成一个0~1的mask,作为椒盐噪声
    56. :param image:图像
    57. :param prob: 噪声比例
    58. :param vaule: 噪声值
    59. :return:
    60. """
    61. h, w = image.shape[:2]
    62. noise = np.random.uniform(low=0.0, high=1.0, size=(h, w)).astype(dtype=np.float32) # 产生高斯噪声
    63. mask = np.zeros(shape=(h, w), dtype=np.uint8) + vaule
    64. index = noise > prob
    65. mask = mask * (~index)
    66. output = image * index[:, :, np.newaxis] + mask[:, :, np.newaxis]
    67. output = np.clip(output, 0, 255)
    68. output = np.uint8(output)
    69. return output
    70. def cv_show_image(title, image, use_rgb=True, delay=0):
    71. """
    72. 调用OpenCV显示RGB图片
    73. :param title: 图像标题
    74. :param image: 输入是否是RGB图像
    75. :param use_rgb: True:输入image是RGB的图像, False:返输入image是BGR格式的图像
    76. :return:
    77. """
    78. img = image.copy()
    79. if img.shape[-1] == 3 and use_rgb:
    80. img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # 将BGR转为RGB
    81. # cv2.namedWindow(title, flags=cv2.WINDOW_AUTOSIZE)
    82. cv2.namedWindow(title, flags=cv2.WINDOW_NORMAL)
    83. cv2.imshow(title, img)
    84. cv2.waitKey(delay)
    85. return img
    86. if __name__ == "__main__":
    87. test_file = "test.png"
    88. image = cv2.imread(test_file)
    89. prob = 0.02
    90. for i in range(10):
    91. out1 = gaussian_noise(image.copy())
    92. out2 = salt_pepper_noise(image.copy(), prob=prob)
    93. out3 = fast_salt_pepper_noise(image.copy(), prob=prob)
    94. print("----" * 10)
    95. cv_show_image("image", image, use_rgb=False, delay=1)
    96. cv_show_image("gaussian_noise", out1, use_rgb=False, delay=1)
    97. cv_show_image("salt_pepper_noise", out2, use_rgb=False, delay=1)
    98. cv_show_image("fast_salt_pepper_noise", out3, use_rgb=False, delay=0)

    循环机10次,salt_pepper_noise平均耗时125.49021ms,而fast_salt_pepper_noise平均耗时6.12011ms ,性能提高60倍左右,其生成的效果是基本一致的

    call gaussian_noise elapsed: avg:19.42925ms     total:194.29255ms     count:10
    call salt_pepper_noise elapsed: avg:125.49021ms     total:1254.90212ms     count:10
    call fast_salt_pepper_noise elapsed: avg:6.12011ms     total:61.20110ms     count:10 

    原图高斯噪声

    salt_pepper_noise

    fast_salt_pepper_noise

  • 相关阅读:
    Windows编写批处理脚本.bat启动jar文件
    nginx负载均衡(动静分离)
    tomcat 安装成服务
    log4j2.xml 获取当前系统属性
    ⚡文件工具类⚡
    Java学习笔记 --- Java绘图技术
    无胁科技-TVD每日漏洞情报-2022-8-15
    全栈软件测试工程师技术涨薪进阶路径图(附资料)
    A Philosophy of Software Design读书笔记——模块应该有深度
    考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/guyuealian/article/details/126542210