基于LSB-DCT的图像隐写术

2024-02-01

我正在研究基于 LSB-DCT 的图像隐写术,其中我必须将 LSB 应用于图像的 DCT 系数,以便将数据嵌入到 JPEG。我对这一切都很陌生。所以搜索并阅读了一些研究论文,他们都缺乏很多有关 DCT 之后流程的信息。i 也在 stackoverflow 上阅读了许多问题和答案,并变得更加困惑。

以下是问题:

1-研究论文和网上有问题的论文都使用图像中的 8x8 块大小进行 DCT。如果图像的分辨率没有完全分为 8x8 块(例如 724 x 520),我应该做什么。
520 / 8 = 65 但 724 / 8 = 90.5

2-如果我有很多块和一些要隐藏的信息,我们认为这些信息可以放入 5 个块中..我是否仍然需要对剩余块进行 dct 和 idct。

3-我需要在 DCT 之后应用量化,然后应用 LSB 还是可以直接应用 LSB?

4-研究论文没有提及任何关于不接触值为 0 和 1 以及第一个值的量化 DCT 系数的内容。现在我应该使用它们吗?那么为何不??我得到它是关于 0 的,因为它是高频分量,并且在 JPEG 中被删除以进行压缩..并且我没有进行任何压缩..所以我可以使用它并仍然生成相同的 JPEG 文件吗???

5-在量化中,我们将DCT系数除以量化矩阵并对值进行四舍五入。相反,我必须将量化矩阵与DCT系数相乘......没有撤消四舍五入???

对于 DCT 和 IDCT 的评论:

From different Research Papers: enter image description here


JPEG 隐写术

如果要将图像保存为 jpeg,则必须遵循 jpeg 编码过程。不幸的是,我读过的大多数论文都说不公正。完整流程如下(维基摘要 https://en.wikipedia.org/wiki/JPEG#Encoding of a 182 页规格书 https://www.w3.org/Graphics/JPEG/itu-t81.pdf):

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

其实有涉及更多细节 https://stackoverflow.com/questions/8560571/where-can-i-get-free-specifications-of-jpeg-jfif-exif-etc,例如标题、部分标记、如何存储 DC 和 AC 系数的细节等。然后,该标准仅松散地定义了一些方面,并且它们的实现在编解码器之间可能有所不同,例如子采样算法、量化表和熵编码。也就是说,大多数软件都遵循通用 JFIF 标准,并且可以被各种软件读取。如果您希望 jpeg 文件执行相同的操作,请准备好为编码器编写数百(到大约一千)行代码。您最好借用已经在互联网上发布的编码器,而不是编写自己的编码器。您可以首先查看libjpeg http://libjpeg.sourceforge.net/它是用 C 编写的,构成了许多其他 jpeg 编解码器的基础,它的C# 实现 http://bitmiracle.com/libjpeg/甚至是一个Java http://www.media.mit.edu/pia/Research/deepview/src/JpegEncoder.java受其启发的版本。

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

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;
}

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

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 格式,则无需使用解码器将其加载到像素,然后将其传递给编码器来嵌入您的消息。你可以这样做。

function embedSecretToJpeg(pixels, secret, filein, fileout) {
    coeffs = readCoefficients(filein);
    modified_coeffs = embedSecret(coeffs, secret);
    saveCoefficients(modified_coeffs, fileout);
}

就您的问题而言,编码器/解码器应该处理 1、2、3 和 5,除非您自己编写一个。

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

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

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

