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 = gui(varargin)
% GUI MATLAB code for gui.fig
%      GUI, by itself, creates a new GUI or raises the existing
%      singleton*.
%
%      H = GUI returns the handle to a new GUI or the handle to
%      the existing singleton*.
%
%      GUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI.M with the given input arguments.
%
%      GUI('Property'.'Value',...). creates anew GUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before gui_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to gui_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 gui

% Last Modified by GUIDE v2. 5 05-Jan- 2017. 11:30:52

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @gui_OpeningFcn, ...
                   'gui_OutputFcn',  @gui_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 gui is made visible.
function gui_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 gui (see VARARGIN)

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

% Update handles structure
guidata(hObject, handles);

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


% --- Outputs from this function are returned to the command line.
function varargout = gui_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 open_original.
function open_original_Callback(hObject, eventdata, handles)
global Raw_image
[filename, pathname]=uigetfile({'*.bmp'.'ALL FILES(*.*)'},'Select image file');
if isequal([filename pathname],[0.0])
    return; end str=[pathname filename]; % Selected file path and file name Raw_image=imread(STR); axes(handles.axes1); imshow(Raw_image); %hObject    handle to open_original (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --- Executes on button press in open_wartermark.
function open_wartermark_Callback(hObject, eventdata, handles)
global mark
[filename, pathname]=uigetfile({'*.bmp'.'ALL FILES(*.*)'},'Select image file');
if isequal([filename pathname],[0.0])
    return; end str=[pathname filename]; % Selected file path and filename mark=imread(STR); axes(handles.axes2); imshow(mark); %hObject    handle to open_wartermark (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --- Executes on button press in embed.
function embed_Callback(hObject, eventdata, handles)
global rawImage
global mark
global embedImage
global markr
global markg
global markb
global alpha
size=512;
block=8; blocknum=size/block; % Number of blocks per row or column Number=size*size/(block*block); % Number of blocks %alpha=1/3000; % normalized T1=3;
rawImage=zeros(size,size);
embedImage=zeros(size,size);
embedImager=zeros(size,size);
embedImageg=zeros(size,size);
embedImageb=zeros(size,size);
bw=zeros(size,size);
block_dct1=zeros(block,block);


imshow(mark);
markr=double(mark(:,:,1));
markg=double(mark(:,:,2));
markb=double(mark(:,:,3));




rawImage = imread('lena.bmp');
rawImager=double(rawImage(:,:,1));
rawImageg=double(rawImage(:,:,2));
rawImageb=double(rawImage(:,:,3)); %================== the embedding of R components ========================for m=1:blocknum
for n=1:blocknum
        x=(m- 1)*block+1;
        y=(n- 1)*block+1;
        block_dct1=rawImager(x:x+block- 1,y:y+block- 1); 
        block_dct1=dct2(block_dct1);
        bw_8_8=bw(x:x+block- 1,y:y+block- 1);
        block_dct1(1.1)=block_dct1(1.1) * (1+alpha*(markr(m,n)));
        block_dct1=idct2(block_dct1);
        embedImager(x:x+block- 1,y:y+block- 1)=(block_dct1); End end % = = = = = = = = = = = = = = = = = = = = = = G component of embedded = = = = = = = = = = = = = = = = =for m=1:blocknum
for n=1:blocknum
        x=(m- 1)*block+1;
        y=(n- 1)*block+1;
        block_dct1=rawImageg(x:x+block- 1,y:y+block- 1); 
        block_dct1=dct2(block_dct1);
        bw_8_8=bw(x:x+block- 1,y:y+block- 1);
        block_dct1(1.1)=block_dct1(1.1) * (1+alpha*(markg(m,n)));
        block_dct1=idct2(block_dct1);
        embedImageg(x:x+block- 1,y:y+block- 1)=(block_dct1); End end % = = = = = = = = = = = = = = = = = = = = B component of embedded = = = = = = = = = = = = = = = = = = = =for m=1:blocknum
for n=1:blocknum
        x=(m- 1)*block+1;
        y=(n- 1)*block+1;
        block_dct1=rawImageb(x:x+block- 1,y:y+block- 1); 
        block_dct1=dct2(block_dct1);
        bw_8_8=bw(x:x+block- 1,y:y+block- 1);
        block_dct1(1.1)=block_dct1(1.1) * (1+alpha*(markb(m,n)));
        block_dct1=idct2(block_dct1);
        embedImageb(x:x+block- 1,y:y+block- 1)=(block_dct1); 
end
end
Copy the code

3. Operation results





Fourth, note

Version: 2014 a