A list,

1 Introduction to LSB algorithm

LSB, short for Least Significant Bit, is a simple and effective data hiding technique. The basic method of LSB steganography is to replace the lowest bit of the carrier image with the secret information to be embedded. The high level plane of the original image and the lowest plane representing the secret information form a new image containing hidden information.



The grayscale image stores pixels in a single channel format, with each pixel value ranging from 0 to 255, and the pixel’s bitplane is each bit of the corresponding binary pixel. For example, a pixel with a value of 78, binary 01001110, has a decreasing bit weight from left to right, and the most significant bit (MSB) on the left has a bit weight of 2 72 ^72

7

), the rightmost bit is the least significant bit (LSB, bit weight is 20 02 ^02

0

). The same bits of each pixel are extracted to form a new plane, which is called the bitplane of the graph. The LSB steganography, as its name suggests, inserts/hides information in the LSB, the lowest level plane.

It should be noted that when LSB is embedded, the carrier image format should be grayscale

Taking the famous Lena graph as an example, the following is the original Lena graph of grayscale graph:



Here is the plan of its bits, descending from left to right and top to bottom:



It can be seen that the higher the bit plane is, the more information of the original image is contained, the greater the contribution to the gray value of the image is, and the stronger the correlation between adjacent bits is, and vice versa. The LSB lowest level plane basically contains no image information, like random noise/noise, so you can fill in watermark/secret information here.

The embedding diagram is as follows:



When different bit planes are selected for embedding, the fidelity of LSB algorithm is as follows:

2 Algorithm Principle

Generally speaking, the picture we see is made up of small pixels, all of which are put together to form a big square, and this big square is the image we see. A grayscale image (also known as a black and white image) consists of one layer of pixels, while a color image consists of three layers of grayscale images. Take grayscale image as an example. The reason why we can see black and white on the image is that each pixel has a different pixel value. 0 is pure black, 255 is pure white, and gray is made up of the value between these two numbers. The closer you get to 0, the darker you get, and the whiter you get to 255. So why 0 and 255? Because the computer is binary, it will use 8 bits to represent a pixel (you can also use more bits, so the more the color of the image classification, image will occupy more space at the same time, but the eyes of ordinary people do not recognize so much color, different from ordinary people unless you), so the maximum value is 255, the lowest is 0. LSB hides information based on the binary system. Because human eyes are not very sophisticated color or brightness sensors, a slight change of pixel gray level by 1 is not detected by human eyes, that is, modifying the smallest bit of 8-bit binary code. When we change the last bit of each pixel of the image to the way we want it, it shows the information we want, but the user can’t see it, and it doesn’t affect the content of the image. This is the LSB digital watermark.

3. Basic characteristics of LSB algorithm:

LSB is a high-volume data hiding algorithm

The robustness of LSB is relatively poor (when steGO image encounters signal processing, such as adding noise, lossy compression, etc., it will be lost when extracting embedded information)

4 common EMBEDDING methods of LSB algorithm:

The secret information is continuously embedded in the lowest plane until the end, and the rest is not processed (typical MandelSteg software)

The secret information is continuously embedded in the lowest plane until the end, and the rest of the processing is randomized (also known as desertification processing, typical software PGMStealth).

The secret information is embedded in the least – and sub- low – order plane continuously and simultaneously

The secret information is embedded in the lowest level plane. After the lowest level plane is fully embedded, the secret information is embedded in the second level plane

The secret information is randomly embedded in the lowest plane

The above five methods have different robustness when the embedding capacity is different

Ii. Source code

function varargout = shuiyin(varargin)
% SHUIYIN MATLAB code for shuiyin.fig
%      SHUIYIN, by itself, creates a new SHUIYIN or raises the existing
%      singleton*.
%
%      H = SHUIYIN returns the handle to a new SHUIYIN or the handle to
%      the existing singleton*.
%
%      SHUIYIN('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in SHUIYIN.M with the given input arguments.
%
%      SHUIYIN('Property'.'Value',...). creates anew SHUIYIN or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before shuiyin_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to shuiyin_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one % instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help shuiyin

% Last Modified by GUIDE v2. 5 12-Dec- 2019. 21:53:08

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @shuiyin_OpeningFcn, ...
                   'gui_OutputFcn',  @shuiyin_OutputFcn, ...
                   'gui_LayoutFcn', [],...'gui_Callback'[]);if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before shuiyin is made visible.
function shuiyin_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to shuiyin (see VARARGIN)

% Choose default command line output for shuiyin
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes shuiyin wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = shuiyin_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[filename1, pathname1] = uigetfile('*.jpg'.'Select watermark Image');
global pathfile1;
global pathfre1;
pathfile1=fullfile(pathname1, filename1);
pathfre1 = pathname1;
I0=rgb2gray(imread(pathfile1));
mrows=256;
ncols=256;
input=imresize(I0,[mrows ncols]);
axes(handles.axes1);axis off
imshow(input);
title('Original image');

handles.input=input;
guidata(hObject, handles);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[filename2, pathname2] = uigetfile('*.jpg'.'Select watermark Image'); global pathfile2; global pathfre2; pathfile2=fullfile(pathname2, filename2); pathfre2 = pathname2; M0=rgb2gray(imread(pathfile2)); axes(handles.axes2); axis off mrows=256;
ncols=256;
water=imresize(M0,[mrows ncols]);
imshow(water);
title('watermark'); 
f=water;
I=handles.input;
for k=1:92% number of iterations is T=192timefor x=1:256% image size is256x256
        for y=1:256
            x1=x+y;
            y1=x+2*y;
            if x1>256
                x1=mod(x1,256);
            end
            if y1>256
                y1=mod(y1,256);
            end
            if x1==0
                x1=256;
            end
            if y1==0
                y1=256;
            end
            f_ar(x1,y1)=f(x,y); end end f=f_ar; End % * * * * * * * * * * * * * * * * by * * * * * * * * * * * * * * * * * * * * * * * * * * I_1_0 =bitset(I,1.0);
J=bitset(I_1_0,1,f_ar); % * * * * * * * * * * * * * * * * * * * * * to extract the watermark * * * * * * * * * * * * * * * * * * * * * f_get = bitget (J,1); %************* decryption ************ fg=mat2gray(double(f_get)); %doubleType must be displayed with MAT2grayfor k=1:100% Number of iterations is192timefor x=1:256% image size is256x256
        for y=1:256
            x1=x+y;
            y1=x+2*y;
            if x1>256
                x1=mod(x1,256);
            end
            if y1>256
                y1=mod(y1,256);
            end
            if x1==0
                x1=256;
            end
            if y1==0
                y1=256;
            end
            f_re(x1,y1)=fg(x,y);
        end
    end
Copy the code

3. Operation results

Fourth, note

Version: 2014a complete code or write plus 1564658423