2014-12-24 10 views
0

Итак, вот что я пытался сделать. Я абсолютно не знаком с Matlab. Это был только день или около того, что я использовал его, и вот что-то, что мой учитель попросил меня сделать. Встраивание операторов или группы строк в изображение с использованием алгоритма LSB. Строка должна быть прочитана из файла. На данный момент я не использовал никаких операций с файлами. Я пытаюсь использовать один символ, и я не знаю, что случилось. Алгоритм кажется простым, но мой вывод i.e, как обложка, так и steg пикселей показывают одинаковое значение. :(Вложение символа в изображение

cover=imread('D:\l.jpg'); 
steg=cover; 
l=1; 
LSB=0; 
height = size (cover, 1); 
width = size (cover, 2); 
message = 'J' ; 
mdec = uint8(message); 
mbin = dec2bin(mdec, 8); 
mbins= mbin(:); 
len=length(mbins); 

for i = 1:height 
for j = 1:width 
     if(l<=len) 
      LSB = mod(cover(i,j), 2); 
      if(mbins(l)==LSB) 
       steg(i,j) = cover(i,j); 
      else if (mbins(l)~=LSB && LSB==1 && mbins(l)==0) 
       steg(i,j) = cover(i,j)-1; 
      else if (mbins(l)~=LSB && LSB==0 && mbins(l)==1) 
       steg(i,j) = cover(i,j)+1; 

       end 
       end 
       end 
        l=l+1; 
     end 
end 

end 
imwrite(steg,'D:\hidden.jpg'); 
%imshow(steg) 
cover(1, 1:8) 
steg(1, 1:8) 

ответ

1

О, вложенные циклы ... это не путь.

Вы хотите заменить младшие биты первых l пикселей с двоичным ASCii представлением вашей входной строки.


Первое, что пошло не так - преобразование в двоичный символ:
преобразование символа в его двоичном представлении должно быть сделано с помощью bitget

>> bitget(uint8('J'), 1:8) 
0 1 0 1 0 0 1 0 

возвращает 1-по-8 двоичная массив, при использовании dec2bin:

>> dec2bin(uint8('J'), 8) 
01001010 

возвращает 1 на 8 строки: фактические числовые значения этого массива являются

>> uint8(dec2bin(uint8('J'), 8)) 
48 49 48 48 49 48 49 48 

Вы можете оценить разницу между два метода?

Если вы настаиваете на использовании dec2bin, рассмотрим

>> dec2bin(uint8('J'), 8) - '0' 
0  1  0  0  1  0  1  0 

Вторая точка - вложенные циклы:
Matlab выступает вектор/матричных векторизации операций, а не петлями.

Вот хороший способ сделать это без циклов, предполагая, что cover - изображение серого масштаба (то есть оно имеет только один цветной канал, а не 3) типа uint8.

NoLsb = bitshift(bitshift(cover, -1), 1); %// use shift operation to set lsb to zero 
lsb = cover - NoLsb; %// get the lsb values of ALL pixels 
lsb(1:l) = mbins; %// set lsb of first l pixels to bits of message 
steg = NoLsb + lsb; %// this is it! 
+0

Благодарим за внимание. Мне кажется, что я понимаю, что пошло не так в первой части. Мне нужно было вычесть значение ascii из каждого из элементов двоичного массива, чтобы получить желаемое значение. Это 0 или 1. dec2bin (uint8 ('J')) предоставляет мне массив, который по сути является строкой , но это то, чего я не хочу. Мне нужны точные значения каждого из элементов массива, так что их числовое значение равно 0 или 1. а не что-нибудь еще. Наверное, это то, что вы хотите сказать? – Xavier

+0

@ Xavier - вы поняли это правильно. это то, что я пытался объяснить в первой части моего ответа. Я считаю, что внесение этой поправки в ваш код заставит ее работать, но я настоятельно рекомендую вам изучить вторую часть, а также более «Matlab» -ish-подход, чем вложенный цикл. – Shai

+0

Да. Думаю, я понимаю вторую часть алгоритма. Это делает вещи намного проще. Я попробовал использовать матрицу 3 x 3, чтобы очистить вещи, и я понимаю, как это работает. Большое спасибо! – Xavier

 Смежные вопросы

  • Нет связанных вопросов^_^