【问题标题】:Extracting hidden image in matlab using least significant bit使用最低有效位在matlab中提取隐藏图像
【发布时间】:2014-06-17 21:47:38
【问题描述】:

所以我正在尝试解决这个问题,但它给了我我认为不是正确答案的答案。因为每次我尝试它都会给我一个新的图像。

问题来了:

这是他们提供给我们的 BMP 格式图片 (link for BMP download):

这是我尝试过的,或者到目前为止没有任何结果的尝试:

所以我将整个 512x512 矩阵做成了一个向量,这样我就可以从每个像素中提取 LSB,然后将每 8 个像素重新组合为 1 个。

var1 是 cdata 矩阵的向量形式,包含从 0 到 255 的值。
var2 是每个数字的最低有效位,通过应用模数/余数函数除以 2 获得。
var3 将每 8 个单元格分组为 1 行并形成 (171^2)*8 的矩阵
var4 将矩阵转换为字符串数组
var5 将字符串数组中的每一行从二进制转换为十进制 final 将其放回 171*171 矩阵中。
imshow 将数据显示为图像,(我也可以执行 imshow(final,colormap) 但不会对图片有太大影响)

我想得到一张可识别的照片,谁能告诉我我做错了什么?我在网上到处寻找另一种方法来做到这一点,但没有运气。所以stackoverflow是我最后的选择。

编辑:这是代码

uiopen('D:\Users\Desktop\rally\question1.bmp',1) %gives cdata array (512*512) and colormap array (256*3)
var1 = cdata( : );
var2 = rem(var1,2);
var2 = var2(121:233928+120);
var3 = vec2mat(var2',8);
var4 = num2str(var3);
var5 = bin2dec(var4);
final = vec2mat(var5,171);
imshow(final)

【问题讨论】:

  • 亲爱的上帝在天堂!使用imread 读取图像,而不是使用uiopen!!!!
  • 我只是拖放图像:v |它给了我颜色图和 cdata 数组 |有什么区别?
  • @ThaBomb:请以文本形式提供您的代码。我在屏幕截图上看不懂。
  • 添加代码,屏幕截图很大,右键>查看图片顺便说一句。
  • 它不是 512x512x3,它是带有 uiopen 的 512x512,您可以在最后一张图片中看到它。我也用 imread 进行了尝试,它给了我相同的结果。

标签: image matlab matrix byte bit


【解决方案1】:

经过一些繁重的逆向工程,我能够从您的 BMP 中解放 171 x 171 灰度版本的 Lena。但是,您给出的描述有几个方面是错误的,还有一些是不清楚的。

– 原始图像数据必须按顺序使用,但不是Matlab 的逐列方式,而是正常的图像位图存储格式,逐行。因此我们需要转置:

A = imread('question1.bmp');
A = A';

– 必须跳过 120 像素的数据,但不能从原始图像的开头跳过。我们宁愿需要解码所有个像素的最低有效位,将它们打包成8位字节,其中最高有效位是第一个:

bits = rem(A, 2);
bits = reshape(bits, 8, []);
bytes = 2 .^ fliplr(0 : 7) * single(bits);

– 奇怪的是,生成的字节序列被组织成 64 字节长度的块:

data = reshape(bytes, 64, 512);

– 结果矩阵结果以相反的列 - 行顺序组织(我们需要再次转置),并且从结果序列中我们需要在开始时跳过 15 个像素(对应于 120 位),并重塑到 171 x 171:

data = data';
I = reshape(data(16 : 171 * 171 + 15), 171, 171)';

有趣的是,要跳过的 15 个字节包含 ASCII 测试“messageStart”,后跟两个值为 171 和 171 的字节。

– 这样,一张熟悉的脸就恢复了:

imagesc(I)
axis image
colormap gray

不要问我是怎么想出来的,只要给我赞成票! ;-)
(提示:查看自相关函数会有所帮助……)

【讨论】:

  • 非常感谢,我感觉他们的指示在某种程度上是非常错误的 :) 干得好。
  • 还有一个相同类型的,只是我必须提取文本。如果你想帮我解决它,我很乐意将图片和说明链接起来
  • 我觉得今天对我来说已经足够了。如果您将其作为问题发布,我可能会稍后再看。你看到我上次的编辑了吗,我提到跳过的字节有文本解释?这可能会有所帮助...
  • 是的,我明白了,但我似乎无法理解你是如何跳过你说必须解码的 120 像素,因为它们不是连续的。如何跳过代码中的 120 像素/位?
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 2011-05-20
  • 2015-12-23
  • 2016-05-13
  • 2020-09-07
  • 2012-06-12
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多