【问题标题】:Extracted image with steganography is white使用隐写术提取的图像是白色的
【发布时间】:2017-02-03 18:11:45
【问题描述】:

我正在尝试使用lsb embedding method 将狒狒图像插入到 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);

【问题讨论】:

  • 您只提取“加密”图像的 LSB,而其余像素为零。这意味着最终结果中只有两种可能的强度,这就是为什么您什么都看不到的原因。当您丢弃该信息时,您没有任何机制可以从其他图像中恢复其余位。
  • 那我应该如何修复我的代码?
  • 你不能。方法有缺陷。做点别的。
  • 好的。这是先生的主意吗?我还是隐写术的新手。
  • 我对隐写术一无所知。我所做的只是指出为什么你的方法不起作用。

标签: matlab steganography


【解决方案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, []);

%% 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 图像现在看起来不太平滑,好像颜色以更陡峭的“阶梯”增加。 (实际上是 4 位步长 + 狒狒噪音)。
以及狒狒图像的质量如何低于原始 8 位图像,因为它现在是 4 位图像(即使它已缩小到 8 位)。

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

【讨论】:

  • 你可以用stego = uint8(bitor(bitand(256 - 2^k, cover), bitshift(secret, k-8)));extract = uint8(bitshift(bitand(2^k - 1, stego), 8-k));k嵌入位进行推广。在可能的情况下,向量化计算也是可取的。
【解决方案2】:

你得到一个(大部分)白色图像,因为大多数像素是 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)));

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 2011-02-17
    • 1970-01-01
    • 2015-06-02
    • 2014-04-28
    • 2014-01-24
    • 2018-08-01
    • 2014-06-02
    • 2011-09-27
    相关资源
    最近更新 更多