[Proyecto] Marca de agua de imagen y audio basada en el espacio aéreo de Matlab GUI LSB, DWT, algoritmo DCT [Contiene el código fuente de Matlab 618]

1. Introducción

1 Introducción al algoritmo
LSB LSB se denomina bit menos significativo (bit menos significativo), que es una tecnología de ocultación de datos simple y eficaz. El método básico de la esteganografía LSB es reemplazar el bit más bajo de la imagen portadora con la información secreta que se incrustará. El plano superior de la imagen original y el plano más bajo que representa la información secreta forman una nueva imagen que contiene información oculta.
Inserte la descripción de la imagen aquí
La imagen en escala de grises almacena píxeles en un formato de un solo canal, y cada píxel tiene un valor entre 0 y 255, y el plano de bits del píxel corresponde a cada bit del píxel binario. Tome la imagen de arriba como ejemplo, el valor de un determinado píxel es 78, su valor binario es 01001110 y el peso de bit disminuye de izquierda a derecha. El bit más a la izquierda es el bit más significativo (MSB, cuyo peso de bit es 2 7 2 ^ 72
7
), y el bit más a la derecha El bit menos significativo (LSB, el peso del bit es 2 0 2 ^ 02
0
). Los mismos bits de cada píxel se extraen para formar un nuevo plano, que es el llamado plano de bits de la imagen. El algoritmo de esteganografía LSB, como su nombre indica, incrusta / oculta información en el LSB, que es el plano de bits más bajo.

Una cosa a tener en cuenta es que cuando LSB está incrustado, el formato de imagen de portadora debe ser un formato de imagen en escala de grises.

Tome la famosa imagen de Lena como ejemplo, la siguiente es la imagen original de la imagen en escala de grises de Lena: la
Inserte la descripción de la imagen aquí
siguiente son sus diversas
Inserte la descripción de la imagen aquí
imágenes de plano de bits, de izquierda a derecha, de arriba a abajo, los planos de bits disminuyen a su vez: puede ver que cuanto más alto es el plano de bits, la información de la imagen original contenida. Cuanto más, mayor es la contribución al valor de gris de la imagen y más fuerte es la correlación entre los bits adyacentes, y viceversa. El plano de bits más bajo del LSB básicamente no contiene información de imagen, similar al ruido / ruido aleatorio, por lo que puede completar la marca de agua / información secreta aquí.

El diagrama de incrustación es el siguiente: Al
Inserte la descripción de la imagen aquí
seleccionar diferentes planos de bits para la incrustación, la fidelidad del algoritmo LSB:
Inserte la descripción de la imagen aquí2 Principio del algoritmo
En términos generales, las imágenes que vemos están compuestas de píxeles pequeños y todos los píxeles se colocan juntos para formar un cuadrado grande , este gran cuadrado es la imagen que vemos. Una imagen en escala de grises (es decir, lo que normalmente llamamos una imagen en blanco y negro) se compone de una capa de píxeles, mientras que una imagen en color se compone de tres capas de esas imágenes en escala de grises. A continuación se muestra un ejemplo de una imagen en escala de grises. La razón por la que podemos ver blanco y negro en la imagen es porque el valor de píxel de cada píxel es diferente. 0 significa negro puro, 255 significa blanco puro y el gris se compone del valor entre estos dos números. Cuanto más cerca de 0, más oscuro, más cerca de 255 más blanco. Entonces, ¿por qué son 0 y 255? Debido a que la computadora es binaria, usa 8 bits para representar un píxel (también se pueden usar más bits, de modo que la gradación de color de la imagen será mayor y la imagen también ocupará más espacio, pero los ojos de la gente común no son No se pueden reconocer tantos colores, a menos que sea diferente de la gente común), por lo que el valor máximo es 255 y el mínimo es 0. lsb oculta información basada en la característica del sistema binario, porque el ojo humano no es un perceptrón de color o brillo muy preciso, por lo que el ojo humano no notará el ajuste fino del nivel de gris de píxeles 1 hacia arriba y hacia abajo, es decir, modificar 8. El bit más pequeño de un código binario. Cuando cambiamos el último bit de cada píxel de la imagen según nuestras ideas, mostrará la información que queremos, pero el usuario no puede verla, ni afectará el contenido de la imagen. Esta es la marca de agua digital lsb.
3 Las características básicas del algoritmo LSB:
LSB es un algoritmo de ocultación de datos de gran capacidad
. La robustez de LSB es relativamente pobre (cuando la imagen stego encuentra procesamiento de señal, como: ruido, compresión con pérdida, etc., se utilizará cuando se extrae información incrustada. Perdida)
4 El método de incrustación del algoritmo LSB común: la
información secreta se incrusta continuamente en el plano de bits más bajo hasta el final, y la parte restante no se procesa (software típico MandelSteg). La
información secreta se incrusta continuamente en el plano de bits más bajo hasta el final, y la parte restante es aleatoria (también llamado tratamiento de desertificación, software típico PGMStealth)
Información secreta incrustada continuamente en el plano de bits menos significativo, y una vez en el plano inferior y se incrusta simultáneamente en el plano de bits menos significativo y en un plano inferior secundario, la
información secreta está incrustada en el plano de bits menos significativo, por lo que el plano de bits más bajo es incrustado completamente incrustado después de los tiempos de reincorporación plano inferior de
la información secreta en el nivel más bajo Incrustación aleatoria en el plano de bits Los
cinco métodos anteriores, cuando la capacidad de incrustación es diferente, la robustez es diferente

En segundo lugar, el código fuente

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 a new 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(*.*)'},'选择图片文件');
if isequal([filename pathname],[0,0])
    return;
end
str=[pathname filename];%选择的文件路径和文件名
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(*.*)'},'选择图片文件');
if isequal([filename pathname],[0,0])
    return;
end
str=[pathname 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=size*size/(block*block);%总块的个数
%alpha=1/3000;  %归一化
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));

%==================R分量的嵌入========================
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分量的嵌入=================

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分量的嵌入====================
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

Tres, resultados en ejecución

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Cuatro, comentarios

Complete el código o escriba en nombre de agregar QQ 1564658423

Supongo que te gusta

Origin blog.csdn.net/TIQCmatlab/article/details/115184712
Recomendado
Clasificación