【最全的】直方图平移信息隐藏原理及代码(matlab实现)
可逆信息隐藏
将秘密信息,隐藏在图像、音频和视频等载体中,以实现对其保护或秘密信息的传输。接收者可以恢复原始图像,并提取出秘密信息。
直方图
每一幅图像都有它的直方图,横坐标是灰度值,纵坐标是该灰度值对应的像素点的数量。直方图中的每一个竖条就称为一个bin。一幅直方图中最高的那个点,就称为峰点P。最低的那个点(通常为0),叫做零点Z。
直方图平移
将峰点与零点之间的所有bin向左或者向右平移一位,那么就多出来一个空白的bin。我们可以利用这个bin来嵌入秘密信息。
具体做法为:
若P>Z,则将Z+1到P-1的所有bin向左平移一位;这样P-1的bin就空出来了
若P<Z,则将P+1到Z-1的所有bin向右平移一位;这样P+1的bin就空出来了
对应在代码中的操作,就是判断某个点的灰度值是否在p~z之间,然后对应灰度值加1或者减1即可。
信息嵌入
计算机中存储的信息都是二进制的,要么是0,要么是1。以P>Z为例,由于P-1的bin空出来了。于是我们把为0的秘密信息存放在灰度值为P的像素中,把为1的秘密信息存在灰度值为P-1的像素中。
具体的代码操作,就是依次找到图像中灰度值为P的像素点,若要嵌入的秘密信息为0,则该点的灰度值不变。若要嵌入的秘密信息为1,则该点的灰度值减1。在图像中的显示,就相当于把峰值点的bin切分成了两部分,一部分嵌入秘密信息0的还在P位置,另一部分嵌入秘密信息1的在P-1的位置。由于P-1的灰度值已经被空出来了(直方图平移), 所以我们这样操作是可以恢复原始信息与原始图像的。
(当P<Z时,P+1的bin空出来了,在P像素中嵌入0,在P+1中嵌入1,其他操作相同。)
信息提取
提取信息时,我们找到图中所有灰度值为P,和P-1的像素。对于灰度值为P的像素提取信息0,对于灰度值为P-1的像素提取秘密信息1。如此一来就能恢复秘密信息了。
(当P<Z时,在P像素中提取0,在P+1中提取1,其他操作相同。)
图像恢复
把位于P和Z之间的所有bin相应地往回平移一位即可。
最后附上matlab代码一份,如有错误还请指正。(本实验采用的是灰度图像,灰度值在0—255之间)
% 直方图平移
clear;clc;
% img_org为原始图像,img也是原始图像,用于接下来的一系列操作,把字符串换成你要处理的图片
img_org = imread('1.png');
img = img_org;
[M,N] = size(img);
% 将图像的直方图存储为数组,graylevel代表灰度值,counts代表每一灰度对应的像素数量
[counts, graylevel] = imhist(img);
[maxcount,maxgraylevel] = max(counts);
% 找到count为0的点,若没有,就把灰度值为254的点的灰度值改为255,由此空出254的位置
mingraylevel = 0;
flag = true;
for i=1:length(graylevel)
if(counts(i)==0 && flag)
mingraylevel = i;
flag=false;
end
end
% if(flag==false)