[求助]求助求助
<FONT size=2>clear all;<BR>k=0.5; % 设置嵌入强度<BR>blocksize=8; % 设置块的大小<BR>midband=[0,0,0,1,1,1,1,0; % 定义DCT中频系数<BR> 0,0,1,1,1,1,0,0;<BR> 0,1,1,1,1,0,0,0;<BR> 1,1,1,1,0,0,0,0;<BR> 1,1,1,0,0,0,0,0;<BR> 1,1,0,0,0,0,0,0;<BR> 1,0,0,0,0,0,0,0;<BR> 0,0,0,0,0,0,0,0 ];<BR><BR>% 读入原始图像<BR>file_name='lena.bmp';<BR>cover_object=double(imread(file_name));<BR>% 原始图像的行数与列数<BR>Mc=size(cover_object,1); %原图的行数<BR>Nc=size(cover_object,2); %原图的列数<BR>c=Mc/8;d=Nc/8;m=c*d; %计算图象划分的图象块<BR>% 确定可嵌入的最大信息量<BR>max_message=Mc*Nc*22/(blocksize^2);<BR>% 产生水印信息<BR>x=-1:0.01:1;<BR>%水印图像的行数与列数<BR>Nm=size(x,2); %水印序列的个数<BR><BR>figure(1)<BR>plot(x);<BR>title('水印');<BR><BR>% 检查水印信息是否过大<BR>if (length(Nm) > max_message)<BR>error('水印太大')<BR>end<BR><BR>n=Nm/22; <BR>n1=uint8(Nm/22); <BR>if(n>n1)<BR> n=n1+1;<BR>else<BR> n=n1;<BR>end %计算要嵌入的块数<BR>%计算宿主图象每一块的方差<BR>xx=1;<BR>for j=1:c<BR> for i=1:d<BR> qw(xx)=1/64*sum(sum(cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8))); %图像块的期望<BR> fc(xx)=1/64*sum(sum((cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8)-qw(xx)).^2)); %图像块的方差<BR> xx=xx+1;<BR> end<BR>end<BR>A=sort(fc); %方差从小到大排序<BR>%选取方差最大的前n块<BR>fc_o=ones(1,m);<BR>for g=m-n+1:m<BR> for h=1:m<BR> if A(g)==fc(h)<BR> fc_o(h)=0; %如果是方差较大的前n块则fc_o设为0,表示可以嵌入水印<BR> h=m;<BR> end<BR> end<BR>end<BR>运行之后出现<BR>??? Error using ==> colon<BR>Colon operands must be in range of the data type.<BR>为什么说冒号运算要在数据范围之内?<BR>改成下面的又可以了,这是为什么?<BR>clear all;<BR>k=0.5; % 设置嵌入强度<BR>blocksize=8; % 设置块的大小<BR>midband=[0,0,0,1,1,1,1,0; % 定义DCT中频系数<BR> 0,0,1,1,1,1,0,0;<BR> 0,1,1,1,1,0,0,0;<BR> 1,1,1,1,0,0,0,0;<BR> 1,1,1,0,0,0,0,0;<BR> 1,1,0,0,0,0,0,0;<BR> 1,0,0,0,0,0,0,0;<BR> 0,0,0,0,0,0,0,0 ];<BR> <BR>% 读入原始图像<BR>file_name='lena.bmp';<BR>cover_object=double(imread(file_name));<BR>% 原始图像的行数与列数<BR>Mc=size(cover_object,1); %原图的行数<BR>Nc=size(cover_object,2); %原图的列数<BR>c=Mc/8;d=Nc/8;m=c*d; %计算图象划分的图象块<BR>% 确定可嵌入的最大信息量<BR>max_message=Mc*Nc*22/(blocksize^2);<BR>% 产生水印信息<BR>x=-1:0.01:1;<BR>%水印图像的行数与列数<BR>Nm=size(x,2); %水印序列的个数<BR>figure(1)<BR>plot(x);<BR>title('水印');<BR>% 检查水印信息是否过大<BR>if (length(Nm) > max_message)<BR>error('水印太大')<BR>end<BR>n=Nm/22; <BR>n1=uint8(Nm/22); <BR>if(n>n1)<BR> n=n1+1;<BR>else<BR> n=n1;<BR>end %计算要嵌入的块数<BR>%计算宿主图象每一块的方差<BR>xx=1;<BR>for j=1:c<BR> for i=1:d<BR> qw(xx)=1/64*sum(sum(cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8))); %图像块的期望<BR> fc(xx)=1/64*sum(sum((cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8)-qw(xx)).^2)); %图像块的方差<BR> xx=xx+1;<BR> end<BR>end<BR>A=sort(fc); %方差从小到大排序<BR>%选取方差最大的前n块<BR>fc_o=ones(1,m);<BR>for g=1015:1024<BR> for h=1:1024<BR> if A(g)==fc(h)<BR> fc_o(h)=0; %如果是方差较大的前n块则fc_o设为0,表示可以嵌入水印<BR> h=m;<BR> end<BR> end<BR>end</FONT> *** 作者被禁止或删除 内容自动屏蔽 ***页:
[1]
