部分源代码



下面是上述仿真的部分代码,供参考。

%   a原始数据数组
%   aa存储像素从1到255
%   bb存储aa中每个像素所对应的个数
%   cc将a化成一列后,所形成的数组
%   dd,cc中小于最大个数的像素值,减1处理后的结果
%  copyright by lilizong
a
= imread( ' c:oat.png ' );
figure,imshow(a),title(
' 嵌入水印前原图像 ' );
for  i = 1 : 255
    aa(i)
= i;   % 用于存储像素值
end
for  i = 1 : 255
    bb(i)
= 0 ;   % 用于存储每个像素的个数
end
[m,n]
= size(a);
k
= m * n;    % a的大小
cc
= a(:);
tt
= 1 ;    % 循环遍历向量
% 求出某个像素的个数

for  i = 1 :k
    
for  j = 1 : 255
        
if (cc(i) == aa(j))
            bb(j)
= bb(j) + 1 ;
        end
    end
end
%  求出哪个像素的个数是最大

max
= bb( 1 );
for  i = 1 : 255
    
if (bb(i) > max)
        max
= bb(i);
        maxi
= i;
    end
end
%  将所有小于max的像素的值都减1
ddd
= zeros(m,n);
dd
= ddd(:);   % 产生和cc同样大小的数组,用于存放cc处理后结果;

for  i = 1 :k
    
if (cc(i) < max)
        dd(i)
= cc(i) - 1 ;
    end
end
% 读入水印,并将水印转换成一列,
watermark
= imread( ' c:watermark1.png ' );
figure,imshow(watermark),title(
' 水印图像 ' );
[w1,w2]
= size(watermark);
watermark_line
= watermark(:);
oo
= w1 * w2;
% 开始嵌入水印
tt
= 1 ;   % 让tt加1来遍历整个水印图像
for  i = 1 :k
    
if (dd(i) == max)
        
if (tt > oo)
            tt
= 1 ;   % 如果超出水印的范围从头开始
            
if (watermark_line(tt) == 1 )
                  dd(i)
= dd(i) - 1 ;
            end
      
        end
        tt
= tt + 1 ;
    end
end

% 显示嵌入水印的图像


embed
= dd;
embed
= reshape(dd,m,n);
figure,imshow(embed,[]),title(
' 嵌入水印后图像 ' );
imwrite(embed,
' c:embed2.gif ' );

% 提取水印

for  i = 1 :k
    
if (dd(i) == max)
        watermark(tt)
= 0 ;
        tt
= tt + 1 ;
    elseif(dd(i)
== (max - 1 ))
        watermark(tt)
= 1 ;
        tt
= tt + 1 ;
    end
end
for  i = 1 :oo
    watermark_dect(i)
= watermark(i);
end
watermark_dect
= reshape(watermark_dect,w1,w2);
figure,imshow(watermark_dect,[]),title(
' 提取后水印 ' );

% 恢复原图像
dd
= embed(:);
for  i = 1 :k
    
if (dd(i) == (max - 1 ))
        dd(i)
= dd(i) + 1 ;
    elseif(dd(i)
< max)
        dd(i)
= dd(i) + 1 ;
    end
end
dd
= reshape(dd,m,n);
figure,imshow(dd,[]),title(
' 恢复后图像 ' );


% 对原图和恢复图像进行比较



       




   

你可能感兴趣的:(c,OO,存储)