2016-09-26 42 views
0

我试图用lsb embedding method将狒狒图像插入lena图像。当我尝试从隐秘图像中提取狒狒时,它只显示一张白色图像。用隐写术提取的图像是白色的

任何人都可以告诉我我的代码有什么问题,以及如何解决这个问题?

这是我的狒狒图像。

enter image description here

这是我的lena图像。

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

您只提取“加密”图像的LSB,而其余像素为零。这意味着最终结果只有两种可能的强度,这就是为什么你什么都看不到。您没有任何机制可以在丢弃该信息时从其他图像中恢复剩余的位。 – rayryeng

+0

那么我应该如何修复我的代码? – kenreal

+0

你不能。该方法有缺陷。做别的事。 – rayryeng

回答

1

你得到一个白色图像的原因是因为该命令

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

时说:“如果secretimage(ii,jj)是非零设置隐秘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图像现在看起来不太平滑,好像颜色以更陡峭的“台阶”增加。 (事实上​​,它们是!4bit阶跃+狒狒噪音)。
此外,狒狒图像的质量比原始8位图像的质量还差,因为它现在是4位图像(即使它已缩小到8位)。

另外,如果你仔细观察,你能发现狒狒'S EYE AS一个淡淡的影子,略高于LENA的帽子的角度!

+1

你可以用'stego = uint8(bitor(bitand(256 - 2^k,cover),bitshift(secret,k-8)));'''extract = uint8(bitshift( bitand(2^k-1,stego),8-k));'。在可能的情况下,矢量化计算也是优选的。 – Reti43

1

你得到一个(大部分)白色图像,因为大多数像素是255从help bitset

C = bitset(A,BIT,V)根据V设置位置BIT处的位。
V的零值将该位设置为0(关闭),并且非零值将该位设置为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