信息隐藏——LSB算法

####引用王子的一句话:首先我要否认原创性!
但是我看懂了
所以贴出来和大家分享下

##摘录:

###LSB算法,也就是最低有效位: Least Significant Bit
在讲算法之前,我们先了解两个概念:
1.bmp图片是无损图片,每个像素点都用三个0-255的值来表示red,green,blue。
(注意:bmp图片的前14比特是头信息,最好不要用于该算法)。
而JPG图片是经过了DCT变换的,不能使用该算法。

2.这里为了算法简单起见,我们使用灰度图像:每个像素点用0-255的值来表示黑白颜色深度。
3.二值图像:每个像素点用0代表黑色,1代表白色
现在有一张宿主图片,我们要在宿主图片里面嵌入要隐藏的图片(当然可以是其它字符串),算法的思想是这样的:
1.将宿主图像变成灰度图像,将要隐藏的图像变成二值图像。
2.利用Matlab的bitget和bitset函数获得宿主图像中每个像素点的最低比特位(每个像素点总共有8位,2^8 = 256)将最低比特位与二值图像的位进行异或。如果结果为0,则不变;如果结果为1,如果设置宿主图像的最低比特位为1,则变成0;最低比特位是0,则变成1。
注:这里必须保证宿主图片的大小必须大于要隐藏图片的大小。
3.因为改变最低比特位对0-255的像素点来说只改变 +1 或 -1的大小,对于整个像素点的变化几乎很小看不到。所以可以用该算法来做信息隐藏。

Matlab代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
%Author : Miibotree
%Time : 2013.11.20

clear all;
clc;
close all;

xor_zero = 0;
xor_one = 0;

%ary 表示那个比特面,1是最低比特位
ary = 5;

file_name1 = '1.bmp';
cover_object = imread(file_name1);
cover_object = rgb2gray(cover_object);
cover_object_ll = bitget(cover_object, ary);

figure;
imshow(cover_object);
title('origin host picture');

figure;
imshow(255*cover_object_ll);
title('origin hot pic`lowest bit');

file_name2 = '2.bmp';
message = imread(file_name2);
message = rgb2gray(message);
message = im2bw(message, graythresh(message));

figure;
imshow(message);
title('hidden picture');

Mc = size(cover_object, 1); %Height
Nc = size(cover_object, 2); %Width

Mm = size(message, 1); %Height
Nm = size(message, 2); %Width

watermarked_image = cover_object;
temp = 1;

for ii = 1 : Mc
for jj = 1 : Nc
if temp < Mm * Nm
if cover_object_ll(ii, jj) ~= message(temp)
if cover_object_ll(ii, jj) == 1
watermarked_image(ii, jj) = bitset(watermarked_image(ii,jj), ary, 0);
xor_zero = xor_zero + 1;
else
water_marked_image(ii, jj) = bitset(watermarked_image(ii,jj), ary, 1);
xor_one = xor_one + 1;
end
end
temp = temp + 1;
end
end
end

figure;
imshow(watermarked_image);
title('watermarked picture');

figure;
watermarked_image_ll = bitget(watermarked_image, ary);
imshow(255 * watermarked_image_ll);
title('watermarked picture`s lowest bit');


###下面是效果:

####原图和嵌入水印的图

####水印图

####最低位比特位的对比,可以看出第二张明显头部隐藏了信息