0

所以这就是我想要做的。我对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)
4

1 回答 1

1

哦,嵌套循环......这不是要走的路。

您想用l输入字符串的二进制 ascii 表示替换第一个像素的最低有效位。


出错的第一件事 - 将 char 转换为二进制:
将字符转换为其二进制表示应该使用bitget

>> bitget( uint8('J'), 1:8 )
0    1    0    1    0    0    1    0

返回 1×8 二进制数组,同时使用dec2bin

>> dec2bin( uint8('J'), 8 ) 
01001010

返回 1×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是一个灰度图像(即它有一个单一的颜色通道而不是 3)类型uint8

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!
于 2014-12-24T18:18:37.307 回答