基于dct的不可见水印matlab代码
时间: 2023-08-18 13:04:20 浏览: 33
以下是一个基于DCT的不可见水印嵌入和提取的MATLAB代码示例:
```matlab
% 嵌入水印
function watermarked_image = embed_watermark(original_image, watermark)
% 将原始图像转换为YCbCr颜色空间
ycbcr_image = rgb2ycbcr(original_image);
% 对Y分量进行DCT变换
dct_image = dct2(ycbcr_image(:,:,1));
% 提取水印信息
watermark = imresize(watermark, [8 8]); % 水印大小与DCT块大小相同
watermark = double(watermark) / 255; % 归一化水印像素值
% 将水印嵌入到DCT系数中的最低频位
alpha = 10; % 控制水印嵌入强度的参数
dct_image(1:8, 1:8) = dct_image(1:8, 1:8) + alpha * watermark;
% 对嵌入水印的DCT系数进行反变换
watermarked_ycbcr_image = ycbcr_image;
watermarked_ycbcr_image(:,:,1) = idct2(dct_image);
% 将图像转回RGB颜色空间
watermarked_image = ycbcr2rgb(watermarked_ycbcr_image);
% 显示原始图像和嵌入水印后的图像
figure;
subplot(1,2,1), imshow(original_image), title('原始图像');
subplot(1,2,2), imshow(watermarked_image), title('嵌入水印后的图像');
end
% 提取水印
function extracted_watermark = extract_watermark(watermarked_image)
% 将水印图像转换为YCbCr颜色空间
ycbcr_image = rgb2ycbcr(watermarked_image);
% 对Y分量进行DCT变换
dct_image = dct2(ycbcr_image(:,:,1));
% 提取嵌入的水印信息
alpha = 10; % 嵌入水印的强度参数
extracted_watermark = (dct_image(1:8, 1:8) - dct_image(1:8, 1:8)) / alpha;
% 将提取的水印信息反归一化
extracted_watermark = uint8(extracted_watermark * 255);
% 显示嵌入水印后的图像和提取的水印
figure;
subplot(1,2,1), imshow(watermarked_image), title('嵌入水印后的图像');
subplot(1,2,2), imshow(extracted_watermark), title('提取的水印');
end
% 主程序
original_image = imread('原始图像.jpg'); % 替换为你的原始图像文件路径
watermark = imread('水印图像.jpg'); % 替换为你的水印图像文件路径
watermarked_image = embed_watermark(original_image, watermark);
extracted_watermark = extract_watermark(watermarked_image);
```
在上述代码中,`embed_watermark`函数用于将水印嵌入到原始图像中,`extract_watermark`函数用于从嵌入水印后的图像中提取水印。你需要将代码中的`原始图像.jpg`和`水印图像.jpg`替换为你的实际图像文件路径。水印图像应与原始图像具有相同的大小。
请注意,以上代码示例仅为演示目的,并未进行错误处理和优化。在实际应用中,你可能需要进行适当的优化和错误处理。