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

Extracted image with steganography is white

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

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

这是我的狒狒图片。

这是我的 lena 图片。

我的嵌入代码

 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);

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

C = bitset(A,BIT,V) sets the bit at position BIT according to V.
Zero values of V sets the bit to 0 (off), and non-zero values of
V sets the bit to 1 (on).

由于大多数狒狒像素不为零,因此在提取过程中会达到最大强度。

要解决此问题,请通过将每个像素向右移动 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)));

您得到白色图像的原因是因为命令

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

在说"if secretimage(ii,jj) is nonzero set the 1st bit of stego to 1, otherwise if it's zero set it to zero"。换句话说,这并没有按照您认为的那样去做。您正在对图像 "Baboon>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, []);

%% 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, [])

您现在已成功隐藏和检索 8 位图像中的 4 位图像。
请注意 Lena 图像现在看起来有点不那么平滑,好像颜色增加得更陡峭 'steps'。 (实际上是!4 位步长 + 狒狒噪声)。
以及狒狒图像的质量如何低于原始 8 位图像,因为它现在是 4 位图像(即使它已缩减为 8 位)。

另外,如果你仔细观察,你会发现狒狒的眼睛是一个微弱的影子,就在莉娜帽子的角上方!!!