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

news2025/1/19 8:19:34

目录

    • 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 plt


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


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[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)] = 0

    return noise_attacked_image


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


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
    # 归一化图像的像素值
    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


image = 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.coloradmin.cn/o/1719807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES 生命周期管理

一 .概念 ILM定义了四个生命周期阶段:Hot:正在积极地更新和查询索引。Warm:不再更新索引,但仍在查询。cold:不再更新索引,很少查询。信息仍然需要可搜索,但是如果这些查询速度较慢也可以。Dele…

[羊城杯 2021]BabySmc

运行就是输入flag 不知道怎么跳过去的 这个应该就是smc加密的函数了 运行完这个函数才能继续往下 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // r12__int64 v5; // r13unsigned __int64 v6; // raxchar v7; // spcha…

恒压频比开环控制系统Matlab/Simulink仿真分析(SPWM控制方式)

介绍恒压频比的开环控制方法驱动永磁同步电机的转动,首先分析恒压频比的控制原理,然后在Matlab/Simulink中进行永磁同步电机恒压频比开环控制系统的仿真分析,最后将Simulink中的恒压频比控制算法生成代码加载到实际工程中进行工程实现。 一、…

匿名函数(lambda)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 匿名函数是指没有名字的函数,应用在需要一个函数,但是又不想费神去命名这个函数的场合。通常情况下,这样的函数只…

StrApi基本使用

1.创建项目(这里只使用默认的sqllite) 点击链接进入官网查看先决条件,看看自己的node,python等是否符合版本要求 运行以下命令进行创建项目(网慢导致下载失败的话可以尝试使用手机热点给电脑使用,我就是这样解决的,也可以看我csdn的资源这里进行下载) yarn create strapi-ap…

Echarts 指定 series 中的数据对应指定类型的X轴或Y轴

文章目录 需求分析需求 下图中,既有折线又有柱状图,也就是说X轴既有 value 的类型,又有 category 类型的数据,如果都要在一张图中展示, 分析 因为数据来源不同,且数据所对应的 X 轴和 Y 轴也不同,所以需要在设置数据源时添加所对应的索引 xAxisIndex 和 yAxisIndex op…

Llama模型家族之RLAIF 基于 AI 反馈的强化学习(六) RLAIF 代码实战

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

二叉树—堆(C语言实现)

一、树的概念及结构 1.树的概念 树是一种非线性的数据结构,它是有n(n > 0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下。 ● 有一个特殊的结点…

CasaOS:开源家庭云系统安装

CasaOS是一个基于Docker生态系统的开源家庭云系统,专为家庭场景而设计。致力于打造全球最简单、最易用、最优雅的家居云系统。安装CasaOS可以给鲁班猫带来更好的局域网文件传输体验。 安装脚本 wget -qO- https://get.casaos.io | sudo bash软件截图

nginx的安装002

之前001讲述了nginxyum安装现在讲一下nginx如何本地离线安装 操作系统: CentOS Stream 9 操作步骤: 首先访问nginx官网,下载。 用wget命令下载, [rootlocalhost ~]# wget -c https://nginx.org/download/nginx-1.26.0.tar.gz …

小白必看:COMSOL Multiphysics多物理场仿真技术与应用”光电专题

COMSOL Multiphysics多物理场仿真技术与应用”光电专题

路由选路原则

5.2路由选路原则 路由就是报文从源端到目的端的路径。当报文从路由器到目的网段有多条路由可达时,路由器可以根据路由表中最佳路由进行转发。最佳路由的选取与发现此路由的路由协议的优先级、路由的度量有关。当多条路由的协议优先级与路由度量都相同时&#xff0c…

【工具】Docker安装Jenkins并部署Java项目

【工具】Docker安装Jenkins并部署Java项目 文章目录 【工具】Docker安装Jenkins并部署Java项目1. 前置条件2. 安装3. 创建项目3.1 配置Maven3.2 构建项目3.3 自动部署 1. 前置条件 准备一台云服务器或本地虚拟机,保证必须要java环境,一键安装jdk&#x…

ADuM1201可使用π121U31间接替换π122U31直接替换

ADuM1201可使用π121U31间接替换π122U31直接替换 一般低速隔离通信150Kbps电路可使用π121U31,价格优势较大。速度快的有其它型号可达10M,200M,600M。 本文主要介绍ADUM1201,替换芯片π121U31简单资料请访问下行链接 只要0.74元的双通道数字隔离器,1T1…

Unity实现简单的第一人称控制

先看效果 实现方式 1.首先创建一个脚本 2.编辑脚本内容 付上脚本代码 private float RotationX 0;public float speed 2f;//移动速度// Use this for initializationvoid Start(){Cursor.lockState CursorLockMode.Locked;//锁定鼠标到中心点Cursor.visible false;//隐藏鼠…

OceanBase开发者大会实录-李楠:4条路径+6大方案,关键业务系统数据库的升级之路

本文来自2024 OceanBase开发者大会,OceanBase 金融与政企事业部解决方案总监李楠的演讲实录 ——《关键业务系统分布式数据库升级路线选择和技术演进之路》。完整视频回看,请点击这里>> 大家好,我是 OceanBase 金融与政企事业部…

AI盒子在智慧加油站的应用

方案背景 为规范加油站作业,保障人民生命财产安全,《加油站作业安全规范》(AQ 3010-2007)中第五条规定:卸油作业基本要求,明确防静电、防雷电、防火、人员值守、禁止其他车辆及非工作人员进入卸油区。 痛点…

初识java——javaSE(8)异常

文章目录 一 异常的概念与体系结构1.1 什么是异常?1.2 异常的体系结构!1.3 编译时异常与运行时异常与Error编译时异常:异常声明:throws关键字 运行时异常:什么是Error? 二 处理异常2.1 异常的抛出:throw(注…

前端从零到一开发vscode插件并发布到插件市场

前端从零到一开发vscode插件并发布到插件市场 背景目标成果展示一条龙实现过程安装插件脚手架和工具创建项目运行调试打包第一次打包前的必要操作 发布第一次发布前账号准备注册Azure DevOps发布账号-获取token注册vscode开发者账号终端登录vsce 发布方式2-手动上传插件 进阶开…

社区来稿|眼手交互能定义下一代人机交互范式吗?

以下文章来源于XR交互技术观察 ,作者Eis4TY 前面的话: 推荐一篇来自 Rokid 产品经理 Eis4TY 的文章。文章探讨了眼手交互技术的原理、应用现状以及未来的发展趋势。作者提出:「在 XR 设备上,眼手交互不是最终答案,而…