clc
clear all
k = 20;
block_size = 8;
DCT_coef = [0,0,0,1,1,1,1,0;
0,0,1,1,1,1,0,0;
0,1,1,1,1,0,0,0;
1,1,1,1,0,0,0,0;
1,1,1,0,0,0,0,0;
1,1,0,0,0,0,0,0;
1,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0];
orig_image = double(imread('woman2.jpg'));%原始图像
orig_image_show = orig_image;%用于显示原图
[Hc,Wc] = size(orig_image);
c = Hc/8;
d = Wc/8;
m = c*d;% 将原图分为m个8*8块
watermark = double(imread('cmc.png'));%水印图像,白色为目标
watermark_show = watermark;%用于显示水印
[Hm,Wm] = size(watermark);%水印尺寸
n = Hm*Wm;%水印图像总像素点n
%reshape将水印按列重组为一维向量
%round将序列四舍五入,通过除以256将watermark转为0(背景)、1(目标)二值
watermark = round(watermark./256);
watermark = reshape(watermark,1,Hm*Wm);
xx = 1;
mean = zeros(1,c*d);%预先分配内存
variance = mean;%预先分配内存
%求方差
for j = 1:c
for i = 1:d
mean(xx)=1/64*sum(sum(orig_image(((1+(j-1)*8):j*8),((1+(i-1)*8):i*8)))); variance(xx)=1/64*sum(sum((orig_image(1+(j-1)*8:j*8,1+(i-1)*8:i*8)-mean(xx)).^2));
xx = xx+1;
end
end
%将方差升序排列存于A,长度为c*d,即子块数m
A = sort(variance); % 16506
A = fliplr(A);%最终降序排列
%取出方差最大的前n块,长度为n,即水印像素数
B = A(1:n);
%标记水印信息到方差最大的前n块
variance_o = zeros(1,c*d);
for g = 1:n
for h = 1:c*d
if B(g) == variance(h)
variance_o(h) = watermark(g);
h = c*d;
end
end
end
watermark_vector = variance_o;
watermarked_image = orig_image;%准备嵌入的图像
%设置MATLAB随机数生成器状态J,作为系统秘钥K
%MATLAB只要知道初始状态,就确定唯一的伪随机序列
rand('state',7);
%根据当前的随机数生成器状态,生成0、1的伪随机序列,长度为22
%用于将水印置乱,提升鲁棒性
pn_sequence_zero = round(rand(1,sum(sum(DCT_coef))));
%嵌入水印
x=1;
y=1;
for kk=1:m %一共m个子块
%分块DCT变换
dct_block = dct2(orig_image(y:(y+block_size-1),x:(x+block_size-1)));
%纹理大并且被标示的水印信息为1(目标)的块在DCT中频系数嵌入伪随机序列
zz=1;
if watermark_vector(kk)==1;
for ii=1:block_size
for jj=1:block_size
if (DCT_coef(jj,ii)==1)
dct_block(jj,ii)=dct_block(jj,ii)+pn_sequence_zero(zz)*k;
zz=zz+1;
end
end
end
end
%分块DCT逆变换
watermarked_image(y:(y+block_size-1),x:(x+block_size-1))=idct2(dct_block);
if (x+block_size)>Wc
x=1;
if(y+block_size)>Hc
y=1
else
y=y+block_size;
end
else
x=x+block_size;
end
end
watermarked_image_int=uint8(watermarked_image);
%生成并输出嵌入水印后的图像
imwrite(watermarked_image_int,'dct2_A.jpg','jpg');
%显示嵌入水印后的图像
figure(1);
subplot(131)
imshow(orig_image_show,[])
xlabel('原图像');
subplot(132)
imshow(watermark_show,[]);
xlabel('水印图像')
subplot(133)
imshow(watermarked_image_int,[]);
xlabel('嵌入水印后的图像')
disp('水印图像PSNR');
myPSNR=func_PSNR(watermarked_image_int,orig_image_show)
disp('对含水印图像进行JPEG压缩');
imwrite(watermarked_image_int,'JPEG_attack.jpg','jpeg','Quality',45); %最后的这个参数为压缩强度,其值越大压缩程度越小,提取出的水印效果越好
ImgWm=imread('JPEG_attack.jpg'); %本次实验加噪强度调节范围为30:5:60值,其中强度为49、50、51的地方有畸变
figure(2);
subplot(131)
imshow(orig_image_show,[])
xlabel('原图像');
subplot(132)
imshow(watermarked_image_int,[]);
xlabel('嵌入水印后的图像')
subplot(133)
imshow(ImgWm,[]);
xlabel('进行JPEG压缩后的图片')
disp('对含水印图像进行JPEG压缩PSNR');
myPSNR=func_PSNR(ImgWm,orig_image_show)
disp('对含水印图像加高斯噪声');
ImgWm=imnoise(ImgWm,'gaussian', 0, 0.001); %对含水印图像加高斯噪声
disp('对含水印图像加高斯噪声PSNR');
myPSNR=func_PSNR(ImgWm,orig_image_show)
figure(3);
subplot(131)
imshow(orig_image_show,[])
xlabel('原图像');
subplot(132)
imshow(watermarked_image_int,[]);
xlabel('嵌入水印后的图像')
subplot(133)
imshow(ImgWm,[]);
xlabel('加高斯噪声后的图片')
disp('对含水印图像加椒盐噪声');
ImgWm=imnoise(ImgWm,'salt & pepper', 0.001); %对含水印图像加椒盐噪声
disp('对含水印图像加椒盐噪声PSNR');
myPSNR=func_PSNR(ImgWm,orig_image_show)
figure(4);
subplot(131)
imshow(orig_image_show,[])
xlabel('原图像');
subplot(132)
imshow(watermarked_image_int,[]);
xlabel('嵌入水印后的图像')
subplot(133)
imshow(ImgWm,[]);
xlabel('加椒盐噪声后的图片')
shuiyin.rar_477_little_watermark 水印检测和提取
版权申诉
98 浏览量
2022-09-21
22:07:43
上传
评论
收藏 601KB RAR 举报
alvarocfc
- 粉丝: 109
- 资源: 1万+
最新资源
- 本科毕业设计基于C# wpf人脸识别的考勤系统的设计与实现源码.zip
- 基于Ruoyi+uniapp实现学生考勤系统 学生考勤源码+项目说明.zip
- feae6bc968ca68a099455d8b8a8dea35
- 基于Pytorch训练CIRAR10上分类算法.zip
- Pytorch-pytorch深度学习教程之Tensorboard.zip
- 基于C++和Python开发yolov8-face作为人脸检测器dlib作为人脸识别器的人脸考勤系统源码+项目说明.zip
- Pytorch-pytorch深度学习教程之变分自动编码器.zip
- Pytorch-pytorch深度学习教程之神经风格迁移.zip
- Pytorch-pytorch深度学习教程之深度残差网络.zip
- Pytorch-pytorch深度学习教程之循环神经网络.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0