一、简介

1 LSB算法简介
LSB全称为 Least Significant Bit(最低有效位),是一种简单而有效的数据隐藏技术。LSB隐写的基本方法是用欲嵌入的秘密信息取代载体图像的最低比特位,原来的图像的高位平面与代表秘密信息的最低平面组成含隐蔽信息的新图像。

灰度化的图像为单通道格式存储像素,每个像素值在0~255内,而像素的位平面则是对应二进制的像素的各个位。以上图为例,某个像素的值为78,其二进制01001110,从左到右位权依次降低,最左边为最高有效位(MSB,其位权为 2 7 2^72
7
),最右边位最低有效位(LSB,位权为2 0 2^02
0
)。把每个像素的相同位抽取出来组成一个新的平面,就是所谓的图的位平面。而LSB隐写算法,如其名字,是在LSB也就是最低位平面进行信息嵌入/隐藏。

需要注意的一点是,LSB嵌入的时候,载体图像格式应该为灰度图格式

以著名的Lena图为例,一下是灰度图Lena原图:

下面是其各个位平面图,从左到右、从上到下位平面依次降低:

可以看到,位平面越高包含的原图像信息越多,对图像的灰度值贡献越大,并且相邻比特的相关性也越强,反之则相反。LSB最低位平面基本上不包含图像信息了,类似随机的噪点/噪声,因此,可以在此处填入水印/秘密信息。

嵌入示意图如下:

选取不同位平面嵌入时,LSB算法的保真度:
2 算法原理
通俗来讲我们看到的图片都是由一个个小的像素点来构成的,所有像素点摆在一起,构成一个大方块,这个大方块就是我们所见的图像。灰度图像(也就是我们平时所说的黑白图像)是由一层像素点组成的,而彩色图像是由三层这样的灰度图像组成的。这里拿灰度图像举例,我们之所以能在图像上看到黑色和白色,是因为每个像素点的像素值不同。0表示纯黑,255表示纯白,灰色就是由这两个数字之间的值构成。越靠近0越黑,越靠近255越白。那为什么是0和255呢?因为计算机是二进制,它会用8个比特来表示一个像素点(也可以用更多的比特,这样图像的颜色分级就越多,同时图像也会占用更大的空间,但是普通人的眼睛并不能辨认这么多的颜色,除非你异于常人),所以最大值是255,最小是0。lsb就是基于2进制这一特点来隐藏信息的,因为人眼并不是很精密的颜色或亮度的感知器,所以把像素灰度上下微调1是不会被人眼察觉的,也就是修改8位二进制码中最小的一位。当我们把图片每个像素的最后一位按照我们的想法改变,使他表现为我们想要的信息,但用户却不能看出,也不会影响图片的内容。这就是lsb数字水印。
3 LSB算法的基本特点:
LSB是一种大容量的数据隐藏算法
LSB的鲁棒性相对较差(当stego图像遇到信号处理,比如:加噪声,有损压缩等,在提取嵌入信息时会丢失)
4 常见LSB算法的嵌入方法:
秘密信息在最低位平面连续嵌入至结束,余下部分不作任何处理(典型软件MandelSteg)
秘密信息在最低位平面连续嵌入至结束,余下部分随机化处理(也称沙化处理,典型软件PGMStealth)
秘密信息在最低位平面和次低位平面连续嵌入,并且是同时嵌入最低位平面和次低位平面
秘密信息在最低位平面嵌入,等最低位平面嵌入完全嵌入之后,再嵌入次低位平面
秘密信息在最低位平面随机嵌入
以上五种方式,当嵌入容量不同时,鲁棒性不同

