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

目录

    • 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()


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/665036.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

零基础学会asp.net做网站/公众号/小程序之三:实战初体验(简单程序教学)

关注我,持续分享逻辑思维&管理思维&面试题; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导; 博主在互联网大厂深耕近二十年,从一线码农做起,到人工智能公司副总裁。希望把过往经验总结出来&#xff0…

对称二叉树(oj题)

一、题目链接https://leetcode-cn.com/problems/symmetric-tree/ 二、题目思路 给你一个二叉树的根节点 root , 检查它是否轴对称的思路: 1.将该树的左子树和右子树,当做两棵树,调用 判断两棵树是否对称相等的函数 2.判断两颗树是否对称相…

【网络安全】Web安全学习-前言及先导

一、网络安全概述 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因遭到破坏、更改、泄露,系统能连续可靠的正常运行,网络服务不中断。简单来说。就是要保障我们的网络环境安全稳定,不被人破…

深入理解linux文件系统与日志分析

深入理解linux文件系统与日志分析 linux文件系统: 文件是存储在硬盘上的,硬盘上的最小存储单位是扇区,每个扇区的大小是512字节。 inode:元信息(文件的属性 权限,创建者,创建日期等等) block…

【Python】解决Python报错:AttributeError: ‘generator‘ object has no attribute ‘xxx‘

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

【核心动画-关键帧动画-CAKeyframeAnimation Objective-C语言】

一、接下来,我们来说这个关键帧动画, 1.我们把之前的基本动画,这一坨代码,备份到test1方法里边, 然后,开始说我们的关键帧动画,步骤都是一样的,都是三大步: // 关键帧动画 // 1.做什么动画 // 2.怎么做动画 // 3.对谁做动画 1)做什么动画 第一,我们现在要创建…

计算机图形学入门04:视图变换

1.MVP变换 将虚拟场景中的模型投影到屏幕上,也就是二维平面上,需要分三个变换。 1.首先需要知道模型的位置,也就是前面提到的基本变换,像缩放、平移,旋转,也称为模型(Model)变换。 2.然后需要知道从…

STM32定时器与PWM对LED灯的控制

文章目录 一、定时器——Timer(一)概念(二)分类(三)功能(四)结构1.模块一——时基单元2.模块二——输出比较模块 二、实验内容(一)标准库点亮LED灯1.实验说明…

99.网络游戏逆向分析与漏洞攻防-ui界面的设计-角色信息显示的界面与功能

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

新型 Meterpreter 后门能够在图片中隐藏恶意代码

据Cyber Security News消息,ANY.RUN 沙盒分析了一种被称为Meterpreter 的新型后门恶意软件,能利用复杂的隐写技术将恶意有效载荷隐藏在看似无害的图片文件中。 基于Meterpreter的攻击从一个包含 PowerShell 脚本的 .NET 可执行文件开始,该脚…

解决VSCode右键没有Open In Default Browser问题

在VSCode进行Web小程序测试时,我们在新建的HTML文件中输入 !会自动生成页面代码骨架,写入内容后,我们想要右键在浏览器中预览。发现右键没有“Open In Default Browser”选项。原因是没有安装插件。 下面是解决方案:首先在VSCode找…

【CSS布局】响应式设计原则以及双飞翼布局圣杯布局

历史小剧场 温体仁未必是奸臣,钱谦益未必是好人,不需要惊讶,历史往往跟你所想的并不一样。英雄可以写成懦夫,能臣可以写成奸臣,史实并不重要,重要的是,谁来写。----《明朝那些事儿》 响应式设计…

【计算机毕设】基于SpringBoot的学生心理咨询评估系统设计与实现 - 源码免费(私信领取)

免费领取源码 | 项目完整可运行 | v:chengn7890 诚招源码校园代理! 1. 研究目的 随着社会的快速发展和竞争压力的增加,学生心理健康问题日益突出。设计和实现一个基于SpringBoot的学生心理咨询评估系统,旨在…

【Seafile】Seafile容器版文件删除后存储空间不释放问题解决

Seafile是一款非常优秀的网盘系统,我们可以根据官方文档,在本地虚拟机研究Seafile免费版的安装和使用,安装建议采用使用docker容器的方式。 不过在使用过程中,刚接触的小伙伴可能会遇到这样的问题: 删除网盘里面的文…

煤矿输送设备无人化运维巡检解决方案

一、煤矿行业目前存在的挑战和难题 煤矿行业面临着复杂的环境,如粉尘、潮湿、高温、高瓦斯等,对巡检设备和人员安全有威胁。并且设备分布广、需要长时间作业,全面巡检难度大、对巡检工作的耐力和持续性要求高。而煤矿输送设备无人化运维巡检…

OAK相机如何将 YOLOv10 模型转换成 blob 格式?

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 Hello,大家好,这里是OAK中国,我是Ashely。 专…

MedSAM 学习笔记(续):训练自定义数据集

1、下载官方权重 官方的预训练权重:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth 下载后保存在:work_dir/SAM/sam_vit_b_01ec64.pth 目录 2、摆放数据集 因为MedSAM 分割模型需要对3D数据集进行切片处理,也就是对nii.gz 数据处理成 npy 格式 …

计算机图形学入门05:投影变换

1.投影变换 上一章已经介绍了投影变换,就是将三维图像投影到二维平面上,而投影变换又分为正交投影(Orthographic Projection)和透视投影(Perspective Projection)。如下图: 正交投影 没有近大远小的现象,无论图形与视点距离是远是…

通过定时器和脉冲控制LED

一、定时器 (一)定时器简介 STM32定时器是STM32微控制器中的重要块,用于生成精确的时间基准。它可以用于测量时间间隔、产生脉冲、实现定时中断等功能。通过配置寄存器,用户可以灵活地控制定时器的工作模式和参数,实现…

Visual Studio Code使用(C++项目新建,运行)

VS Code 直接在官网下载安装。 接下来安装插件,下图是C所需的对应插件 1.新建项目 VS Code下载安装完成后,直接进入欢迎页: 在访达/文件夹中新建一个文件夹,欢迎页点击【打开】,选择刚刚新建的文件夹。点击第一个图…