Reversible Data Embedding  Using a Difference Expansion 是Jun Tian 的一篇论文,主要讲的是一种可逆转的插值方法。经过插值的图像可以完全恢复成原图像,而且插入的数值也可以恢复。
   我这篇论文已经读完,我以为这星期的Homework就是把这篇论文给实现了,但是在实现过程中需要把Location Map用JBIG2压缩的方法给压缩了,我不知道怎么实现这个,于是便去问Vasilly。没想到他听完后居然反问我你要JBIG2做什么,原来他布置的Homework只是实现这篇论文的一小部分,后面的那些是以后的任务,而且还对我说Don't go too fast。晕死,我居然又给听错了。算了,那就先实现前面吧。我发现俄罗斯人的英语超级难懂啊,可能是我英语太弱。有一次Vasilly问我,你这个眼睛配了多长时间了,(我的眼镜有点破损,呵呵),我听成了你戴眼镜多长时间了,于是乎,我回答道,12年了。Vasilly那个错愕啊,呵呵,我估计他再想,你什么眼镜能戴12年啊。
   废话不说了,把我目前实现的代码贴出来吧。
   程序的主要功能是把假定图像像素对都是Expandable的,(这种图像不好找,不过大名鼎鼎的Lena就具备这个特性)然后把随机生成的数据插入图像(0,1比特流),得到一个Modified的图像,然后再恢复原图像和插入的数据。比较原图像和恢复后的图像是否相同,比较插入的Data和恢复的插入Data是否相同。如果相同就一切OK了。程序还生成一个Location Map,不过是假定Threshold是5,,没有考虑Playload的问题,比较简单。
 
 
 
function [f_mod,f_rec,Data,Data_out,location_map] = myDE(f)
%%%%%This function can embed data in p_w_picpath f,and recover the intial p_w_picpath
%%%%%and the embeded data
%%%%%
f = double(f);
pairs = reshape(f,2,size(f,1)*size(f,2)/2);
l = floor((pairs(1,:) + pairs(2,:))/2);
h = floor(pairs(1,:) - pairs(2,:));
location_map = zeros(1, size(h(:)));
for n = 1:size(h(:))
if h(n) <= 5 && h(n) >=-5
location_map(n) = 1;
else
location_map(n) = 0;
end
end
Data = round(rand(1,size(f,1)*size(f,2)/2));
H = 2*h + Data;
X = l + floor((H + 1)/2);
Y = l - floor(H/2);
pairs_mod = [X;Y];
f_mod = reshape(pairs_mod,size(f,1),size(f,2));
h = floor(H / 2);
Data_out = mod(H,2);
x = l + floor((h + 1)/2);
y = l - floor(h/2);
pairs_rec = [x;y];
f_rec = reshape(pairs_rec,size(f,1),size(f,2));
f_mod = uint8(f_mod);
f_rec = uint8(f_rec);
f = uint8(f);
fprintf('the value of sum(sum(f(:)) - sum(f_rec(:))) is %i \n',sum(sum(f(:)) - sum(f_rec(:))))
fprintf('the value of sum(sum(Data(:)) - sum(Data_out(:))) is %i \n', sum(sum(Data(:)) - sum(Data_out(:))))