数字水印 | 图像噪声攻击(高斯/椒盐/泊松/斑点)
目录
- 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()
相关文章:
数字水印 | 图像噪声攻击(高斯/椒盐/泊松/斑点)
目录 Noise Attack1 高斯噪声(Gaussian Noise)2 椒盐噪声(Salt and Pepper Noise)3 泊松噪声(Poisson Noise)4 斑点噪声(Speckle Noise)5 完整代码 参考博客:Python…...
LeetCode-47 全排列Ⅱ
LeetCode-47 全排列Ⅱ 题目描述解题思路代码说明 题目描述 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 : 输入:nums [1,1,2]输出: [[1,1,2], [1,2,1], [2,1,1]] b站题目解读讲的不好&…...
list 的实现
目录 list 结点类 结点类的构造函数 list的尾插尾删 list的头插头删 迭代器 运算符重载 --运算符重载 和! 运算符重载 * 和 -> 运算符重载 list 的insert list的erase list list实际上是一个带头双向循环链表,要实现list,则首先需要实现一个结点类,而一个结点需要…...
一个程序员的牢狱生涯(47)学法
星期一 学法 二铺不知道什么时候走到了我的身边,向我说道,这是二铺在我进来号子后主动过来和我说话。 我听到二铺这声突兀的说话后,抬起头。这时我才看到,除了二铺,还有六子、棍子都围在我的身边,看着我。虽然六子和棍子依旧一副‘吊儿郎当’的样子,但我从他们几个的眼神…...
微信小程序-页面导航
一、页面导航 页面导航指的是页面之间的相互跳转,例如:浏览器中实现页面导航的方式有如下两种: 1.<a>链接 2.location.href 二、小程序中实现页面导航的两种方式 1.声明式导航 在页面上声明一个<navigator>导航组件 通过点击…...
计算机网络- 特定服务类型(Type of Service, TOS) 服务质量(Quality of Service, QoS)
特定服务类型(Type of Service, TOS) 具有特定服务类型(Type of Service, TOS)的数据包是指在IP头部中包含特定TOS字段设置的数据包。TOS字段用于指示数据包的服务质量要求,如延迟、吞吐量、可靠性等。现代IP网络通常…...
2.6 Docker部署多个前端项目
2.6 Docker部署多个项目 三. 部署前端项目 1.将前端项目打包到同一目录下(tcm-ui) 2. 部署nginx容器 docker run --namenginx -p 9090:9090 -p 9091:9091 -d nginx3. 复制nginx.conf文件到主机目录 docker cp nginx:/etc/nginx/nginx.conf /root/ja…...
如何格式化只读U盘?
U盘只读无法格式化,该怎么处理?别担心!本文将向你提供一些实用方法,助你解决U盘写保护的难题。这些方法能有效帮助你解除U盘的只读状态,从而可以顺利进行格式化和其他操作。 不能格式化只读U盘 “我购买了一个U盘&…...
【并查集】专题练习
题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 模板 836. 合并集合 - AcWing题库 #include<bits/stdc.h> using lllong long; //#define int ll const int N1e510,mod1e97; int n,m; int p[N],sz[N]; int find(int a) {if(p[a]!a) p[a]find(p[a]);return p[a…...
服装连锁店收银系统需要具备的五大功能
当今服装连锁店在市场竞争中需要拥有高效的收银系统来提升业务效率和顾客满意度。以下是服装连锁店收银系统需要具备的五大功能: 首先,完善的商品管理功能是至关重要的。这包括商品信息的录入、管理、更新和查询。收银系统应该能够快速而准确地识别商品&…...
IMU状态预积分代码实现 —— IMU状态预积分类
IMU状态预积分代码实现 —— IMU状态预积分类 实现IMU状态预积分类 实现IMU状态预积分类 首先,实现预积分自身的结构。一个预积分类应该存储一下数据: 预积分的观测量 △ R ~ i j , △ v ~ i j , △ p ~ i j \bigtriangleup \tilde{R} _{ij},\bigtrian…...
C语言编程:探索最小公倍数的奥秘
C语言编程:探索最小公倍数的奥秘 在编程的世界中,计算两个数的最小公倍数(LCM)是一个常见的数学问题。C语言作为一种基础且强大的编程语言,为我们提供了实现这一功能的工具。本文将从四个方面、五个方面、六个方面和七…...
Java设计模式-活动对象与访问者
活动对象 Java设计模式中,活动对象是指一个对象始终处于活动的状态,该对象包括一个线程安全的数据结构以及一个活跃的执行线程。 如上所示,ActiveCreature类的构造函数初始化一个线程安全的数据结构(阻塞队列)、初始化…...
用HAL库改写江科大的stm32入门-6-3 PWM驱动LED呼吸灯
接线图: 2 :实验目的: 利用pwm实现呼吸灯。 关键PWM定时器设置: 代码部分: int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*…...
[数据集][目标检测]喝水检测数据集VOC+YOLO格式995张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):995 标注数量(xml文件个数):995 标注数量(txt文件个数):995 标注类别…...
【C++】开源:RabbitMQ安装与配置使用(SimpleAmqpClient)
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路…...
git使用流程与规范
原文网址:git代码提交流程与规范-CSDN博客 简介 本文git提交流程与规范是宝贵靠谱的经验,它能解决如下问题: 分支差距过大,导致合代码无数的冲突合完代码后发现代码丢失分支不清晰,无法追溯问题合代码耗时很长&…...
力扣 264. 丑数 II python AC
堆 from heapq import heappop, heappushclass Solution:def nthUglyNumber(self, n):q [1]vis {1}for _ in range(n - 1):now heappop(q)for i in [2, 3, 5]:if now * i not in vis:vis.add(now * i)heappush(q, now * i)return heappop(q)...
resetlogs强制拉库失败并使用备份system文件还原数据库故障处理---惜分飞
接手一个库,在open的过程中遭遇到ORA-600 2662错误 Sun May 26 10:15:54 2024 alter database open RESETLOGS RESETLOGS is being done without consistancy checks. This may result in a corrupted database. The database should be recreated. RESETLOGS after incomplete…...
解析Java中1000个常用类:Error类,你学会了吗?
在 Java 编程中,异常处理是一个至关重要的部分。Java 提供了丰富的异常处理机制,包括 Exception 和 Error。 本文将深入探讨 Error 类的功能、用法、实际应用中的注意事项,以及如何处理和预防这些错误。 什么是 Error 类? Error 类是 Java 中 Throwable 类的一个子类,用…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
