Как инкапсулировать некоторую текстовую информацию в изображение и извлечь ее с помощью MATLAB?

new_img = convert(img, text);
(img, text) = convert_back(new_img);

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


person user198729    schedule 25.04.2010    source источник


Ответы (1)


Я полагаю, вы ищете стеганография. Вы можете начать с этой реализации MATLAB стеганографии LSB.

Простой способ выполнения стеганографии LSB состоит в том, чтобы взять изображение, сжатое без потерь, и установить LSB каждого компонента (R, G, B). Затем для изображения m x n вы получаете 3mn бит для хранения информации. Поскольку вы изменяете LSB, разница не будет воспринимаемый на изображении.

Обновить

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

function LSBStega    
        %%// Image and text
        I = imread('coins.png');
        text = 'Hello World etc';
        assert(numel(I) > numel(text)*8,'Insufficient number of pixels');

        %%// Encode
        %// The end character signifies the end of the hidden text
        end_char = '.';
        %// Append it
        text = [text end_char];
        %// Convert each character into binary form with atleast 8 bits
        %// We transpose it before calling (:) since the binary representation
        %// is stores each character in binary per row and the (:) operations
        %// vectorizes the matrix by column.
        b = transpose(dec2bin(text,8));
        %// Find which bits should be set to 1 or 0
        ind_0 = find(b == '0');
        ind_1 = find(b == '1');
        %// Set the appropriate bits to 1 and 0 and leave the rest alone
        I(ind_0) = bitset(I(ind_0),1,0);
        I(ind_1) = bitset(I(ind_1),1,1);

        %%// Faster decode
        text_back = [];        
        for i = 1:8:numel(I)
            %// Extract the LSB from a set of 8 bytes in the image
            C = bitget(I(i:i+7),1);
            %// Convert from binary to decimal
            C = bin2dec(num2str(C));
            %// Check if it's the end character; break if so, store if not
            if(C == end_char) 
                break;
            else
                text_back(end+1) = C;
            end
        end
        %// Convert to text
        text_back = char(text_back);

        %%// Display
        subplot(1,2,1);
        title('Original');
        imshow(imread('coins.png'));
        subplot(1,2,2);
        title('Steganography Result');
        imshow(I);
        disp(text_back);    
end
person Jacob    schedule 25.04.2010
comment
Я скачал этот инструмент, и он работает как шарм, но есть файлы .p и .fig, как они работают? - person user198729; 25.04.2010
comment
@ user198729: Решил написать небольшой пример. Попробуйте ;) - person Jacob; 25.04.2010
comment
О, это работает! Но я не могу этого понять... Не могли бы вы оставить там больше комментариев? Нравятся b = dec2bin(text,8)'; %' и b = b(:);? - person user198729; 25.04.2010
comment
Ха-ха, конечно. Это стеганография LSB, но я уверен, что есть методы получше, так что удачи! - person Jacob; 25.04.2010
comment
Извините, я до сих пор не понимаю, как работает '; %', я никогда раньше не использовал этот синтаксис, хотя при тестировании я вижу, что он объединяет 8 бит в 16 битовый массив. - person user198729; 25.04.2010
comment
Какие? Нет, нет, нет, %' бесполезен, он просто меняет окраску синтаксиса кода в StackOverflow. Команда ' транспонирует матрицу! - person Jacob; 25.04.2010
comment
Я изменил код, поэтому явно использую команду transpose. - person Jacob; 25.04.2010
comment
Упс, замечательно, никогда раньше не видел, чтобы ' можно было использовать как функцию! Другое сомнение в том, что b = b(:); мне кажется бесполезным, не так ли? Ой, это полезно, но как называется этот синтаксис? - person user198729; 25.04.2010
comment
Да, это бесполезно, я хотел сделать векторизацию явной. Я удалю это. - person Jacob; 25.04.2010