图像水印MATLAB实验

news2024/11/29 9:35:15

文章目录

      • 一、实验目的
      • 二、实验内容
        • 1. 简单的可见水印嵌入实验
        • 2. 不可见脆弱水印实验
        • 3. 不可见鲁棒水印实验

一、实验目的

  1. 了解数字图像水印技术的基本原理、分类和应用。
  2. 掌握简单的可见水印和不可见水印的嵌入方法。
  3. 实现一种基于DCT的不可见鲁棒水印,并进行水印鲁棒性测试。

二、实验内容

1. 简单的可见水印嵌入实验

图1给出了原始Lena图像和水印图像。请完成以下实验:
(1) 根据教材P445例8.29,将水印图像嵌入Lena图像(图像嵌入位置不唯一),嵌入强度 α = 3 \alpha =3 α=3。给出嵌入水印后的图像以及原始图像与嵌入水印图像的差值图像。(为更好地展示差值图像,在输出时可用函数imshow(filename, []))
(2) 请分别给出嵌入强度 α \alpha α 为0、0.5 和 1 时的含水印图像,并分析 α \alpha α 的改变对水印图像以及含水印图像主观质量的影响。


(1)

clear all;close all;clc
f = imread('1.Lena图像.tif');
wat_mark = imread('1.水印图像.tif');
a = 0.3;
pic_ori = f(200:251, 103:255); 
water_mark_pic = (1-a).*pic_ori + a.*wat_mark;
f_water_marked = f;
f_water_marked(200:251, 103:255) = water_mark_pic;
figure;imshow(f_water_marked);

在这里插入图片描述

(2)

dif=double(f)-double(f_water_marked);
figure;imshow(dif,[])%将差值归一化到(0~255)之间

%%

a=[0,0.5,1];

for i=1:3
    alpha = a(i);
    pic_ori = f(200:251, 103:255);
    water_mark_pic = (1-alpha).*pic_ori + alpha.*wat_mark;
    f_water_marked = f;
    f_water_marked(200:251, 103:255) = water_mark_pic;
    subplot(1,3,i);imshow(f_water_marked);
end

在这里插入图片描述

2. 不可见脆弱水印实验

(1) 请根据式(1)将水印图像(图1(b))嵌入到Lena图像(图1(a))的最低两位有效位(Least Significant Bit, LSB)中,并给出嵌入水印后的图像。(图像嵌入位置不唯一)
f w = 4 ⌊ f 4 ⌋ + ⌊ w 64 ⌋ {{f}_{w}}=4\left\lfloor \frac{f}{4} \right\rfloor +\left\lfloor \frac{w}{64} \right\rfloor fw=44f+64w

其中, f f f 为原始图像, w w w 为水印图像, f w f_w fw 为嵌入水印后的图像, 为下取整操作(可用函数floor)。

(2) 从含水印图像 f w f_w fw 中提取水印图像 w w w

(3) 对含水印图像进行 JPEG 压缩(质量因子Q=80),以测试水印的脆弱性。给出压缩后的含水印图像以及提取的水印图像,并根据教材P389式(8.10)计算压缩后的含水印图像与原始含水印图像的均方根误差 e r m s e_{\mathrm{rms}} erms (Root Mean Square Error, RMSE) 。

(1)

%在最低两位有效位嵌入水印

clear all;close all;clc
f = imread('1.Lena图像.tif');
m = imread('1.水印图像.tif');
f=double(f);%不使用double类型提取的水印效果较差
m=double(m);
W = f(204:255, 103:255); 
w=4.*floor(W./4)+floor(m./64);
fm = f;
fm(204:255, 103:255) = w;
fm=uint8(fm);
figure;imshow(fm)

(2)

%尝试提取水印
wat_mask=mod(fm,4);
wat_mask=wat_mask*64;
wat_mask=uint8(wat_mask);
figure;imshow(wat_mask,[]);

(3)

%对含水印图像进行JPEG压缩(质量因子Q=80)

imwrite(fm, '1.压缩图像.jpg', 'quality', 80)
c = imread('1.压缩图像.jpg'); 
C = double(c);


wat_mark_ext=c(204:255, 103:255);%水印提取

%次序从右向左排列,最右边的二进制位称为“最低有效位”
for i = 3:8
    wat_mark_ext = bitset(wat_mark_ext, i, 0); 
end

figure, imshow(wat_mark_ext,[])

%均方根
Fm = double(fm);%原始含水印图像
[r,c]=size(C);
erms=sqrt(sum(sum((Fm-C).^2))/(r*c))