二、源代码

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});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_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:blocknumx=(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:blocknumx=(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:blocknumx=(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

三、运行结果



四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

【图像隐写】基于matlab GUI LSB+DWT+DCT音频水印【含Matlab源码 618期】相关推荐

  1. 【图像处理】基于matlab GUI多功能图像处理系统【含Matlab源码 1876期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像处理]基于matlab GUI多功能图像处理系统[含Matlab源码 1876期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  2. 【机械仿真】基于matlab GUI曲柄摇杆机构运动仿真【含Matlab源码 1608期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI曲柄摇杆机构运动仿真[含Matlab源码 1608期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  3. 【光学】基于matlab GUI光栅条纹投影生成【含Matlab源码 2118期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI光栅条纹投影生成[含Matlab源码 2118期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  4. 【机械仿真】基于matlab GUI直齿圆柱齿轮应力计算【含Matlab源码 2077期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI直齿圆柱齿轮应力计算[含Matlab源码 2077期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

  5. 【天体学】基于matlab GUI太阳天顶角计算【含Matlab源码 2229期】

    一.⛄获取代码方式 获取代码方式1: 完整代码已上传我的资源:[天体学]基于matlab GUI太阳天顶角计算[含Matlab源码 2229期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  6. 【语音去噪】基于matlab GUI IIR滤波器语音去噪【含Matlab源码 1864期】

    一.语音处理简介 语言是人们获得各类有效信息的主要途径, 而语音是语言的表现形式.语音在一定程度上可影响人们的生活, 因此, 语音信号的研究对科学领域和人们日常生活具有一定的研究价值和意义.噪声广泛存 ...

  7. 【身份证识别】基于matlab GUI BP神经网络身份证识别【含Matlab源码 2239期】

    ⛄一.身份证号码识别简介 1 引言 当今是一个信息高度发达的时代,对于每个公民而言身份证那一连串的数字体现了个人信息的唯一性,出于保障公民合法权益和社会治安的考虑,越来越多的行业都开始建立自己的安全保 ...

  8. 【数学建模】基于matlab GUI平行停车模拟仿真【含Matlab源码 1877期】

    一.平行停车模拟仿真简介 近年来, 随着我国经济的快速发展, 机动车保有量也迅速增长.截至2012年底, 全国机动车保有量已达2.4亿辆, 城市"停车难"的问题日趋严重.统计结果表 ...

  9. 【人脸识别】基于matlab GUI KL变换人脸识别【含Matlab源码 859期】

    ⛄一.KL变换人脸识别简介 人脸识别是指基于己知的人脸样本集,利用图像处理和模式识别的技术从静态或动态场景中,识别或验证一个或多个人脸.人脸识别技术跨越了图像处理.模式识别.计算机视觉.生物学.神经生 ...

  10. 【限速标志识别】基于matlab GUI形态学限速标志识别【含Matlab源码 1142期】

    ⛄一.SVM路标检测识别简介 1 路标识别 完整的路标识别系统包括:图像的获取与预处理,图像分割(路标定位),特征提取,模式分类(路标识别)等部分.其中模式分类是系统的关键技术.较常用的模式分类方法是 ...

最新文章

  1. Sliverlight之 画刷
  2. 亿条数据读取工具_仅需1秒!搞定100万行数据:超强Python数据分析利器
  3. Webrtc服务器搭建转
  4. NodeJs——(8)http.ServerRequest的过程
  5. JS传值中文乱码解决方案
  6. Diy Win7 OEMlogo
  7. 【回眸】Lunix内核 网络编程
  8. PHP开发基础(一)
  9. python掷骰子猜大小
  10. mac上配置cordova开发Android平台APP环境
  11. Canva在线免费图表制作工具
  12. 题目:利用指针知识,写一函数,求一个字符串的长度
  13. CE修改植物大战僵尸豌豆射手的射速
  14. 计算机相关的专刊,计算机 | 1区SCI期刊专刊信息1条
  15. 如何提取视频中的音频?自用方法介绍
  16. mysql8实战_实战MySQL8.0.17 Clone Plugin
  17. Linux安装expect
  18. 详解-Android各种提示框
  19. Window11 多屏任务栏设置(修改注册表)
  20. 如何使32位Win7支持超过4GB的内存,而不装64位

热门文章

  1. alexnet- tensorflow
  2. BZOJ2754 [SCOI2012]喵星球上的点名
  3. Mysql :removeAbandonedTimeout:180
  4. 如何查看80端口被占用
  5. ubuntu-12.04.4-server安装
  6. Jquery关闭离开页面时提醒
  7. google Inception v1 - v4 papers 发展历程
  8. 2020-12-28 learning opencv3: 十:Smoothing
  9. atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29
  10. Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception process Vob7