数字水印 | 图像噪声攻击(高斯/椒盐/泊松/斑点)
目录
- 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 类的一个子类,用…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...