问题4:没有人阻止您修改任何系数,但您必须记住每个系数都会影响块中的所有 64 个像素。 DC系数和低频交流电 http://image.slidesharecdn.com/digitalimageprotectionusingadaptivewatermarkingtechniques-140503113049-phpapp02/95/digital-image-protection-using-adaptive-watermarking-techniques-10-638.jpg?cb=1399119672它们会带来最大的扭曲,因此您可能需要远离它们。更具体地说,由于 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)可用于隐写术,将秘密嵌入到频域中,但不一定将隐写图像存储为 jpeg。这个过程是像素->DCT->系数->修改系数->IDCT->像素,这就是你发送给接收器的内容。因此,格式的选择在这里很重要。如果您决定将像素保存为 jpeg,那么 DCT 系数中的秘密可能会受到干扰 https://stackoverflow.com/questions/28190487/cant-extract-embedded-stego-message-after-compression-is-applied-to-image通过 jpeg 编码的另一层量化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于LSB-DCT的图像隐写术 的相关文章

  • 将图像添加到可通过私人存储库中的 github 查看的 jupyter 笔记本

    我发现通过一个简单的例子嵌入 jupyter 标记中的图像 img myimage png 当存储库是私有的时 不会显示在 github 笔记本查看器中 我尝试了很多黑客行为 显然 4 x x 中有将图像嵌入为 Base64 元数据的功能
  • 当我使用 ctx.drawImage() 在画布中放置另一个图像时,无法将画布另存为图像

    我正在尝试制作绘图应用程序 您可以在画布上绘制一些内容 并通过单击 保存 按钮将结果保存为服务器上的图像 您还可以放置另一张图像作为绘图的背景 问题是 当我使用 ctx drawImage 将图像放入画布时 我无法将画布保存为图像 因为什么
  • 如何在Android中将图像文件转换为pdf文件

    我正在尝试在 Android 应用程序中将图像文件 jpg 转换为 pdf 文件 我用过itextpdf罐子和机器人文本罐 都不适合我 下面是使用时的代码itextpdf Document document new Document Str
  • Fabric JS ClipPath:裁剪后如何使图像适合画布?

    我使用 FabricJS 和 ClipPath 属性实现了图像裁剪 问题是如何使裁剪后的图像适合画布 我希望裁剪后的图像填充画布区域 但不知道是否可以使用 Fabric js 来完成 因此 我希望用户单击 裁剪 按钮后图像的选定部分适合画布
  • 使用 DrawImage 方法黑屏

    我必须使用绘制位图图像绘图上下文 DrawImage http msdn microsoft com en us library ms606804 28v vs 90 29 aspx method 使用下面的代码一切正常 BitmapIma
  • 在 NoSQL 存储中存储图像

    我们的应用程序将通过 HTTP 提供大量缩略图大小的小图像 大小约为 6 12KB 我被要求调查使用 NoSQL 数据存储是否是一个可行的数据存储解决方案 理想情况下 我们希望我们的数据存储是容错且分布式的 在 NoSQL 存储中存储 bl
  • Unity-3d-5 将 16:9 的图像缩放至其他分辨率

    所以我创建了一个蛇游戏 其边框是用 2d 精灵创建的 我将游戏窗口设置为 16 9 在此分辨率下图像看起来不错 然而 扩展到其他任何东西开始让游戏看起来很奇怪 我想要调整游戏窗口的大小 如何让我的精灵根据当前分辨率拉伸和收缩 我已经尝试创建
  • 通过排队预加载图像?

    我正在寻找一种预加载特定图像并将其添加到队列中的方法 这是我目前所处的位置 http shivimpanim org testsite imageloader html http shivimpanim org testsite image
  • 如何在 Android 中从 JPEG 创建动画 GIF(开发)

    我正在寻找一种简单的方法create本机 Android 应用程序中的动画 GIF 源文件应为 JPEG 来自相机或其他文件 输出应在设备上保存为 GIF 我不想知道如何播放动画或动画 GIF 文件 需要明确的是 我想知道如何将单个图像逐帧
  • 图像增强 - 从书写中清除给定图像

    我需要清理这张照片 删除 清理我 的字样并使其变亮 作为图像处理课程作业的一部分 我可能会使用 matlab 函数 ginput 来查找图像中的特定点 当然 在脚本中您应该对所需的坐标进行硬编码 您可以使用 conv2 fft2 ifft2
  • 从选定位置导入 Python 模块

    假设我有三个脚本 Main py 包含所有导入 1 py 随机脚本 2 py 随机脚本 pyinstaller F onedir Main py 80mb pyinstaller F onedir 1 py 80mb pyinstaller
  • 将图像存储在 Mongodb 中并使用 Nodejs 提供服务

    我知道 Mongodb 可以通过两种方式存储图像 通过将图像存储为二进制在常规文档中 通过 Gridfs 管理更大的图像 为简单起见 并且因为我计划服务器的图像很小 所以我将选择选项 1 为了将图像提供给浏览器 我使用的是nodejs 我的
  • Facebook 时间线墙贴图像在点赞后被裁剪

    我的网站上有一个 Facebook Like 按钮 已经半年了 使用 OG 标签来可视化类似内容 一切都经过彻底测试 一切都在 基本 墙上 时间线 墙上以及新闻提要中显示良好 但突然间 当有人喜欢该页面时 该图像就会被裁剪在时间轴墙上 原始
  • 请推荐一个用于将 IPTC 数据写入图像的 Node 模块?

    我有一个 Node js 服务器 其工作是下载 JPEG 图像 将某些数据写入几个 IPTC 字段 例如Iptc Application2 Caption 并将图像传递给另一个服务 理想情况下 我想将 IPTC 数据写入内存缓冲区 而不将图
  • 通过内联样式动态设置背景 Div 图像时不显示 | Next.Js

    我试图通过使用地图和外部 js 文件将图像存储为对象来从组件渲染图像 然后通过它们设置循环 将其设置为创建的每个 div 的不同背景图像 如果有意义的话 我将提供代码来更清楚地说明我想要完成的任务 在地图过程中 我试图定位对象方法 但我相信
  • 将图像文件存储在猫鼬模式的二进制数据中并以html形式显示图像

    我正在使用 Express Node js 和 Mongodb 创建上传和显示图像文件的网页 我使用 schema 将图像的二进制文件保存在 mongodb 中 这是我在index js和db js中的一点代码 var Post mongo
  • 用Python识别图像

    我对 OCR 识别和 Python 都有点陌生 我想要实现的是从 Python 脚本运行 Tesseract 以 识别 tif 中的某些特定数字 我以为我可以为 Tesseract 做一些培训 但我在 Google 和 SO 上没有找到任何
  • http压缩和url压缩有什么区别?

    查看 Web config 中的节点 我发现它允许 httpCompression 和 urlCompression 元素 两者有什么区别 我只想执行标准 gzip 我应该使用哪一个 url压缩指定what压缩和http压缩表示how进行压
  • Phonegap 图像未显示

    我无法让图像在我的phonegap 版本中正常工作 我读过绝对路径可能不起作用 所以我尝试了绝对路径和相对路径 但仍然没有运气 我包括这样的图像
  • 减少1000张图片的HTTP请求?

    我知道这个问题可能听起来有点疯狂 但我想也许有人会想出一个聪明的主意 假设您在一个 HTML 页面上有 1000 个缩略图 图像大小约为5 10 kb 有没有办法在单个请求中加载所有图像 以某种方式将所有图像压缩到一个文件中 或者您对该主题

