使用隐写术提取的图像为白色

时间:2016-09-26 11:55:16

标签: matlab steganography

我正在尝试使用lsb embedding method将狒狒图像插入到lena图像中。当我尝试从隐秘图像中提取狒狒时,它只显示一个白色图像。

有谁能告诉我我的代码有什么问题以及如何解决问题?

这是我的狒狒形象。

enter image description here

这是我的莉娜形象。

enter image description here

我的嵌入代码

 file_name='lena.bmp';
 cover_image=imread(file_name);
 [row,col]=size(cover_image);
 %secret image 
 file_name='baboon.bmp';
 secret_image=imread(file_name);
 secret_image=imresize(secret_image,[row,col]);
 stego_image=cover_image;
 for ii=1:row
  for jj=1:col
     stego_image(ii,jj)=bitset(stego_image(ii,jj),1,secret_image(ii,jj));
  end
 end
 imwrite(uint8(stego_image),'Stegoimage.bmp') 

我的提取代码

file_name='Stegoimage.bmp';
stego_image=imread(file_name);
[row,col]=size(stego_image);
for ii=1:row
  for jj=1:col
    extracted_image(ii,jj)=bitget(stego_image(ii,jj),1);
  end
end
extracted_image=uint8(255*extracted_image);

2 个答案:

答案 0 :(得分:1)

你得到(大部分)白色图像,因为大多数像素是255.来自help bitset

  

C = bitset(A,BIT,V)根据V设置位置BIT     V的零值将该位设置为0(关闭),并将非零值设置为     V将该位设置为1(打开)。

由于大多数狒狒像素非零,因此在提取过程中会产生最大强度。

要解决此问题,请通过将每个像素向右移动7位来嵌入秘密图像的MSB。

cover_image = imread('lena.png');
[row,col] = size(cover_image);
secret_image = imresize(imread('baboon.png'),[row,col]);

stego_image = bitset(cover_image,1,bitshift(secret_image,-7));
imshow(uint8(255*bitget(stego_image,1)));

enter image description here

答案 1 :(得分:1)

您获取白色图片的原因是因为命令

bitset(stego_image(ii,jj),1,secret_image(ii,jj));

说"如果secretimage(ii,jj)非零,则将stego的第1位设置为1,否则如果它为零,则将其设置为零"。换句话说,这不符合您的想法。您正在对图像进行编码"狒狒> 0"相反(这确实是一个主要是白色的二进制图像!)。

此外,我认为你可以负担得起更多的比特而不仅仅是最不重要的比特,你隐藏的图像看起来不会降低。这是下面的方法,它改变了Lena图像的前4位,并保留了其他4位。

%% Prepare images
Lena = imread('lena.bmp'); Lena = Lena(:,:,1);
Baboon = imread('baboon.bmp'); Baboon = Baboon(:,:,1);
Baboon = imresize(Baboon, size(Lena));
Baboon = floor(double(Baboon) / 16); % ensure valid integers up to 15 (i.e. 4 bits max)

%% Conceal
Stego = zeros(size(Baboon));
for i = 1 : numel(Lena)
  Stego(i) = bitand(16+32+64+128, Lena(i)); % keep bits 5,6,7 and 8 only.
  Stego(i) = bitor(Stego(i), Baboon(i));    % 'add' bits 1,2,3 and 4.
end
figure(1); imshow(Stego, []);

enter image description here

%% Reveal
Uncovered = zeros(size(Stego));
for i = 1 : numel(Stego)
  Uncovered(i) = bitand(1+2+4+8, Stego(i)); % keep only the first four bits
end
Uncovered = Uncovered * 16; % back to usual uin8 pixel range
figure(2); imshow(Uncovered, [])

enter image description here

您现在已经成功隐藏并检索了8位图像中的4位图像 请注意Lena图像现在看起来有点不那么平滑,就像颜色在陡峭的步骤中增加一样。 (事实上​​它们是4位步+ +狒狒噪声。) 此外,狒狒图像的质量低于原始的8位图像,因为它现在是一个4位图像(即使它已经缩放到8位)。

另外,如果你看得太紧,你可以将BABOON的眼睛作为一个迷失的阴影,只能超过LENA的角度! < /强>