部分源代码



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

% a原始数据数组
% aa存储像素从1到255
% bb存储aa中每个像素所对应的个数
% cc将a化成一列后,所形成的数组
% dd,cc中小于最大个数的像素值,减1处理后的结果
% copyrightbylilizong
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++,c,C#,J#,OO)