2016-09-26 41 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