当前位置: 首页 > news >正文

数字水印 | 图像噪声攻击(高斯/椒盐/泊松/斑点)

目录

    • Noise Attack
      • 1 高斯噪声(Gaussian Noise)
      • 2 椒盐噪声(Salt and Pepper Noise)
      • 3 泊松噪声(Poisson Noise)
      • 4 斑点噪声(Speckle Noise)
      • 5 完整代码


参考博客:Python 使用 opencv 对图像添加噪声(高斯/椒盐/泊松/斑点)



Noise Attack

1 高斯噪声(Gaussian Noise)

高斯噪声是通过在图片中引入服从高斯分布的随机噪声来实现的。通过调整高斯分布的标准差 s i g m a \mathsf{sigma} sigma,可以控制噪声的添加程度; s i g m a \mathsf{sigma} sigma 的值越大,图片受噪声影响越严重。

def add_gaussian_noise(image):mean = 0  # 设置高斯分布的均值sigma = 25  # 设置高斯分布的标准差# 根据均值和标准差生成符合高斯分布的噪声gauss = np.random.normal(mean, sigma, image.shape)# 添加高斯噪声noise_attacked_image = image + gauss# 控制添加噪声后的像素值在[0,255]之间noise_attacked_image = np.clip(noise_attacked_image, a_min=0, a_max=255)noise_attacked_image = noise_attacked_image.astype(np.uint8)return noise_attacked_image

实现效果

在这里插入图片描述



2 椒盐噪声(Salt and Pepper Noise)

椒盐噪声是通过在图片中引入黑白噪点来实现的,其中 代表黑色噪点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0) 代表白色噪点 ( 255 , 255 , 255 ) (255,255,255) (255,255,255)。通过调整 a m o u n t \mathsf{amount} amount 参数,可以控制噪声的比例; a m o u n t \mathsf{amount} amount 值越大,图像受噪声影响越严重。

def add_salt_and_pepper_noise(image):amount = 0.04  # 设置添加的噪声占原始图像的比例s_vs_p = 0.5  # 设置噪声中salt和pepper的比例noise_attacked_image = np.copy(image)# 设置添加的salt噪声的数量num_salt = np.ceil(amount * s_vs_p * image.size)# 设置添加噪声的坐标位置coords = [np.random.randint(0, i-1, int(num_salt)) for i in image.shape]# 添加salt噪声noise_attacked_image[coords[0], coords[1], :] = [255, 255, 255]# 设置添加的pepper噪声的数量num_salt = np.ceil(amount * (1 - s_vs_p) * image.size)# 设置添加噪声的坐标位置coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]# 添加pepper噪声noise_attacked_image[coords[0], coords[1], :] = [0, 0, 0]return noise_attacked_image

实现效果

在这里插入图片描述



3 泊松噪声(Poisson Noise)

def add_poisson_noise(image):# 计算图像像素的分布vals = len(np.unique(image))vals = 2 ** np.ceil(np.log2(vals))# 添加泊松噪声noise_attacked_image = np.random.poisson(image * vals) / float(vals)noise_attacked_image = noise_attacked_image.astype(np.uint8)return noise_attacked_image

由于我不知道原理,因此无法判断上述代码的正误。比如,以下博客的实现方式就与它不同:

  • 如何给图片添加泊松(Poisson)噪声(附 Python 代码)

实现效果

在这里插入图片描述在这里插入图片描述

前者噪声图像中心有非常明显的噪声点,但是后者噪声图像却没有,这噪声攻击是见人下碟啊😇



4 斑点噪声(Speckle Noise)

def add_speckle_noise(image):# 生成一个服从高斯分布的噪声gauss = np.random.randn(image.shape[0], image.shape[1], image.shape[2])# 添加speckle噪声noise_attacked_image = image + image * gauss# 控制添加噪声后的像素值在[0,255]之间noise_attacked_image = np.clip(noise_attacked_image, a_min=0, a_max=255)noise_attacked_image = noise_attacked_image.astype(np.uint8)return noise_attacked_image

实现效果

在这里插入图片描述



5 完整代码

