利用LSB算法从图像中提取隐藏信息

11次浏览(最近30天)
Shahrin拉赫曼
Shahrin拉赫曼 2021年5月16日
评论道: 丽娜·伯曼 2021年6月29日
我有一个图像,它有一个隐藏的消息嵌入其中,应该使用LSB算法提取。但是,我通过所附代码获得的提取的隐藏消息没有意义。如果有人能指出我在这里做错了什么,我将不胜感激。
我使用以下代码来提取隐藏的消息:
s = imread (“image_result.bmp”);
身高=大小(年代,1);
宽度=大小(年代,2);
M = double(s(1:1:1)) * 8;
k=1;
I = 1:高度
J = 1:宽度
如果(k < = m)
b (k) =国防部(双(s (i, j)), 2);
K = K + 1;
结束
结束
结束
二进制向量=b;
binValues=[128 64 32 16 8 4 2 1];
binaryVector = binaryVector (:);
如果国防部(长度(binaryVector), 8) ~ = 0
错误(二进制向量的长度必须是8的倍数);
结束
binMatrix =重塑(binaryVector 8 []);
textString = char (binValues * binMatrix);
disp (textString);
我得到的信息是:
6个评论

登录评论。

接受的答案

图像分析
图像分析 2021年5月18日
看起来隐藏的信息被编码到图像的最后两行:
我尝试了几种解码方法
  1. 使用单一颜色通道
  2. 使用所有3种颜色通道。
clc;%清除命令窗口。
清晰;%删除所有变量。
关闭全部的%关闭所有图形窗口(imtool创建的除外)。
工作空间;%确保显示工作区面板。
powerOf2Values = [128 64 32 16 8 4 2 1];
rgbImage=imread(“image_result.bmp”);
nexttile
imshow (rgbImage [],“InitialMagnification”, 800);
轴(“上”“图像”);
[r,g,b]=imsplit(rgbImage);
r2=mod(r,2);
nexttile
imshow(r2,[],“InitialMagnification”, 800);
轴(“上”“图像”);
G2 = mod(g, 2);
nexttile
imshow(g2,[],“InitialMagnification”, 800);
轴(“上”“图像”);
B2 = mod(g, 2);
nexttile
imshow (b2, [],“InitialMagnification”, 800);
轴(“上”“图像”);
%获取每个通道的最后2行
last2LinesR = r2(end-1:end,:); / /结束
last2LinesG = g2(end-1:end,:); / /结束
last2LinesB = b2(end-1:end,:);
%-------------------------------------------------------------------
尝试(猜测)从单一颜色通道中提取信息
%重塑成一个长行向量
last2LinesR =重塑(last2LinesR, 1, []);
%重塑成一个长列向量
% last2Lines =重塑(last2Lines, [], 1);
%整形成一个n × 8矩阵,其中每一行是一个字符值。
last2LinesR=重塑(last2LinesR,[],8)
行= 1:size(last2LinesR, 1)
thisRow=double(最后2行,:);
value = thisRow .* powerOf2Values;
asciiValue(行)= uint16 (sum(值));
结束
阿西瓦卢
流('------------------------------------------------------------\ n ');
流(“%c”, asciiValue);
流(' \ n ');
流('------------------------------------------------------------\ n ');
%-------------------------------------------------------------------
尝试(猜测)从所有3个通道提取消息
%重塑成一个长行向量
last2LinesR =重塑(last2LinesR, 1, []);
last2LinesG=重塑(last2LinesG,1,[]);
last2LinesB =重塑(last2LinesB, 1, []);
%垂直堆栈
m = [last2LinesR;last2LinesG;last2LinesB];
%重塑成一个长行向量
m=重塑(m,1,[]);
%整形成一个n × 8矩阵,其中每一行是一个字符值。
last2LinesR =重塑(m, [], 8)
行= 1:size(last2LinesR, 1)
thisRow=double(最后2行,:);
value = thisRow .* powerOf2Values;
asciiValue(行)= uint16 (sum(值));
结束
阿西瓦卢
流('------------------------------------------------------------\ n ');
流(“%c”, asciiValue);
流(' \ n ');
流('------------------------------------------------------------\ n ');
这两种方法似乎都不能产生合理的信息,所以我现在必须猜测正确的解码方式。你确定你也不知道吗?我们可以花上几个小时猜测。
2的评论
图像分析
图像分析 2021年5月20日
好的。祝你好运。我在我的代码的后半部分尝试了这一点,我从红色、绿色和蓝色中各取一位。这没有任何意义。但可能这些位需要从我的代码中翻转过来,或者顺序是BGR而不是RGB,所以你仍然可以通过修改我的代码来尝试一些事情。

登录评论。

答案(1)

图像分析
图像分析 2021年5月16日
也许你没有以正确的方式提取隐藏的信息,就像他们在图像中隐藏的那样。你有用来隐藏封面图像中的水印信息的代码吗?
我附上两个演示给你学习和适应,如果你想。
3评论
Shahrin拉赫曼
Shahrin拉赫曼 2021年5月17日
再次非常感谢你这么宽泛的回答。然而,不幸的是,我不太确定如何在我的代码中尝试这4种排列。另一方面,我尝试对给定的代码进行多次修改,但仍然没有任何进展。

登录评论。

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始打猎吧!