这篇是我在网上参考的原文,当时我要完成这个任务,搜集资料,也是从别人那找到的。
这篇文章的目的就是将这些整理出来,方便大家参考。
LSB图像水印嵌入与提取原创:https://blog.csdn.net/csdn_moming/article/details/50936687
(1)嵌入水印
message='cameraman.tif';
lsb = 3; name = 'D:\ffinal\2.bmp';
image = imread(name);image2=imread(message);
msg_origin = unicode2native(message, 'UTF-8');
msg_bin = dec2bin(msg_origin, 8);
msg = blanks(9);
for i = 1 : size(msg_bin, 1)
msg(i, :) = strcat(msg_bin(i, :), char(mod(i, 2) + '0'));
end
msg = strjoin(cellstr(msg)','');
msg(end) = char(mod(size(msg_bin, 1) + 1, 2) + '0');
len = length(msg) / lsb;
tmp = blanks(len);
for i = 1 : len
tmp(i) = char(bin2dec(msg((i - 1) * lsb + 1 : i * lsb)) + '0');
end
% use RGB
result = image;
rgb = 1;
[len_R, len_G, len_B] = size(result);
for R = 1 : len_R
for G = 1 : len_G
for B = 1 : len_B
if rgb <= len
result(R, G, B) = result(R, G, B) - mod(result(R, G, B), 2^lsb) + double(tmp(rgb) - '0');
rgb = rgb + 1;
end
end
end
end
imshow(result);
imwrite(result, 'D:\ffinal\result.bmp');
(2)提取水印
name='D:\ffinal\result.bmp';
image = imread(name);
lsb = 3;
index = 1;
rgb = zeros(0);
[len_R, len_G, len_B] = size(image);
flag = char('0');
for R = 1 : len_R
for G = 1 : len_G
tmp = blanks(0);
for B = 1 : len_B
tmp = strcat(tmp, mod(image(R, G, B), 2^lsb) + '0');
end
tmp_bin = dec2bin(tmp - '0', 3)';
rgb(index) = bin2dec(tmp_bin(1 : 8));
if flag + tmp_bin(9) ~= 97
msg_origin = native2unicode(rgb, 'UTF-8');
j=imread(msg_origin);
imshow(j);title('水印图像');
imwrite(j,'D:\ffinal\recover.bmp');
return;
end
index = index + 1;
flag = tmp_bin(9);
end
end