所以我试图解决这个问题,但它一直在给我我认为不正确的答案。因为每次我尝试它都会给我一个新的形象。
问题在于:
以下是他们以BMP格式(link for BMP download)提供的图片:
这是我尝试过的,或者到目前为止没有尝试过的结果:
所以我将整个512x512矩阵设为一个矢量,这样我就可以从每个像素中提取LSB,然后将每个像素重新组合成1个。
var1是cdata矩阵的向量形式,包含0到255之间的值 var2是每个数字的最低有效位,通过除以2得到模数/余数函数得到 var3将每8个细胞分成1行,形成(171 ^ 2)* 8的矩阵 var4将矩阵转换为字符串的String数组 var5将字符串数组中的每一行转换为从二进制到十进制的相应数字 最终将其重新置于171 * 171矩阵中 imshow将数据显示为图像,(我也可以做imshow(最终,色彩图),但它不会改变图片)
我想要得到一张可辨认的照片,谁能告诉我自己做错了什么?我已经在网络上寻找另一种方法来做到这一点,没有运气。所以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)
答案 0 :(得分:2)
经过一些重型逆向工程后,我能够从你的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
不要问我怎么弄清楚这一点,只要给我上票! ;-)
(提示:看看自相关函数有帮助......)