隐写分析中容易犯的小错误

隐写分析中经常犯的小错误总结如下:

1,试验中易犯的错误(只限MATLAB代码)

1)隐写过程

在做隐写分析时,为了验证特征提取算法的好坏需要进行实验检测。在检测的过程中,需要cover和stego两类。stego很多情况下需要我们自己进行隐写获得,而其中有一个错误就很容易发生在隐写的过程中。看如下代码(取lena图的一部分)
lena=imread(‘lena.pgm’);
这里写图片描述
imwrite(lena,’lena1.pgm’,’pgm’);

以上两句代码是最常用的两句,读图和保存图像。但是隐写的过程是需要将图像的uint8格式转换成double格式进行处理的,所以我们常用:
lena=double(imread(‘lena.pgm’));
这里写图片描述
那这样处理完后的矩阵直接用上面的imwrite进行保存行不行呢?试验后会发现突变成了全白的图。

lena=double(imread('lena.pgm'));
imwrite(lena,'lena1.pgm','pgm');
lena1=imread('lena1.pgm');`

原图的左上角
原图的左上角
保存后的lena1的左上角
保存后的lena1的左上角
出现这种情况可能会使隐写分析结果变得异常而又很难发现问题出在哪。实际我们只需将imwrite的那一句代码改成:imwrite(uint8(lena),’lena1.pgm’,’pgm’);即可解决这个错误。
那能不能只用uint8格式而不转换成double格式进行操作呢?答案是不行。因为MATLAB里面的矩阵处理都是以double进行的,使用uint8很容易发生数据溢出,以及矩阵运算数据格式不兼容的情况。最可怕的是:在进行imread操作时,忘记转成double型而没有发现。这样我们imwrite时不转成uint8并不会感觉隐藏后的图像有什么不对。但是在隐写检测的时候还是有一些细微的不同的。

2)隐写分析实验时

在进行隐写分析分析试验时很关键的一步是选样本,选样本的时候一定要保证从样本池中选取样本的随机性。我们常用的BOSSbase v0.92BOSSbase 1.01中的图像库均是来自于不同的相机,虽然说都经过统一的处理,但是多多少少不同的来源之间还是存在CSM (cover source mismatch)情况的。所以使用标准库时我们的训练集和测试集进行随机选取可以尽量减少CSM的影响。下面是一段不重复抽样的MATLAB代码很好用(此代码不是我写的,忘了在哪下的了,还请作者见谅)

function s = sampling(R, n)
% 选择抽样,R为记录集合,n为抽取的样本数
% 算法参考:D. E. Knuth, TAOCP, vol.2, pp142,稍有改动

% 编写函数时用的测试数据
if ~nargin
    R = 1 : 8;
    n = 4;
end

N = length(R);
t = 0;   % 处理过的记录总数
m = 0;   % 已选得的记录数

while 1
    U  = rand;
    if (N-t)*U < n-m
        m = m + 1;
        s(m) = R(t+1);
        % 若已抽取到足够的记录,则算法终止
        if m >= n, break, end
    end
    t = t + 1;
end

注意:训练集和测试集不要有重复的样本。

3)stego样本秘钥相同
在我们进行试验的时候经常会使用到批量隐写以获得大量的stego样本。这时可能会出现一个问题:秘钥相同。即代码中我们的秘钥是一个一成不变的数字而不是一个和时间相关的随机数,或者人为设定在变化的一个数。秘钥相同对传统基于统计的隐写分析可能没什么影响,但是对于以深度学习(CNN)为基础的隐写分析在准确率会产生较大影响(一般秘钥相同会使准确率上升)。
4)JPEG工具使用
jpeg_write和jpeg_read工具中不能含有中文路径,否则无法使用。
持续更新,欢迎补充,让我们共同学习。

猜你喜欢

转载自blog.csdn.net/u012140304/article/details/69944446