用matlab写一段dct算法的嵌入和提取以及攻击程序
时间: 2024-01-08 10:04:07 浏览: 81
基于Matlab实现DWT算法彩色图像实现嵌入二值水印包含嵌入提取攻击(源码+图片+课题报告).rar
5星 · 资源好评率100%
好的,以下是基于matlab的dct算法的嵌入和提取以及攻击的程序实现:
嵌入程序:
```matlab
% 加载原始图像
img = imread('lena.jpg');
% 将原始图像转换为灰度图像
img_gray = rgb2gray(img);
% 对灰度图像进行离散余弦变换
dct_img = dct2(img_gray);
% 嵌入信息
msg = 'Hello World';
msg_bin = dec2bin(msg, 8);
msg_len = length(msg_bin);
dct_len = length(dct_img(:));
if dct_len < msg_len
error('The message is too long to embed!');
end
dct_msg = dct_img(:);
dct_msg(1:msg_len) = bitset(dct_msg(1:msg_len), 1, msg_bin(:));
% 对修改后的DCT系数进行反变换
img_dct = reshape(dct_msg, size(dct_img));
img_embedded = idct2(img_dct);
% 显示嵌入信息后的图像
imshow(uint8(img_embedded));
```
提取程序:
```matlab
% 加载嵌入信息后的图像
img_embedded = imread('lena_embedded.jpg');
% 对嵌入信息后的图像进行离散余弦变换
dct_img = dct2(img_embedded);
% 提取信息
dct_msg = dct_img(:);
msg_len = 64;
msg_bin = char(bitget(dct_msg(1:msg_len), 1) + '0');
msg = char(bin2dec(reshape(msg_bin, 8, [])'));
% 显示提取出的信息
disp(msg);
```
攻击程序:
```matlab
% 加载嵌入信息后的图像
img_embedded = imread('lena_embedded.jpg');
% 对嵌入信息后的图像进行离散余弦变换
dct_img = dct2(img_embedded);
% 检测图像是否被修改过
dct_img_orig = dct2(rgb2gray(imread('lena.jpg')));
diff = abs(dct_img - dct_img_orig);
if max(diff(:)) > 10
fprintf('The image has been modified!\n');
% 提取信息
dct_msg = dct_img(:);
msg_len = 64;
msg_bin = char(bitget(dct_msg(1:msg_len), 1) + '0');
msg = char(bin2dec(reshape(msg_bin, 8, [])'));
% 显示提取出的信息
disp(msg);
else
fprintf('The image has not been modified!\n');
end
```
希望这些程序能够帮助您理解基于matlab的dct算法的嵌入和提取以及攻击的实现方法。
阅读全文