在好例子网,分享、交流、成长!
您当前所在位置:首页MATLAB 开发实例MATLAB语言基础 → DCT数字水印实现

DCT数字水印实现

MATLAB语言基础

下载此实例
  • 开发语言:MATLAB
  • 实例大小:8.40KB
  • 下载次数:11
  • 浏览次数:109
  • 发布时间:2021-04-24
  • 实例类别:MATLAB语言基础
  • 发 布 人:人生如梦似幻
  • 文件格式:.m
  • 所需积分:2
 相关标签: DCT变换 数字图像处理 水印

实例介绍

【实例简介】把原始图像加入数字水印
【实例截图】
【核心代码】clear 
M =512;%原图像长度
N =64;%水印图像长度
K =8;%图像分块大小
I=zeros(M,M);%创建一个零矩阵,用于存放载体图像
J=zeros(N,N); %创建一个零矩阵,用于存放水印图像
BLOCK=zeros(K,K);%创建一个零矩阵,用于存放图像分块
%显示水印图像
%显示原图像
subplot(3,3,1);
I=imread('lena.bmp');
figure(1)
imshow(I);
title('原始公开图像');
%显示水印图像
iTimes=50;     %置乱次数
% 读入水印图像
file_name='b.png';%(随意换64*64的图片)
message=double(imread(file_name));
%水印图像矩阵的行数与列数
Mm=size(message,1);              
Nm=size(message,2);      
%对水印图像进行arnold置乱
if Mm~=Nm
  error('水印矩阵必须为方阵');
end
if Mm~=64
  error('必须为64*64大小,或者修改置乱次数');
end
tempImg=message; %图像矩阵赋给tempImg
for n=1:iTimes   %置乱次数
  for u=1:Mm   %行循环
    for v=1:Nm %列循环
      temp=tempImg(u,v);
      ax=mod((u-1) (v-1),Mm) 1;   %新像素行位置
      ay=mod((u-1) 2*(v-1),Nm) 1;   %新像素列位置
      outImg(ax,ay)=temp;
    end
  end
tempImg=outImg;
end
% 显示水印,嵌入水印图像与原始图像
subplot(3,3,2);
figure(1)
imshow(message,[]);
title('原始水印');
subplot(3,3,3)
figure(1)
imshow(outImg,[]);
title('置乱水印');
%水印嵌入
for p=1:N%水印图像行循环
for q=1:N%水印图像列循环
x=(p-1)*K 1; %x为载体图像行坐标
y=(q-1)*K 1; %y为载体图像列坐标
BLOCK=I(x:x K-1,y:y K-1); %BLOCK为载体图像I的分块,分块大小为K*K,
%初始值为I(0:K-1,0:K-1)
BLOCK=dct2(BLOCK);%对BLOCK进行二维DCT变换,得到新的BLOCK即%DCT系数矩阵BLOCK
if J(p,q)==0%如果水印图像的第(p,q)个像素为0
a=-1;%嵌入参数为-1
else
a=1; %若如果水印图像的第(p,q)个像素为1嵌入参数为1
end
BLOCK(1,1)=BLOCK(1,1)*(1 a*0.1); %对应载体图像的分块的DCT系数矩阵
BLOCK=idct2(BLOCK);%对DCT系数矩阵进行反变换,得到嵌入水印后的载体
I(x:x K-1,y:y K-1)=BLOCK;%用嵌入水印后的图像分块BLOCK代替载体图像的对应分块
end
end
%显示嵌入水印后的图像
subplot(3,3,4);
figure(1)
imshow(I);
title('嵌入水印后的图像');
imwrite(I,'watermarked.bmp');
%从嵌入水印的图像中提取水印
I=imread('lena.bmp');
Q=imread('watermarked.bmp');
Q=imnoise(Q,'gaussian',0,0.001);
subplot(3,3,5);
figure(1)
imshow(Q,[]);
title('加入高斯噪声');
for p=1:N
for q=1:N
x=(p-1)*K 1;
y=(q-1)*K 1;
BLOCK1 =I(x:x K-1,y:y K-1);%赋给BLOCK1元素
BLOCK2 =Q(x:x K-1,y:y K-1);%赋给BLOCK2元素
BLOCK1=dct2(BLOCK1);
BLOCK2=dct2(BLOCK2);
a = BLOCK2(1,1)/BLOCK1(1,1)-1;
if a<0
W(p,q)=0;
else
W(p,q)=1;
end
end
end
% arnold反置乱
message_arnold=tempImg;
iTimes1=48-iTimes;
%置乱后水印图像矩阵的行数与列数
Mo=size(outImg,1);              
No=size(outImg,2);     
for n=1:iTimes1 % 次数
  for u=1:Mo
    for v=1:No
      temp1=tempImg(u,v);
      bx=mod((u-1) (v-1),Mo) 1;
      by=mod((u-1) 2*(v-1),No) 1;
      outImg1(bx,by)=temp1;
    end
  end
tempImg=outImg1;
end
% 显示反置乱后水印
figure(1)
subplot(3,3,6);
imshow(message_arnold,[]);
title('提取的置乱水印');
subplot(3,3,7);
figure(1)
imshow(message,[]);
title('反置乱(恢复)水印');

实例下载地址

DCT数字水印实现

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警