erms =
2.3480

在这里插入图片描述

3. 不可见鲁棒水印实验

图2给出了原始Lena图像。请完成以下实验:
(1) 根据教材P447例8.30,实现基于DCT的不可见鲁棒水印。将一组伪随机序列作为水印,嵌入到图像较大的DCT系数中,获得含水印图像。嵌入强度 α = 0.1 \alpha=0.1 α=0.1,伪随机序列长度 k = 1000 k=1000 k=1000
(2) 从含水印图像中提取水印,并计算原始水印与提取水印的相关系数 γ \gamma γ,利用二值检测判决(教材P449式(8.73))检测水印是否存在(阈值T设为0.8230)。
(3) 对含水印图像进行攻击测试,包括JPEG压缩(质量因子Q=80和20)、中值滤波(窗口大小3×3)、高斯噪声(均值0.1、方差0.001)、直方图均衡和图像旋转( 0. 5 ∘ 0.5^\circ 0.5)。给出各种攻击下的含水印图像并计算原始水印与提取水印的相关系数 。

在这里插入图片描述

(1)

%将一组伪随机序列作为水印,嵌入到图像较大的DCT系数中,
% 获得含水印图像。嵌入强度0.1
% clear all;close all;clc
f = imread('3.Lena图像.tif');

f = double(f);
[r,c]=size(f);
fdct = dct2(f);
%对于固定的key,不是说从此以后产生的随机数都是相同的,
%而是在相同的key下,第一次调用rand产生的结果是相同的。
randn('seed', 0);
K = randn(1, 1000);
%将所有 DCT 系数变为一维行向量,然后按照幅值进行降序排序
fdct=reshape(fdct, 1, r*c);

[D,I] = sort(fdct,'descend');

%嵌入强度,选择长度为1000的伪随机序列作为无意义水印嵌入到图像中
a=0.1;
for i = 1:1000
    fdct(I(i)) = D(i)*(1+a*K(i));
end
%还原
fdct = reshape(fdct, r,c);

f_watermarked=idct2(fdct);
f_watermarked=uint8(f_watermarked);
figure,imshow(f_watermarked)



%从含水印图像中提取水印
% 并计算原始水印与提取水印的相关系数 gamma

a=0.1;T=0.8230;
w_hat=get_pseudo_random_sequence(f_watermarked,f,a,I);%得到估计的伪随机序列
[gamma,ifwatermarking]=water_extract(w_hat,T);%计算得到相关系数
disp(ifwatermarking);

(2)(3)

%%

%JPEG压缩攻击
imwrite(f_watermarked, '压缩图像.jpg', 'quality', 80);
f_JPEG_compressed =imread('压缩图像.jpg');
w_hat=get_pseudo_random_sequence(f_JPEG_compressed,f,a,I);%得到估计的伪随机序列
[gamma,ifwatermarking]=water_extract(w_hat,T);%计算得到相关系数
disp(ifwatermarking);

imwrite(f_watermarked, '压缩图像.jpg', 'quality', 20);
f_JPEG_compressed =imread('压缩图像.jpg');
w_hat=get_pseudo_random_sequence(f_JPEG_compressed,f,a,I);%得到估计的伪随机序列
[gamma,ifwatermarking]=water_extract(w_hat,T);%计算得到相关系数
disp(ifwatermarking);

%%
%平均滤波器攻击
% 定义平均核
kernel = ones(5, 5) / 25;
% 对每个通道应用平滑核
f_avg_filtered = imfilter(f_watermarked, kernel, 'replicate');
imshow(f_avg_filtered);
w_hat=get_pseudo_random_sequence(f_avg_filtered,f,a,I);%得到估计的伪随机序列
[gamma,ifwatermarking]=water_extract(w_hat,T);%计算得到相关系数
disp(ifwatermarking);

%%
%高斯噪声攻击,均值为0.1,方差为0.001的噪声
[M,N]=size(f);
gaussian_noise=imnoise2('gaussian',M,N,0.1,0.001);
f_gau_noise=f+gaussian_noise;
w_hat=get_pseudo_random_sequence(f_gau_noise,f,a,I);%得到估计的伪随机序列
[gamma,ifwatermarking]=water_extract(w_hat,T);%计算得到相关系数
disp(ifwatermarking);
%%
%中值滤波器攻击
f_median_filtered= medfilt2(f_watermarked, [3, 3]);
imshow(f_median_filtered);
w_hat=get_pseudo_random_sequence(f_median_filtered,f,a,I);%得到估计的伪随机序列
[gamma,ifwatermarking]=water_extract(w_hat,T);%计算得到相关系数
disp(ifwatermarking);

