Встраивание персонажа в изображение

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

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 вашей входной строки.


Первое, что пошло не так - преобразование char в двоичный файл:
Преобразование символа в его двоичное представление должно быть сделано с помощью 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!
Другие вопросы по тегам