2016-09-26 2 views
0

Я пытаюсь вставить изображение бабуина в изображение лены с помощью lsb embedding method. Когда я пытаюсь извлечь бабуина из изображения stego, он показывает только белое изображение.Извлеченное изображение с стеганографией белое

Может ли кто-нибудь сказать мне, что не так с моим кодом и как исправить проблему?

Вот мой образ бабуона.

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

Вы извлекаете только LSB «зашифрованного» изображения, в то время как остальные пиксели равны нулю. Это означает, что в конечном результате есть только две возможные интенсивности, поэтому вы ничего не видите. У вас нет механизма для восстановления остальной части бит из другого изображения, поскольку вы выбрасываете эту информацию. – rayryeng

+0

то как я должен исправить свой код? – kenreal

+0

Вы не можете. Метод ошибочен. Сделайте что-нибудь еще. – rayryeng

ответ

1

Причина вы получаете белое изображение, потому что команда

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

говорит «если secretimage(ii,jj) отличен от нуля множество 1-й бит Stego к 1, в противном случае, если он равен нулю, равным нулю ». Другими словами, это не делает то, что вы думаете, что это делает. Вместо этого вы кодируете изображение «Baboon> 0» (это действительно белое бинарное изображение!).

Кроме того, я думаю, вы можете позволить себе изменить еще несколько бит, а не только наименее значимые, и ваше скрытое изображение не будет выглядеть таким деградированным. Ниже приведен метод, который изменяет первые 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

Вы успешно скрыты и извлек 4-битное изображение в 8-битное изображение.
Обратите внимание, как изображение Лены выглядит немного менее гладким, как если бы цвета увеличивались в более крутых «шагах». (которые они являются 4-мя шагами + бабуин шум, на самом деле).
А также, как изображение бабуина имеет более низкое качество, чем исходное 8-битное изображение, потому что теперь это 4-битное изображение (хотя оно было уменьшено до 8 бит).

ТАКЖЕ, если приглядеться, Распознать ГЛАЗ бабуина КАК ТЕНЬ обморока, РАЗ ВЫШЕ УГОЛ Лениной HAT !!!

+1

Вы можете обобщить это для битов внедрения 'k' с' stego = uint8 (bitor (бит и (256 - 2^k, обложка), битсфрейт (секрет, k-8))); 'и' extract = uint8 (битдвиг (бит (2^k - 1, stego), 8-k)); '. Предпочтительно, если возможно, и векторное вычисление. – Reti43

1

Вы получаете (в основном) белое изображение, потому что большинство пикселей 255. От help bitset:

C = битсет (A, BIT, V) устанавливает бит в позиции BIT в соответствии с V.
Нулевые значения V устанавливают бит в 0 (выкл.), А ненулевые значения
V устанавливает бит в 1 (на).

Поскольку большинство пикселов бабуина отличны от нуля, это приведет к максимальной интенсивности во время извлечения.

Чтобы исправить это, вставьте MSB секретного изображения, сдвинув каждый пиксель на 7 бит вправо.

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