请将下列代码改成二维Arnold置乱提取:blocks = mat2cell(P_watermarked, blockSize * ones(1, floor(height/blockSize)), blockSize * ones(1, floor(width/blockSize))); B = zeros(0); for k = 1:numBlocks block = double(blocks{k}); DCT_block = dct2(block); % DCT变换 B(k) = DCT_block(I(k)); end B = reshape(B, 64, []); [Uw, Sw, Vw] = svd(B); Fw = U1*Sw*V1'; Ww = (Fw - S)/alpha; Ww = rearnold(Ww, 1, 1, key1); imshow(Ww,[]),title('提取水印') % 性能测试 psnrValue = psnr(double(P), P_watermarked); nc = max(max(normxcorr2(Ww, W))); disp(['PSNR: ', num2str(psnrValue)]); disp(['Normalized Correlation (NC): ', num2str(nc)]);
时间: 2023-09-06 11:08:43 浏览: 89
首先将代码中的一维Arnold置乱函数 "rearnold" 改成二维的 "rearnold2",然后在提取部分添加二维Arnold置乱的代码即可:
blocks = mat2cell(P_watermarked, blockSize * ones(1, floor(height/blockSize)), blockSize * ones(1, floor(width/blockSize)));
B = zeros(0);
for k = 1:numBlocks
block = double(blocks{k});
DCT_block = dct2(block); % DCT变换
B(k) = DCT_block(I(k));
end
B = reshape(B, 64, []);
[Uw, Sw, Vw] = svd(B);
Fw = U1*Sw*V1';
Ww = (Fw - S)/alpha;
Ww = rearnold2(Ww, key1); % 添加二维Arnold置乱的代码
imshow(Ww,[]),title('提取水印')
% 性能测试
psnrValue = psnr(double(P), P_watermarked);
nc = max(max(normxcorr2(Ww, W)));
disp(['PSNR: ', num2str(psnrValue)]);
disp(['Normalized Correlation (NC): ', num2str(nc)]);
相关问题
请将下列代码改成二维Arnold置乱:W = im2double(rgb2gray(imread('MTXX3.bmp'))); W = imbinarize(W); key1 = 28; % W_permuted = arnold(W, 1, 1, key1);
下面是将该段代码改为二维Arnold置乱的示例代码:
```matlab
% 读入图片并转为二值图像
W = im2double(rgb2gray(imread('MTXX3.bmp')));
W = imbinarize(W);
% 设定参数
N = size(W, 1); % 图像大小
iter = 10; % 迭代次数
a = 2; % 置乱矩阵参数
key1 = 28; % 置乱矩阵迭代次数
% Arnold置乱
for k = 1:key1
for i = 1:N
for j = 1:N
% 计算置乱矩阵
y = mod([a 1; 1 a]*[i-1; j-1], N) + 1;
% 根据置乱矩阵进行置乱
W(i,j) = W(y(1), y(2));
end
end
end
% 绘制原始图像和置乱后的图像
subplot(1,2,1);
imshow(im2uint8(W));
title('原始图像');
subplot(1,2,2);
imshow(im2uint8(W_permuted));
title('Arnold置乱后的图像');
```
在这个代码中,我们首先读入了一张图片并转换成二值图像 W,然后根据二维Arnold置乱的算法生成置乱矩阵并进行迭代。在进行迭代的过程中,我们使用了一个参数 a,控制置乱矩阵的形状,以及一个参数 key1,表示置乱矩阵的迭代次数。最后,我们将原始图像 W 根据置乱矩阵进行置乱,得到置乱后的图像 W_permuted,并将它们绘制出来进行比较。注意,由于这是一个二维图像,我们使用了两层嵌套的循环来遍历所有像素点,计算置乱矩阵并进行置乱。
二维Arnold置乱提取代码,matlab
以下是二维Arnold置乱提取的matlab代码:
function [W] = rearnold2(Ww, key)
% Ww: 要进行二维Arnold置乱的矩阵
% key: Arnold置乱的迭代次数
% W: 经过二维Arnold置乱后的矩阵
s = size(Ww);
N = s(1); M = s(2);
W = zeros(N, M);
% 构造Arnold置乱矩阵
A = [1 1; 1 2];
for i = 1:key
A = mod(A * [1 1; 1 2], N);
end
for x = 1:N
for y = 1:M
pos = mod(A * [x; y], N) + 1;
W(pos(1), pos(2)) = Ww(x, y);
end
end
end
使用方法:
将要进行二维Arnold置乱的矩阵作为第一个参数传入rearnold2函数,将Arnold置乱的迭代次数作为第二个参数传入函数。函数将返回经过二维Arnold置乱后的矩阵。
阅读全文
相关推荐
















