所以这就是我想做的事情。我是matlab的新手。我用过它只有一天左右,这是我的老师要求我做的一件事。使用LSB算法在图像中嵌入语句或字符串组。该字符串将从文件中读取。 截至目前,我还没有使用任何文件操作。我正在尝试使用一个角色,我不知道什么是错的。算法似乎很简单,但我的输出,即封面和steg像素显示相同的值。 :(
cover=imread('D:\l.jpg');
steg=cover;
l=1;
LSB=0;
height = size (cover, 1);
width = size (cover, 2);
message = 'J' ;
mdec = uint8(message);
mbin = dec2bin(mdec, 8);
mbins= mbin(:);
len=length(mbins);
for i = 1:height
for j = 1:width
if(l<=len)
LSB = mod(cover(i,j), 2);
if(mbins(l)==LSB)
steg(i,j) = cover(i,j);
else if (mbins(l)~=LSB && LSB==1 && mbins(l)==0)
steg(i,j) = cover(i,j)-1;
else if (mbins(l)~=LSB && LSB==0 && mbins(l)==1)
steg(i,j) = cover(i,j)+1;
end
end
end
l=l+1;
end
end
end
imwrite(steg,'D:\hidden.jpg');
%imshow(steg)
cover(1, 1:8)
steg(1, 1:8)
答案 0 :(得分:1)
哦,嵌套循环......这不是可行的方法。
您希望使用输入字符串的二进制ascii表示替换第一个l
像素的最低有效位。
首先出现问题 - 将char转换为二进制:
应使用bitget
>> bitget( uint8('J'), 1:8 )
0 1 0 1 0 0 1 0
使用dec2bin
时,返回1乘8二进制数组:
>> dec2bin( uint8('J'), 8 )
01001010
返回1 x 8 字符串:此数组的实际数值为
>> uint8(dec2bin( uint8('J'), 8 ))
48 49 48 48 49 48 49 48
你能理解这两种方法之间的区别吗?
如果您坚持使用dec2bin
,请考虑
>> dec2bin( uint8('J'), 8 ) - '0'
0 1 0 0 1 0 1 0
第二点 - 嵌套循环:
Matlab支持向量/矩阵向量化操作而不是循环。
这是一种不带循环的好方法,假设cover
是类型为uint8
的灰度图像(即它有一个颜色通道而不是3)。
NoLsb = bitshift( bitshift( cover, -1 ), 1 ); %// use shift operation to set lsb to zero
lsb = cover - NoLsb; %// get the lsb values of ALL pixels
lsb( 1:l ) = mbins; %// set lsb of first l pixels to bits of message
steg = NoLsb + lsb; %// this is it!