%%
%直方图均衡攻击
f_histogram_equalization= imadjust(f_watermarked);
imshow(f_histogram_equalization);
w_hat=get_pseudo_random_sequence(f_histogram_equalization,f,a,I);%得到估计的伪随机序列
[gamma,ifwatermarking]=water_extract(w_hat,T);%计算得到相关系数
disp(ifwatermarking);
%%
%图像旋转0.5度攻击
imshow(f_watermarked);
f_rotated=imrotate(f_watermarked,0.5,'bicubic', 'crop');
figure;imshow(f_rotated);
w_hat=get_pseudo_random_sequence(f_rotated,f,a,I);%得到估计的伪随机序列
[gamma,ifwatermarking]=water_extract(w_hat,T);%计算得到相关系数
disp(ifwatermarking);
%%

function w_hat=get_pseudo_random_sequence(f_watermarked,f,a,I)
f_watermarked=double(f_watermarked);
f_watermarked_dct=dct2(f_watermarked);

f_watermarked_dct=reshape(f_watermarked_dct, 1, []);

%根据初始的图像f生成原始的fdct
f = double(f);
[r,c]=size(f);
fdct = dct2(f);
fdct=reshape(fdct, 1, r*c);

w_hat=zeros(1,1000);
for i = 1:1000
    w_hat(i) = (f_watermarked_dct(I(i)) - fdct(I(i))) / (a * fdct(I(i)));
end
end


function [gamma,ifwatermarking] = water_extract(w_hat,T)
randn('seed', 0);
w = randn(1, 1000);
w_avg=mean(w);
w_hat=double(w_hat);
w_hat_avg=mean(w_hat);

X1 = w - w_avg;
Y1 = w_hat - w_hat_avg;
num = sum(X1.*Y1);
deno = sqrt(sum(X1.^2)*sum(Y1.^2));
gamma=num/deno;

if gamma>=T
    ifwatermarking='图像含有水印';
else
    ifwatermarking='图像不含有水印';
end
end

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

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

相关文章

Dubbo 服务端源码深入分析 (7)

目录 1. 前提 2. 认识 Protocol 和 ProxyFactory Protocal ProxyFactory Dubbo服务流程 服务端源码分析 测试代码: Protocal代理的源码 ProxyFactory源码: 获取invoker对象 具体步骤 1. 我们调用的是ProxyFactory的代理对象的getInvoker方法…

Linux线程同步(6)——更高并行性的读写锁

互斥锁或自旋锁要么是加锁状态、要么是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁有 3 种状态:读模式下的加锁状态(以下简称读加锁状态)、写模式下的加锁状态(以下简称写加锁状态)和不加锁状态&…

django视图(request请求response返回值)

一、视图函数介绍 视图就是应用中views.py中定义的函数,称为视图函数 def index(request):return HttpResponse("hello world!") 1、视图的第一个参数必须为HttpRequest对象,还可能包含下参数如通过正则表达式组获取的位置参数、通…

VBA——01篇(入门篇——简单基础语法)

VBA——01篇(入门篇——简单基础语法) 1. 语法格式1.1 简单语法1.2 简单例子 2. 变量2.1 常用数据类型2.2 声明变量的常用方式2.3 简单例子 3. 单元格赋值3.1 直接赋值3.2 拷贝单元格 4. 简单的逻辑语法4.1 简单if4.2 简单for循环4.2.1 简单语法例子4.2.…

基于混合整数二阶锥(MISOCP)的配电网重构(附matlab代码)

参考资料:主动配电网网络分析与运行调控 (sciencereading.cn) 配电网重构是指在满足配电网运行基本约束的前提下,通过改变配电网中一个或多个开关的状态对配电网中一个或多个指标进行优化。通过配电网重构,可以在不增加设备投资的情况下&…

注解实现:判空赋值

工作中的小玩意~~ 流程: 注解实现反射工具类 注解定义及实现 注解定义: Documented Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface CheckParam {String value() default "-1"; }简单解释上述其相关注解…

哈工大2023春计算机组成原理真题回忆

仅供同学参考,严禁用作商业用途 如发现将追究责任 2023-5-14 属鼠经历了计算机组成原理考试 现将本人真题回忆如下:欢迎大家补充,并期待大家一起参与这个开源的项目。 致谢:真诚感谢草履虫同学提供的图片 15个选择部分回忆如下 &#xff1a…

