首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于LSB-DCT的图像隐写

基于LSB-DCT的图像隐写
EN

Stack Overflow用户
提问于 2016-02-14 19:18:15
回答 1查看 3.6K关注 0票数 3

我正在研究基于LSB的图像隐写技术,其中我必须将LSB应用到图像的DCT系数中,以便将数据嵌入到JPEG.i。我对所有的this.so搜索和阅读一些研究论文都很陌生,它们都缺乏关于这个过程的大量信息,因为DCT.i也读了很多关于堆栈溢出的问题和答案,并且变得更加混乱。

以下是问题:

1-研究论文和在网络上的问题,他们都是使用8x8块大小的图像为DCT..what,我应该做,如果图像的分辨率没有完全划分为8x8块,如724x520。

520 /8= 65,724 /8= 90.5

2-如果我有很多块和一些信息可以隐藏,我们认为可以适应5 blocks..do,我仍然需要采取dct的其余块和和idct。

我需要在dct后应用量化,然后应用lsb,还是我可以直接应用lsb?

4-研究论文中没有提到任何关于不接触量化的离散余弦变换系数(0和1)的内容,第一个value..now是否应该使用它们??为什么不呢?我得到它大约0,因为它是高频成分,并被删除的compression..and,我不做任何compression..so,我可以使用它,但仍然产生相同的JPEG文件?

在量化中,我们用量化矩阵对离散余弦变换系数进行除法,并舍入values.in逆运算,对量化矩阵进行just..no变换,使量化矩阵与DCT系数相乘,从而达到舍入的目的。

作为对DCT的评论,然后是IDCT:

来自不同的研究论文:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-14 21:20:16

JPEG密写

如果要将图像保存到jpeg,则必须遵循jpeg编码过程。不幸的是,我读过的大多数报纸都说不要这么做。完整的过程如下(wiki摘要 of a 182页规格书):

  1. RGB到YCbCr转换(可选),
  2. 色度通道的次采样(可选),
  3. 8x8块分裂,
  4. 像素值重新调整,
  5. DCT,
  6. 基于压缩比/质量的量化,
  7. 将系数按字形排列,并且
  8. 熵编码;最常涉及赫夫曼编码和游程编码(RLE)。

实际存在的是更多的细节,如标头、区段标记、DC和AC系数的具体存储等。然后,标准中的一些方面只有松散的定义,它们的实现在不同的编解码器中可能有所不同,如次采样算法、量化表和熵编码。也就是说,大多数软件都遵循通用的JFIF标准,可以被各种软件读取。如果您希望jpeg文件也这样做,请准备只为编码器编写数百行(到大约一千行)代码。你最好借用一个已经在互联网上发布的编码器,而不是自己写。您可以从查看利比伯开始,它是用C编写的,构成了许多其他jpeg编解码器的基础,它的C#实现甚至是受其启发的Java版本。

在一些伪码中,编码/解码过程可以描述如下。

代码语言:javascript
复制
function saveToJpeg(pixels, fileout) {
    // pixels is a 2D or 3D array containing your raw pixel values
    // blocks is a list of 2D arrays of size 8x8 each, containing pixel values
    blocks = splitBlocks(pixels);
    // a list similar to blocks, but for the DCT coefficients
    coeffs = dct(blocks);
    saveCoefficients(coeffs, fileout);
}

function loadJpeg(filein) {
    coeffs = readCoefficients(filein);
    blocks = idct(coeffs);
    pixels = combineBlocks(blocks);
    return pixels;
}

对于隐写,您可以按以下方式修改它。

代码语言:javascript
复制
function embedSecretToJpeg(pixels, secret, fileout) {
    blocks = splitBlocks(pixels);
    coeffs = dct(blocks);
    modified_coeffs = embedSecret(coeffs, secret);
    saveCoefficients(modified_coeffs, fileout);
}

function extractSecretFromJpeg(filein) {
    coeffs = readCoefficients(filein);
    secret = extractSecret(coeffs);
    return secret;
}

如果您的封面图像已经在jpeg中,则不需要将其与解码器一起加载到像素,然后将其传递到编码器以嵌入您的消息。你可以这样做。

代码语言:javascript
复制
function embedSecretToJpeg(pixels, secret, filein, fileout) {
    coeffs = readCoefficients(filein);
    modified_coeffs = embedSecret(coeffs, secret);
    saveCoefficients(modified_coeffs, fileout);
}

就你的问题而言,1、2、3和5应该由编解码器来处理,除非你是自己写的。

问题1:通常,您希望用必要的行/列数填充图像,这样宽度和高度都可以被8整除。在内部,编码器将跟踪填充的行/列,以便解码器在重建后丢弃它们。这些虚拟行/列的像素值的选择取决于您,但是建议您不要使用常量值,因为它将导致振铃伪像,这与方波的傅里叶变换是sinc函数的事实有关。

问题2:虽然您将只修改几个块,但编码过程要求您将它们全部转换,以便将它们存储到文件中。

问题3:您必须量化浮动DCT系数,因为这是无损地存储到文件中的内容。在量化步骤之后,您可以将它们修改到您心中的内容。

问题4:没有人阻止您修改任何系数,但您必须记住,每个系数都会影响块中的所有64个像素。DC系数和低频交流系数引入了最大的失真,所以您可能希望远离它们。更具体地说,由于DC系数的存储方式,修改一个会将失真提前到所有以下块。

由于大多数高频系数为0,所以采用RLE对其进行有效压缩。修改0系数可能会将其翻转为1(如果您正在进行基本的LSB替换),这会破坏这种有效的压缩。

最后,一些算法将它们的秘密存储在任意非零系数中,并跳过任何0。但是,如果您试图修改1,它可能会翻转到0,并且在提取过程中您会盲目地跳过读取它。因此,这类算法不会接近1或0的任何系数。

问题5:在解码过程中,只需将系数乘以相应的量化表值即可。例如,DC系数为309.443,量化给出了round(309.443 / 16) = 19。舍入位是这里有耗的部分,它不允许您重建309.433。所以相反的是简单的19 * 16 = 304

DCT在隐写中的其他应用

频率变换(如DCT和DWT )可以用于隐写,将秘密嵌入到频域,但不一定要将stego图像存储到jpeg。这个过程是像素-> DCT ->系数->修改系数-> IDCT ->像素,这是您发送给接收器的内容。因此,格式的选择在这里很重要。如果您决定将您的像素保存到jpeg,则您在DCT系数可能会被打扰中的秘密将由jpeg编码的另一层量化。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35396977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档