随机推荐

  • 在pymongo中使用explain("executionStats")进行查询

    我的请求有问题 包括explain 例如 以下请求效果很好 pp pprint col find cuisine Italian name 1 address zipcode 1 address coord 1 explain 的项目清单e
  • 如何使用Jetpack compose实现交错网格布局?

    据我所知 我们只能使用Rows and Columns in Jetpack Compose显示列表 如何实现如下图所示的交错网格布局 它的正常实现使用Recyclerview交错网格布局管理器非常简单 但如何在 Jetpack Compo
  • clickhouse 将采样缩减为 OHLC 时间条间隔

    对于一张桌子 例如包含日期 价格时间序列 每个价格例如毫秒 如何将其下采样为具有时间间隔的开高低收 ohlc 行组 例如分钟 虽然使用数组的选项可以工作 但这里最简单的选项是使用按时间间隔分组的组合min max argMin argMax
  • 相当于 Akka,但适用于 .NET(并发框架)

    有没有相当于Akka http akka io 但对于 NET http doc akka io use cases http doc akka io use cases 这是 我的 正在进行的 NET Akka actor 端口 编辑 该
  • 如何使用 jquery 检查选​​择元素是否仍然“打开”/活动

    无论如何 我是否可以通过 jQuery 检测选择表单元素当前是否处于活动状态 我创建了这个小提琴来演示这个问题 http jsfiddle net E2PhT 2 http jsfiddle net E2PhT 2 当您将鼠标悬停在 搜索
  • 如何使用 PostgreSQL 计数估计来加速 Django 的管理页面?

    众所周知 当数据库表有很多行时 Django 的管理列表视图会变得相当慢 这是因为 Django 分页器默认使用 慢 PostgreSQLCOUNT query 因为估计对我们来说很好 而且速度要快得多 例如 SELECT reltuple
  • 如何在 OpenCV 中将轮廓分割为开放弧

    I have the image below and I need to split the contour to create various 30 degrees arc which I then need to fit a circl
  • 来自未知来源的 MPI 接收

    我正在 MPI 中实现一个程序 其中主进程 等级 0 应该能够接收来自其他进程的请求 这些进程要求只有根才知道的变量值 如果我按等级 0 进行 MPI Recv 我必须指定向根发送请求的进程的等级 但我无法控制它 因为进程不按顺序运行 1
  • 即使设置为原始值,angular2 formcontrol 仍保持脏状态

    当我更改输入字段中的值时 相应的表单控件将设置为脏 当我恢复更改 通过在输入字段中键入 时 表单控件保持脏状态 这是有意为之 这是一个错误还是我做错了什么 嗯 是的 它本来就是这样工作的 因为 一个控制是dirty如果用户已经改变UI 中的
  • java中@符号是什么意思?

    我知道它在出于文档目的的评论中意味着什么 但除此之外它意味着什么 我通常会用谷歌搜索这个 但每个非字母符号都会出现在结果中 The 符号表示 Java 注释 Java 注释的作用是向变量 方法 类 接口或其他语言元素添加特殊属性 这可以在声
  • ActiveRecord 迁移中序列化列的默认值

    所以我有一个序列化列 dimensions 在我的迁移中 我想将该字段设置为默认哈希 我努力了 create table shipping profiles do t t string dimensions in default gt wi
  • 默认情况下,stdout 行是缓冲的、无缓冲的还是不确定的?

    Section 7 19 3 7 of c99指出 在程序启动时 预定义了三个文本流 无需显式打开 标准输入 用于读取常规输入 标准输出 用于写入常规输出 和标准错误 用于写入诊断输出 最初打开时 标准错误流未完全缓冲 当且仅当可以确定标准
  • JObject.Parse 修改浮点值的结尾

    var clientString max 1214 704958677686 JObject o JObject Parse clientString var jsonString o ToString jsonString 的内容 max
  • C++ 重构 - 将方法移至实现文件

    我有很多头文件 里面有很长的方法实现 有没有一种自动的方法来做到这一点 一个接一个可能会花费很多时间 Thanks 如果您使用的是 Visual Studio 有一个名为视觉辅助 http www wholetomato com 这可以帮助
  • C++:如何从外部调用父类函数

    I have class A public virtual void foo class B public A public void foo B ptr new B 我想给A打电话foo 直接使用 ptr 指针 当我尝试时 A ptr g
  • 秋季创作者更新性能问题

    最近的 Windows 10 更新 秋季创意者更新 之后 我们的 NET c 4 0 应用程序的性能下降了很多 我认为存在各种问题 其中之一是 log4net 或磁盘 IO 我们的应用程序非常复杂 各种 WCF 应用程序和 ASPNET M
  • 经典 ASP 中的 CURL 请求

    有人可以帮我从下面的 CURL 请求创建经典的 asp 代码吗 curl H Authorization Token f2210dacd9c6ccb8133606d94ff8e61d99b477fd https cloud seafile
  • JDBC 连接池未在 Tomcat 中重新打开连接

    我已将 Tomcat 设置为使用连接池 但在连接上的 MySQL 超时后 之前在池中打开的连接不会打开 我的 context xml 文件如下所示
  • 如何在最新的.NET Core工具中实现版本自动递增?

    我正在使用最新的 截至今天 NET Core 工具 在那里 您可以在 MSBuild 属性中指定版本 但是 与 assembly AssemblyVersion 不同 这似乎不支持通配符 如何以同样的方式自动增加版本 解释为什么这是一个坏主
  • 基于LSB-DCT的图像隐写术

    我正在研究基于 LSB DCT 的图像隐写术 其中我必须将 LSB 应用于图像的 DCT 系数 以便将数据嵌入到 JPEG 我对这一切都很陌生 所以搜索并阅读了一些研究论文 他们都缺乏很多有关 DCT 之后流程的信息 i 也在 stacko