但是我看懂了
所以贴出来和大家分享下
在讲算法之前,我们先了解两个概念:
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代码
%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');