|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
本帖最后由 牛小贱 于 2014-5-16 10:13 编辑
程序代码如下: - clear all;
- iTimes=input('请输入置换次数iTime:'); %置乱次数
- % 读入水印图像
- M=input('请输入图片像素数');
- file_name=input('请输入图片路径file_name:');
- message=double(imread(file_name));
- %水印图像矩阵的行数与列数
- Mm=size(message,1);
- Nm=size(message,2);
- %对水印图像进行arnold置乱
- if Mm~=Nm
- error('水印矩阵必须为方阵');
- end
- if Mm~=M
- error('必须为图片实际大小,或者修改置乱次数');
- 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
- x=1;y=1;
- T=1;m=Mm; %T为要计算的周期
- t=x;x=x+y;y=t+2*y;
- while x~=1&y~=1;
- T=T+1;
- if x>m
- x=mod(x,m);
- end
- if y>m
- y=mod(y,m);
- end
- t=x;x=x+y;y=t+2*y;
- end
- clc
- tempImg=outImg;
- end
- % 显示水印,嵌入水印图像与原始图像
- figure(1)
- subplot(1,3,1);
- imshow(message/255,[]);
- title('原始水印');
- subplot(1,3,2)
- imshow(outImg,[]);
- title('置乱水印');
- % arnold反置乱
- message_arnold=tempImg;
- iTimes1=T-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
- message=outImg1;
- subplot(1,3,3);
- imshow(message,[]);
- title('反置乱(恢复)水印');
- % 显示反置乱后水印
复制代码
|
|