在matlab中通过DCT的方法用两个图片作为水印嵌入同一个载体图像的YUV的Y和U层并提取水印的代码
时间: 2023-12-14 08:37:53 浏览: 25
以下是在MATLAB中使用DCT方法嵌入和提取水印的代码示例:
```matlab
%读入载体图像和两个水印图像
carrier_img = imread('carrier.jpg');
watermark_img1 = imread('watermark1.jpg');
watermark_img2 = imread('watermark2.jpg');
%将图像转为YUV格式
YUV_img = rgb2ycbcr(carrier_img);
Y = double(YUV_img(:,:,1)); %提取Y分量
U = double(YUV_img(:,:,2)); %提取U分量
%设置水印参数
alpha = 0.1; %嵌入强度
W1 = double(watermark_img1(:,:,1))/255; %提取水印1
W2 = double(watermark_img2(:,:,1))/255; %提取水印2
%对Y分量进行DCT变换
dct_Y = dct2(Y);
%计算DCT系数阈值
QF = 50; %载体图像的质量因子
Q = zeros(8,8); %量化矩阵
for i = 1:8
for j = 1:8
Q(i,j) = 1 + (i+j-2)*QF/10;
end
end
T = alpha*Q.*dct_Y;
T1 = T.*W1;
T2 = T.*W2;
%将两个水印信息嵌入到Y分量的DCT系数中
dct_Y1 = dct_Y + T1;
dct_Y2 = dct_Y + T2;
%将DCT系数反变换为图像
Y1 = idct2(dct_Y1);
Y2 = idct2(dct_Y2);
%将嵌入两个水印的Y分量和U分量合成为新的YUV图像
YUV_img1 = YUV_img;
YUV_img1(:,:,1) = uint8(Y1);
YUV_img1(:,:,2) = uint8(U);
YUV_img2 = YUV_img;
YUV_img2(:,:,1) = uint8(Y2);
YUV_img2(:,:,2) = uint8(U);
%将新的YUV图像转为RGB格式并保存
watermarked_img1 = ycbcr2rgb(YUV_img1);
watermarked_img2 = ycbcr2rgb(YUV_img2);
imwrite(watermarked_img1, 'watermarked1.jpg');
imwrite(watermarked_img2, 'watermarked2.jpg');
%提取水印
dct_Y1 = dct2(double(YUV_img1(:,:,1)));
dct_Y2 = dct2(double(YUV_img2(:,:,1)));
T1 = dct_Y1 - dct_Y;
T2 = dct_Y2 - dct_Y;
W1_extracted = T1./T;
W2_extracted = T2./T;
```
需要注意的是,该代码只是一个简单的示例,实际应用中需要考虑更多的因素,例如水印的鲁棒性、容错性、安全性等。同时,为了提高水印的嵌入强度,可以使用更复杂的水印嵌入算法,例如基于SVD的水印嵌入算法。