部分仿真代码,供参考 % designedbylilizong % lilizong[at]gmaila = imread( ' c:bbb.png ' ); % 读入图像figure,imshow(a),title( ' 原图像 ' ); % 显示图像figure,imhist(a);b = a(:);[m,n] = size(a);k = size(b); % 下述操作可以实现像素的显示c = linspace( 0 , 0 , 256 ); for i = 1 :k for j = 1 : 256 if (b(i) == j)c(j) = c(j) + 1 ;endendend % 以下步骤简单实现读取整个图像的峰值点max = c( 1 );maxi = 0 ; for i = 1 : 256 if (c(i) > max)max = c(i);maxi = i;endendmaxmaxi % 下面步骤实现对各个峰值的读取d = c; % 作为临时操作数组,以不破坏原数组emax = linspace( 0 , 0 , 256 );emaxi = linspace( 0 , 0 , 256 );a = 1 ; for j = 2 : 256 if (d(j) > d(j - 1 ) & d(j) > d(j + 1 ) & d(j) ~= 8888 )emax(a) = d(j);emaxi(a) = j;d(j) = 8888 ;a = a + 1 ; % 开始没有想明白,用额外的循环变量endend % 下面的程序读取四个高峰值,并进行显示fmax = linspace( 0 , 0 , 10 );fmaxi = linspace( 0 , 0 , 10 );bnum = 1 ; for i = 1 : 10 fmax(bnum) = emax( 1 ); for j = 2 : 256 if (emax(j) > fmax(bnum))fmax(bnum) = emax(j);fmaxi(bnum) = emaxi(j);t = j;endendemax(t) = 0 ;bnum = bnum + 1 ;end for i = 1 : 10 fmax(i)fmaxi(i)end % 至此峰值已经提出出来了 % 在第一个峰值嵌入水印 % 首先把小于最大的像素值的都减去2cc = zeros(m,n);c = cc(:); for i = 1 :k if (b(i) < fmax( 1 ))c(i) = b(i) - 2 ;endendwatermark = imread( ' c:watermark.png ' );figure,imshow(watermark);[w1,w2] = size(watermark);watermark_line = watermark(:);oo = w1 * w2; % 开始嵌入水印 % 第一次水印tt = 1 ; % 让tt加1来遍历整个水印图像 for i = 1 :k if (c(i) == fmax( 1 )) if (tt > oo)tt = 1 ; % 如果超出水印的范围从头开始 if (watermark_line(tt) == 1 )c(i) = c(i) - 1 ;endendtt = tt + 1 ;endend % 第二次水印tt = 1 ; % 让tt加1来遍历整个水印图像 for i = 1 :k if (c(i) == fmax( 2 )) if (tt > oo)tt = 1 ; % 如果超出水印的范围从头开始 if (watermark_line(tt) == 1 )c(i) = c(i) - 2 ;endendtt = tt + 1 ;elseif(c(i) == fmax( 2 ) + 1 ) if (tt > oo)tt = 1 ; if (watermar_line(tt) == 1 )c(i) = c(i) - 2 ;endendendend % 显示嵌入水印的图像embed = c;embed = reshape(c,m,n);figure,imshow(embed,[]),title( ' 嵌入水印的图像 ' ); % 提取水印 % 提取第一层 for i = 1 :k if (c(i) == fmax( 2 ))watermark(tt) = 0 ; % tt = tt + 1 ; % elseif(c(i) == (fmax( 1 ) + 1 )) % watermark(tt) = 0 ; % tt = tt + 1 ; % elseif(c(i) = fmax( 1 ) - 1 ) % elseif(c(i) = fmax( 1 ) - 1 ) % watermark(tt) = 1 ; % tt = tt + 1 ; % elseif(c(i) = fmax( 1 ) - 2 ) % watermark(tt) = 1 ; % tt = tt + 1 ; % end else if (c(i) == fmax( 2 ) + 1 )watermark(tt) = 0 ; else if (c(i) == fmax( 2 ) - 1 )watermark(tt) = 1 ; else if (c(i) == fmax( 2 ) - 2 )watermark = 1 ;endendendtt = tt + 1 ;endend % 提取第二层 for i = 1 :k if (c(i) == fmax( 1 ))watermark(tt) = 0 ;tt = tt + 1 ;elseif(c(i) == (fmax( 1 ) - 1 ))watermark(tt) = 1 ;tt = tt + 1 ;endend for i = 1 :oowatermark_dect(i) = watermark(i);end for i = 1 :oowatermark_dect(i) = watermark(i);endwatermark_dect = reshape(watermark_dect,w1,w2);figure,imshow(watermark_dect,[]),title( ' 提取出来的水印 ' ); % 恢复原图像dd = embed(:); for i = 1 :k if (c(i) == (max - 2 ))c(i) = c(i) + 2 ;elseif(c(i) < max - 2 )c(i) = c(i) + 2 ;endenddd = reshape(c,m,n);figure,imshow(dd,[]),title( ' 恢复的图像 ' );a = imread( ' c:bbb.png ' );x = a;x1 = embed;x = double (x);x1 = double (x1); for i = 1 : 256 ; for j = 1 : 256 ;MYa(i,j) = x(i,j) ^ 2 ; % afterfiltering ' ssingle MYb(i,j) = x(i,j) - x1(i,j);endendd = 0 ;e = 0 ; for i = 1 : 256 ; for j = 1 : 256 ;d = d + MYa(i,j);e = e + MYb(i,j) * MYb(i,j);endendf = log10(d / e);g = 10 * f