yanxue0212 发表于 2014-5-13 21:43

怎么给以下程序中加上两种噪声,最后还能恢复出原图像

本帖最后由 牛小贱 于 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('反置乱(恢复)水印');
% 显示反置乱后水印




chybeyond 发表于 2014-5-13 22:04

图像加噪声可参考imnoise

梦夕丶 发表于 2014-5-15 22:54

逗 b,自己学吧!这么简单的问题也好意思问,你好意思问我都不好意思回答!{:{33}:}
页: [1]
查看完整版本: 怎么给以下程序中加上两种噪声,最后还能恢复出原图像