如何在图像Matlab中隐藏文本

时间:2012-04-28 04:59:58

标签: matlab

我有一张图片我想在其中隐藏一些文字

我想我应该得到如下的位平面:

a=imread('insect.gif');

[m n]=size(a);

for i=1:m,
    for j=1:n,
        b8(i,j)=bitand(a(i,j),128);
        b7(i,j)=bitand(a(i,j),64);
        b6(i,j)=bitand(a(i,j),32);
        b5(i,j)=bitand(a(i,j),16);
        b4(i,j)=bitand(a(i,j),8);
        b3(i,j)=bitand(a(i,j),4);
        b2(i,j)=bitand(a(i,j),2);
        b1(i,j)=bitand(a(i,j),1);
    end
end

所以我的第一位是“b1”,第二位是“b2”,第三位是“b3”,....

s='class is good'
h=dec2bin(s,8)

它会给我我的文本每个字符8位我想我应该隐藏我的文本在图像矩阵的LSB但我不知道该怎么做。

3 个答案:

答案 0 :(得分:0)

在文件交换中检查LSB STEGANOGRAPHY提交。

代码是开放的,这正是您所需要的。

答案 1 :(得分:0)

假设您有一个字节图像(8位),那么让我们看看前3个编码字节或24个像素。 让我们假设我们想要隐藏值255,1和12。

在编码3个值

之前
  MSB----LSB
1: 00000000  
2: 00000000
3: 00000000
4: 00000000
5: 00000000
6: 00000000
7: 00000000
8: 00000000

9: 00000000
10: 00000000
11: 00000000
12: 00000000
13: 00000000
14: 00000000
15: 00000000
16: 00000000

17: 00000000
18: 00000000
19: 00000000
20: 00000000
21: 00000000
22: 00000000
23: 00000000
24: 00000000

在编码3个值

之后
  MSB----LSB
1: 00000001 
2: 00000001
3: 00000001
4: 00000001
5: 00000001
6: 00000001
7: 00000001
8: 00000001

9: 00000000
10: 00000000
11: 00000000
12: 00000000
13: 00000000
14: 00000000
15: 00000000
16: 00000001

17: 00000000
18: 00000000
19: 00000000
20: 00000000
21: 00000001
22: 00000001
23: 00000000
24: 00000000

所以你应该看到你需要做的就是确保每个像素的LSB是0或1。 (即你只需要b1(i,j)=bitand(a(i,j),1);,因为更改更重要的位可能会明显改变图像)

function pixVal = setPixel(pixVal, zeroOne)

   isOdd = mod(pixVal,2);

  if zeroOne == 1
    if ~isOdd 
       pixVal = pixVal +  1;
    end
  else 
    if isOdd
       pixVal = pixVal - 1;
    end
  end

end    



function arr = setTextInArr( arr, text )

 %convert text to binary
 lsb = dec2bin(text,8)';

 for i=1:numel(lsb)
    val = arr(i);
    val = setPixel(val, str2num(lsb(i)));
    arr(i) = val;
 end

end

在小图像中编码“hi”

>> img = zeros(8,16, 'uint8')

img =

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

>> s = 'hi'

s =

hi

>> encImg = setTextInArr(img,s)

encImg =

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0

答案 2 :(得分:0)

实际上有两种方法:

第一个是将数据隐藏在图像中,当数据和图像没有任何共同点时,通常称为“隐写术”。

当数据描述图像时,第二个是嵌入注释数据。在这种情况下,数据和图像具有紧密的空间关系。

您所指的是“平面修改”#39;您可以在Web上查看质量要求,但在大多数情况下,每个字节最多可以保存4位(我们使用https://ece.uwaterloo.ca/~z70wang/research/iwssim/进行质量测量)。

请注意色彩空间转换,因为图像几乎从不存储在RGB色彩空间中。