【历史上的今天】4 月 13 日:Damn Small Linux 首次发布;谷歌关闭短网址服务;数学先驱出生

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 4 月 13 日,在 2006 年的今天,盛大文学榕树下网站被民营企业收购;原创文学网站榕树下被民营传媒集团欢乐传媒收购&#xff…

hnust 湖南科技大学 2023 软件测试技术 期中考试 复习资料

前言 写的比较匆忙,重点也不明确,没什么参考价值致谢:ly,zxq重点来源:信安※:补充内容★:重点✦:个人推测考点考试范围:1-9章获取最新版本 题型 判断:10简…

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1)

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1) 我们以HIV蛋白酶-抑制剂复合物为例子,跑Amber动力学模拟 下载1phv 从PBD下载文件:https://www.rcsb.org/ PDB文件预处理 我们以 “protein(water) ligandcomplex” 为例来说一下如何处…

系统设计基本原理-耦合与内聚

耦合 耦合是模块之间的相互独立性(互相连接的紧密程度)的度量,耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型等。 耦合类型 无直接耦合:指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用&…

k8s基础11——安全控制之RBAC用户授权、RBAC用户组授权、SA程序授权

文章目录 一、K8s安全框架1.1 鉴权1.1.1 HTTPS证书认证1.1.2 HTTP Token认证 1.2 授权1.3 准入控制1.4 集群四大角色 二、RBAC给用户授权(TLS)2.1 签发客户端证书2.2 生成kubeconfig授权文件2.2.1 手动生成2.2.2 脚本生成2.2.3 切换操作集群 2.3 定义RBA…

移动应用开发实验-内容提供者-ContentResolver的使用

文章目录 前言读取通讯录信息要求环境 具体实现主页面布局(activity_main.xml)关于RecyclerView库的相关问题添加RecyclerView库操作 解决报错Item布局(info.xml)添加访问权限编写实体类(ContactInfo.java)编写适配器(MyAdapter.java&#xf…

20 散列表的查找

散列表的查找 简介:散列表(也成哈希表)是一种高效的数据结构,他可以在平均复杂度为O(1)的情况下实现查找、插入和删除操作。 哈希表的基本思想是根据关键字的值来计算其应存储的位置。这个计算过程就是通过哈希函数来实现的。 根…

计算机视觉——day 91基于双网络的鲁棒特征高光谱目标检测(偏门且很水啊)

基于双网络的鲁棒特征高光谱目标检测 I. INTRODUCTIONII. 提出的方法A. 总体框架B.训练集构建C. Dual Networks III. EXPERIMENTSIV. 结论 I. INTRODUCTION 用于高光谱目标检测的深度网络训练通常面临样本有限的问题,在极端情况下,可能只有一个目标样本…

黑盒测试方法

1 等价类划分 1.1 定义 等价类划分法是一种典型的,并且是最基础的黑盒测试用例设计方法。采用等价类划分法时,完全不用考虑程序内部结构,设计测试用例的唯一依据是软件需求规格说明书。 所谓等价类,是输入条件的一个子集合&…

kali整体版本更新方法,为啥更新?

玩过kali都知道,如果不更新版本,那么安装某个软件总是有很多依赖版本问题,解决起来的确麻烦,这篇文章彻底解决这些问题。 1,更新源 国外源与国内源的选择 kali默认配置的是国外源,但国外源的下载速度非常慢…

基于容器和Kubernetes的应用无限扩容

基于应用负载动态管理CPU、内存等资源的使用是云原生架构的最佳实践之一,Kubernetes通过资源请求和限制以及HPA/VPA等机制,为云原生应用资源管理提供了很好的支持。原文: Infinite Scaling with Containers and Kubernetes[1] 如果没有足够资源让容器完成…

matlab第八章_Simulink简介

目录 Simulink简介 基本知识 Simulink组成 模块库简介 Simulink系统仿真 Stateflow建模与应用 Stateflow的定义 状态图编辑器 Stateflow流程图 Simulink简介 基本知识 Simulink是实现动态系统建模,仿真和分析的软件包,被广泛应用于线性系统&…

土地报征简介

报征概念: 土地报征是指国家为了人民整体利益出发,根据我国相关法律和法规的要求和流程, 将集体土地性质转化为国有土地性质,并给予被征地的对象给予合理的补偿和安置工作。报征4个价段: 1、组卷阶段 (1&…