% 定义 MATLAB 函数 setdwtwatermark,用于在载体图像中嵌入经过 Arnold 置乱和 Haar 小波变换处理的数字水印,并计算 PSNR 值
function [Iw, psnr] = setdwtwatermark(I, W, nums, seeds, flag)
% 获取载体图像 I 的数据类型
type = class(I);
% 将载体图像 I 和水印 W 转换为 double 类型(I)和逻辑类型(W)
I = double(I);
W = logical(W);
% 获取载体图像和水印的尺寸
[mI, nI] = size(I);
[mW, nW] = size(W);
% 对载体图像 I 进行两次 Haar 小波分解
[ca1, ch1, cv1, cd1] = dwt2(I, 'haar');
[ca2, ch2, cv2, cd2] = dwt2(ca1, 'haar');
% 如果 flag 为真,则展示载体图像的小波分解结果
if flag
figure('Name', '载体小波分解');
subplot(121);
imagesc([wcodemat(ca1), wcodemat(ch1); wcodemat(cv1), wcodemat(cd2)]);
title('一级小波分解');
subplot(122);
imagesc([wcodemat(ca2), wcodemat(ch2); wcodemat(cv2), wcodemat(cd2)]);
title('二级小波分解');
end
% 复制原始水印并应用 Arnold 置乱
Wa = W;
H = [1, 1; 1, 2]^nums;
for i = 1:nW
for j = 1:nW
% 计算新的坐标
idx = mod(H * [i-1; j-1], nW) + 1;
% 在新的位置上设置水印位
Wa(idx(1), idx(2)) = W(i, j);
end
end
% 如果 flag 为真,则展示水印置乱的效果
if flag
figure('Name', '水印置乱效果');
subplot(121);
imshow(W);
title('原始水印');
subplot(122);
imshow(Wa);
title(['置乱水印,变换次数=', num2str(nums)]);
end
% 初始化用于存储修改过的小波系数变量
ca2w = ca2;
% 设置随机数生成器种子
rng(seeds);
% 生成随机排列索引并对小波系数进行置乱
idx = randperm(numel(ca2), numel(Wa));
for i = 1:numel(Wa)
% 获取随机排列的小波系数
c = ca2(idx(i));
% 计算对应的水印位置及扰动后的值
z = mod(c, nW);
if Wa(i)
if z < nW/4
f = c - nW/4 - z;
else
f = c + nW*3/4 - z;
end
else
if z < nW*3/4
f = c + nW/4 - z;
else
f = c + nW*5/4 - z;
end
end
% 更新小波系数
ca2w(idx(i)) = f;
end
% 对扰动后的小波系数进行逆变换得到嵌入水印后的高频部分
ca1w = idwt2(ca2w, ch2, cv2, cd2, 'haar');
% 对高频部分再进行逆变换得到完整的嵌入水印后的图像
Iw = idwt2(ca1w, ch1, cv1, cd1, 'haar');
% 截取原始尺寸范围内的图像
Iw = Iw(1:mI, 1:nI);
% 计算像素总数和最大像素值
mn = numel(I);
Imax = max(I(:));
% 计算 PSNR 值
psnr = 10 * log10(mn * Imax^2 / sum((I(:) - Iw(:)).^2));
% 将处理后的图像转换回原数据类型
I = cast(I, type);
Iw = cast(Iw, type);
% 如果 flag 为真,则展示原始图像和嵌入水印后的图像
if flag
figure('Name', '嵌入水印的图像');
subplot(121);
imshow(I);
title('原始图像');
subplot(122);
imshow(Iw);
title(['添加水印,PSNR=', num2str(psnr)]);
end
fpga和matlab
- 粉丝: 17w+
- 资源: 2639
最新资源
- manim-manim
- Bin2Dec-App-十进制转换二进制
- bootplus-图像加解密 ※
- manim-manim
- CSharp编程-十进制转换二进制
- manim-manim
- 基于用户行为的社交网络推荐算法研究与实现项目源码(高分毕设)
- 网络管理实训作业截图规范与要求
- MATLAB和Simulink联合求解与可视化二阶常微分方程任务指导
- 基于SpringBoot+Vue的医疗服务系统源码+数据库(高分毕业设计项目)
- 动态开辟三角形蛇形数组.c
- cms识别,cms识别.xlsx
- 火山编程软件和python共享内存通信
- Python数学动画引擎manim的应用与特性
- 详解十进制转二进制的方法与Python实现
- 基于Android Studio的一个医疗系统-安卓期末大作业源码+全部资料(高分项目)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