索引图象隐写术
1.索引图像
索引图像包含一个调色板和一个索引板,每个像素值都由一个(索引值->色彩值)表示,常见的基于索引的图象格式有gif和8位的BMP图像。
2.基于索引图像的隐写术
基于索引图象的隐写术大抵分为两类,一是对调色板进行隐写,这种方法不会使图片有较大的色彩跳变,但缺点是容量较小;另一类是对索引版进行隐写,这种方法弥补了前者容量较小的缺点但载体图片容易产生较大的色彩跳变。
3.现有索引图象隐写术
隐写算法 | 简单介绍 |
---|---|
Gifshuffle:调色板排序隐藏 | 利用调色板的顺序来隐藏信息 |
EZstego:有序调色板下索引板LSB | 基于某种距离准则对调色板排序降低索引版LSB出现色彩跳变的可能 |
Fridrich:索引版“LSB” | 对索引版做LSB,特殊的是修改索引值为LSB满足要求且颜色与原值相似的索引值。(可行的预处理:最佳奇偶分配密写) |
Hide&Seek: | |
颜色的量化索引调制: |
4.matlab实现Fridrich
隐写函数
function [ newdata, newmap ] = FridrichHiding( data,map, msgstr )
newmap = map;
map=uint8(map*256);
newdata = data;
[n,m] = size(data);
len = length(msgstr); %信息的长度
lenstr=uint8(1);
for i = 1:n
for j = 1:m
if (lenstr) > len
break;
end
if newdata(i,j) == 0
continue
end
if rem(newdata(i,j),2) == msgstr(lenstr)
lenstr=lenstr+1;
continue
else
newdata(i,j) = findpal(map,map(newdata(i,j),:),msgstr(lenstr));
lenstr=lenstr+1;
end
end
if lenstr > len
break;
end
end
function index = findpal(map, mark , flag)
[n,m]=size(map);
minn=10;
for i = 1:n
if rem(i,2)== flag
option=judge(map(i,:),mark);
if(option<minn)
minn=option;
index=i;
end
end
end
function ansum=judge(a,b)
r = double((a(1) - b(1)) / 255);
g = double((a(2) - b(2)) / 255);
b = double((a(3) - b(3)) / 255);
diff = sqrt(r*r + g*g + b*b) / 3;
ansum = 1-diff;
提取函数
function info = ExtractFromSortPallet( newdata ,len )
infostr = zeros(14,8);
[n,m]=size(newdata);
inow=1;
jnow=1;
num=0;
for i=1:n
for j=1:m
if(newdata(i,j)==0)
continue
end
num=num+1;
infostr(inow,jnow)=rem(newdata(i,j),2);
if((inow-1)*8+jnow)==len
break;
end
jnow=jnow+1;
if jnow == 9
jnow = 1;
inow = inow +1;
end
end
if((inow-1)*8+jnow) == len
break;
end
end
msgasc = bi2de(uint8(infostr));
message = char(msgasc);
message = message';
info = message;
end
隐写测试
%隐写部分
im = imread('down.png');
[data, map] = rgb2ind(im, 256);
msg='Hello World!';
msgasc = double(msg);
msgstr = de2bi(msgasc,8); %将信息转为一维的二进制串
msgstr=msgstr.';
msgstr=msgstr(:);
len = length(msgstr); %信息的长度
[newdata, newmap] = FridrichHiding(data, map, msgstr);
imwrite(newdata,newmap,'result.bmp');
imshow(data, map);title('origin');
figure;
imshow(newdata, newmap);title('stegano');
%提取部分
[newdata,newmap]=imread('result.bmp');
[n,m]=size(newmap);
info = ExtractFromSortPallet(newdata,len);
fprintf('The secret info is:%s\n', info);
5.参考资料
[1] 《基于调色板图像的隐写术.ppt》;任德斌
[2] csdn:《Matlab实现简单的GifShuffle算法隐藏信息》、《Matlab实现简单的hide&seek算法隐藏信息》;Spwpun