import cv2
import numpy as np
import matplotlib.pyplot as pltdef add_gaussian_noise(image):mean = 0  # 设置高斯分布的均值sigma = 25  # 设置高斯分布的标准差# 根据均值和标准差生成符合高斯分布的噪声gauss = np.random.normal(mean, sigma, image.shape)# 添加高斯噪声noise_attacked_image = image + gauss# 控制添加噪声后的像素值在[0,255]之间noise_attacked_image = np.clip(noise_attacked_image, a_min=0, a_max=255)noise_attacked_image = noise_attacked_image.astype(np.uint8)return noise_attacked_imagedef add_salt_and_pepper_noise(image):amount = 0.04  # 设置添加的噪声占原始图像的比例s_vs_p = 0.5  # 设置噪声中salt和pepper的比例noise_attacked_image = np.copy(image)# 设置添加的salt噪声的数量num_salt = np.ceil(amount * s_vs_p * image.size)# 设置添加噪声的坐标位置coords = [np.random.randint(0, i-1, int(num_salt)) for i in image.shape]# 添加salt噪声noise_attacked_image[tuple(coords)] = 255# 设置添加的pepper噪声的数量num_salt = np.ceil(amount * (1 - s_vs_p) * image.size)# 设置添加噪声的坐标位置coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]# 添加pepper噪声noise_attacked_image[tuple(coords)] = 0return noise_attacked_imagedef add_poisson_noise(image):# 计算图像像素的分布vals = len(np.unique(image))vals = 2 ** np.ceil(np.log2(vals))# 添加泊松噪声noise_attacked_image = np.random.poisson(image * vals) / float(vals)noise_attacked_image = noise_attacked_image.astype(np.uint8)return noise_attacked_imagedef add_speckle_noise(image):# 生成一个服从高斯分布的噪声gauss = np.random.randn(image.shape[0], image.shape[1], image.shape[2])# 添加speckle噪声noise_attacked_image = image + image * gauss# 归一化图像的像素值noise_attacked_image = np.clip(noise_attacked_image, a_min=0, a_max=255)noise_attacked_image = noise_attacked_image.astype(np.uint8)return noise_attacked_imageimage = cv2.imread("logo.jpg")
image = image[:, :, [2, 1, 0]]# noise_attacked_image = add_gaussian_noise(image)
noise_attacked_image = add_salt_and_pepper_noise(image)
# noise_attacked_image = add_poisson_noise(image)
# noise_attacked_image = add_speckle_noise(image)# 画图
plt.subplot(1, 2, 1)
plt.title("image", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(image, cmap='gray')plt.subplot(1, 2, 2)
plt.title("noise_attacked_image", fontsize=12, loc="center")
plt.axis('off')
plt.imshow(noise_attacked_image, cmap='gray')plt.savefig('test.jpg', dpi=400, bbox_inches='tight')
plt.show()


http://www.lryc.cn/news/359079.html

相关文章:

  • LeetCode-47 全排列Ⅱ
  • list 的实现
  • 一个程序员的牢狱生涯(47)学法
  • 微信小程序-页面导航
  • 计算机网络- 特定服务类型(Type of Service, TOS) 服务质量(Quality of Service, QoS)
  • 2.6 Docker部署多个前端项目
  • 如何格式化只读U盘?
  • 【并查集】专题练习
  • 服装连锁店收银系统需要具备的五大功能
  • IMU状态预积分代码实现 —— IMU状态预积分类
  • C语言编程:探索最小公倍数的奥秘
  • Java设计模式-活动对象与访问者
  • 用HAL库改写江科大的stm32入门-6-3 PWM驱动LED呼吸灯
  • [数据集][目标检测]喝水检测数据集VOC+YOLO格式995张3类别
  • 【C++】开源:RabbitMQ安装与配置使用(SimpleAmqpClient)
  • git使用流程与规范
  • 力扣 264. 丑数 II python AC
  • resetlogs强制拉库失败并使用备份system文件还原数据库故障处理---惜分飞
  • 解析Java中1000个常用类:Error类,你学会了吗?
  • 【C++】——string模拟实现
  • unity2D跑酷游戏
  • OWASP top10--SQL注入(四、sqlmap安装及使用)
  • Java基础入门day62
  • Oracle中两张表具有相同结构,如何将一张表内容全部插入到另一个表中
  • 比特币的理论上限是多少个?
  • LeetCode-131 分割回文串
  • Flutter 中的 SliverPrototypeExtentList 小部件:全面指南
  • NeuralForecast 推理 - 数据集从文件dataset.pkl读
  • TS-类型转换(显式)
  • protobufjs 配置踩坑记录