function stego=HILL_Repeatablecoverpathpayloadncover1=doubleimreadcoverpath;MN=sizecover1;wetCost = 10^8;coverLSB=modcover12;cover2=cover1-coverLSB;cost=EmbeddingCostcover2;tempcost=cost;~loc=sorttemp
该代码实现了一种可重复的隐藏信息(steganography)算法,使用HILL算法进行信息嵌入。下面是每行代码的含义:
-
function stego=HILL_Repeatable(coverpath,payload,n):定义了一个函数HILL_Repeatable,接受三个参数coverpath(待隐藏信息的图像路径)、payload(隐藏信息的比特率)和n(重复嵌入的次数),返回隐藏信息后的图像。 -
cover1=double(imread(coverpath)):从路径coverpath中读取待隐藏信息的图像,并将其转换为双精度的矩阵cover1。 -
[M,N]=size(cover1):获取图像矩阵cover1的尺寸,分别赋值给变量M和N。 -
wetCost = 10^8:设置一个很大的嵌入代价wetCost,用于表示无法嵌入信息的像素点。 -
coverLSB=mod(cover1,2):计算图像矩阵cover1中每个像素的最低有效位(Least Significant Bit,LSB),并赋值给coverLSB。 -
cover2=cover1-coverLSB:将图像矩阵cover1减去coverLSB,得到只包含偶数值的图像矩阵cover2。 -
cost=EmbeddingCost(cover2):调用EmbeddingCost函数计算图像矩阵cover2的嵌入代价,并赋值给cost。 -
tempcost=cost(:):将cost矩阵展开成一维向量,并赋值给tempcost。 -
[~,loc]=sort(tempcost):对tempcost向量进行排序,并将排序后的索引赋值给loc。 -
num=round(M*N*payload):根据隐藏信息的比特率payload计算出需要隐藏的信息个数,并四舍五入为整数。 -
tempcost(loc(1:num))=1:将tempcost向量中前num个索引对应的元素置为 1,表示这些位置可以用于嵌入信息。 -
tempcost(loc(num+1:end))=wetCost:将tempcost向量中剩余的元素置为wetCost,表示这些位置不可用于嵌入信息。 -
cost=reshape(tempcost,M,N):将修改后的tempcost向量重新转换为与原图像矩阵cover1相同尺寸的矩阵,并赋值给cost。 -
for i=1:n:重复执行下面的代码n次。 -
coverLSB=mod(cover1,2):计算图像矩阵cover1中每个像素的最低有效位(LSB),并赋值给coverLSB。 -
stegoLSB=EmbeddingSimulator(coverLSB,cost,round(M*N*payload),false):调用EmbeddingSimulator函数将coverLSB和cost作为参数进行信息嵌入,返回嵌入信息后的图像的最低有效位(stegoLSB)。 -
stegoLSB=double(stegoLSB):将stegoLSB转换为双精度矩阵。 -
stegoLSB=reshape(stegoLSB,[M,N]):将stegoLSB矩阵重新转换为与原图像矩阵cover1相同尺寸的矩阵。 -
stego=cover2+stegoLSB:将cover2和stegoLSB矩阵相加得到隐藏信息后的图像,并赋值给stego。 -
cover1=stego:将stego赋值给cover1,用于下一次循环的嵌入。 -
end:结束循环。 -
end:结束函数HILL_Repeatable的定义。 -
function cost=EmbeddingCost(cover):定义了一个函数EmbeddingCost,接受一个参数cover(待计算嵌入代价的图像矩阵),返回每个像素的嵌入代价。 -
HF=[-1 2 -1;2 -4 2;-1 2 -1]:定义一个高通滤波器HF。 -
H2=fspecial('average',[3 3]):创建一个 3x3 的平均滤波器H2。 -
cover=double(cover):将输入的图像矩阵cover转换为双精度矩阵。 -
sizeCover=size(cover):获取图像矩阵cover的尺寸,并赋值给变量sizeCover。 -
padsize=max(size(HF)):计算高通滤波器HF的尺寸,并取最大值,赋值给padsize。 -
coverPadded=padarray(cover,[padsize padsize],'symmetric'):对图像矩阵cover进行边缘填充,填充大小为padsize,填充方式为对称填充,得到填充后的矩阵coverPadded。 -
R=conv2(coverPadded,HF,'same'):使用高通滤波器HF对填充后的图像矩阵coverPadded进行卷积操作,得到卷积结果R。 -
W=conv2(abs(R),H2,'same'):对卷积结果R取绝对值,然后使用平均滤波器H2进行滤波操作,得到滤波结果W。 -
if mod(size(HF,1),2)==0,W=circshift(W,[1,0]):如果高通滤波器HF的行数是偶数,则将滤波结果W向下平移一行。 -
if mod(size(HF,2),2)==0,W=circshift(W,[0,1]):如果高通滤波器HF的列数是偶数,则将滤波结果W向右平移一列。 -
W=W(((size(W,1)-sizeCover(1))/2)+1:end-((size(W,1)-sizeCover(1))/2),((size(W,2)-sizeCover(2))/2)+1:end-((size(W,2)-sizeCover(2))/2)):根据原始图像的尺寸裁剪滤波结果W,得到与原始图像尺寸相同的矩阵。 -
cost=1./(W+10^(-10)):将滤波结果W取倒数,并加上一个很小的数,得到嵌入代价矩阵cost。 -
wetCost=10^10:设置一个很大的嵌入代价wetCost,用于表示无法嵌入信息的像素点。 -
rhoA=cost:将嵌入代价矩阵cost赋值给rhoA。 -
rhoA(rhoA>wetCost)=wetCost:将rhoA中大于wetCost的元素置为wetCost。 -
rhoA(isnan(rhoA))=wetCost:将rhoA中的NaN值置为wetCost。 -
HW=fspecial('average',[15,15]):创建一个 15x15 的平均滤波器HW。 -
cost=imfilter(rhoA,HW,'symmetric','same'):使用平均滤波器HW对rhoA进行滤波操作,得到最终的嵌入代价矩阵cost。 -
end:结束函数EmbeddingCost的定义。 -
function y=EmbeddingSimulator(x,cost,m,fixEmbeddingChanges):定义了一个函数EmbeddingSimulator,接受四个参数x(待嵌入信息的最低有效位矩阵)、cost(嵌入代价矩阵)、m(待嵌入信息的个数)和fixEmbeddingChanges(是否固定嵌入变化),返回嵌入信息后的最低有效位矩阵y。 -
n=numel(x):计算最低有效位矩阵x的元素个数,并赋值给变量n。 -
lambda=calc_lambda(cost,m,n):调用calc_lambda函数计算参数cost、m和n,得到嵌入强度lambda。 -
pChange=(exp(-lambda.* cost))./(1+exp(-lambda.* cost)):根据嵌入强度lambda和嵌入代价cost计算每个像素发生嵌入变化的概率pChange。 -
if fixEmbeddingChanges==1:如果fixEmbeddingChanges等于 1,则固定嵌入变化。 -
RandStream.setGlobalStream(RandStream('mt19937ar','seed',139187)):设置随机数生成器的全局种子为 139187。 -
else:否则,使用当前时间作为种子生成随机数。 -
RandStream.setGlobalStream(RandStream('mt19937ar','Seed',sum(100*clock))):设置随机数生成器的全局种子为当前时间的和乘以 100。 -
randChange=rand(size(x)):生成一个与最低有效位矩阵x相同尺寸的随机数矩阵randChange。 -
y=x:将最低有效位矩阵x赋值给y。 -
y(randChange<pChange)=mod(y(randChange<pChange)+1,2):根据随机数矩阵randChange和嵌入概率pChange,对y矩阵中满足条件的元素进行信息嵌入,即将这些元素加1并取模2。 -
end:结束函数EmbeddingSimulator的定义。 -
function lambda=calc_lambda(cost,message_length,n):定义了一个函数calc_lambda,接受三个参数cost(嵌入代价矩阵)、message_length(待嵌入信息的长度)和n(图像像素的总数),返回嵌入强度lambda。 -
l3=1e+3:设置初始的嵌入强度l3为 1000。 -
m3=double(message_length + 1):将待嵌入信息的长度加1,并转换为双精度,赋值给m3。 -
iterations=0:初始化迭代次数为 0。 -
while m3>message_length:循环执行下面的代码,直到m3小于等于待嵌入信息的长度。 -
l3=l3*2:将嵌入强度l3乘以 2。 -
p=(exp(-l3.*cost))./(1+exp(-l3.*cost)):根据嵌入强度l3和嵌入代价cost计算每个像素发生嵌入变化的概率p。 -
m3=binary_entropyf(p):调用binary_entropyf函数计算p的二进制熵,
原文地址: http://www.cveoy.top/t/topic/iCbu 著作权归作者所有。请勿转载和采集!