【图像隐写】基于matlab GUI DCT+FFT数字水印嵌入+攻击+提取(带面板)【含Matlab源码 1760期】
一、DCT数字水印简介
1 前言
随着网络通信技术的发展,社会节奏的加快,网络通信技术的成熟,需求也开始发生改变,人们对便利的需求也越来越大,通过将媒体信息数字化,使得信息表达的精准和效率得到了明显提升。数字化也可以实现信息存储的便利性,同时数字信息也能方便和快速地通过电子设备进行传输。因此,数字交换传输过程越来越简易。
这样的便利固然舒适,但是伴随的副作用也快速被发现,急切需要一种技术对密码学进行补充。现如今网络中时常出现的产权问题也被得到了重视。数字水印技术的出现大大缓解了这一情况,如若内容被进行了解密处理,这种新的信息技术仍能发挥它的效用,继续起到对信息的保护作用。
2 数字水印算法的基本要求
2.1 数字水印的定义
数字水印技术进行工作的前提是,原始载体不能受到影响。默默保护信息不被打扰不被发现是它的优势。所谓的数字水印是需要在载体文件中镶嵌一些保护信息,数字化的图像、影像、文字都是载体文件。也可以这样认为,数字水印是采用扩频通信手段在宽窄信道之间传输的一种水印信号。使用者可以通过识别载体文件中的保护信息来推断初始信息有没有被篡改,还可以从中得到其中的隐含信息。因此可以将水印信号表示为:
我们能够利用序列来表示水印信息,简单和复杂的水印信号都有对应序列;其中一维和二维序列表示较为简单的水印信号,三维或者多维的数组来表示比较复杂的水印信号。在式中A表示整个公式的一个取值范围、M表示水印信号的长度。水印信息一样也可以使用数组来表示,数组的维数的多少代表信息的复杂程度,一般一维序列是用来表示音频文件的;如果载体是图像,那对应的水印就是二维数组;载体是动画,相应的水印就是三维信号。
2.2 数字水印技术有以下四个方面的特点:
(1)安全性
信息一定是需要安全来保证的,不管在任何应用领域中,这都会是最重要的需求之一。而数字水印不仅能够保证信息的安全还能保障信息不被篡改和伪造。信息的安全不仅体现在不被偷窃还体现在误检测率要较低。数字水印的信息应该随着初始内容的改变而实时变化;数字水印的安全性越强则抵抗性越强。
(2)隐蔽性
数据在符合规则的使用情况下,不会使原本的保护的文字、图像、音频等得到降质,保证质量同时还很难被察觉,具有不可察觉的优势。
(3)鲁棒性
经过多次信号处理或者攻击之后,水印信息中的数据不被破坏,且识别结果也不会发生偏差,图像很容易被攻击就很容易将信息泄露。平移、旋转、剪切、滤波、量化、采样、转换等都是信号的处理过程。数字水印是将一些不能被看见的信息嵌入到内容数据中,通常情况下是使用在版权保护中,或者用于保护内容数据的完整性。这也是数字水印保证信息不被篡改的方式。这样可以掩盖原本的信息将现有信息进入到破坏者眼中,从而造成干扰。
(4)水印容量
考虑到整个通信领域对于隐蔽性的要求偏高,并且需求不断增长,所以数字水印的水印容量也根据该情况做出了相应的调整。在此调整的基础上,水印容量也需要加强自身的能力,将自己承载信息的能力变强,只有这样才能将图像中所需要的信息都嵌入都水印中。正是因为通信领域的独特性,数字水印在这方面的努力也使得数字水印在这个领域中非常受欢迎,并且水印容量中所承载的信息能够将初始图像的所有信息都标明。版权纠纷就是因为所属者标识不清晰才会产生,这种做法可以尽可能防止这种纠纷的发生,还能够保护数字产权合法拥有者的合法权益。
数字水印具有以上四个基本特征。正是由于数字水印有安全性、隐蔽性、鲁棒性和数字水印这些特征,才在各式各样的水印设计方案中得到最优解。一个理想的水印算法不但需要高隐蔽性,还需要有强抵御力来面对各种攻击。优秀的数字水印方案需要结合以上四点做出理性的选择,只有充分考虑到这四个特征才能在设计水印方案的时候完美切合实际需求。
2.3 DCT变换的数字水印的应用
DCT变换域算法在抵抗有损压缩编码和其他一些具有信号失真的数据处理过程有很好的表现,鲁棒性和不可感知性是难以同时满足的两个要求,但是基于DCT变换的数字水印算法能更好地满足这两个基本要求。针对DCT变换的数字水印算法,在下文中会进行详细解释。并对版权保护问题中利用DCT变换所需的方法及步骤做出介绍。
3 离散余弦变换(DCT)算法介绍
3.1 傅里叶变换紧密相关的数学运算是离散余弦变换
DCT变换的基础是傅里叶变换,图像信号需要通过二维数组的变换来实现。
反离散余弦变换IDCT坐标公式:
其中:
3.2 DCT域系数分析
根据上式的计算方法可以得到64个系数,左上方位置的式直流分量(DC分量)。去除左上角的位置坐标的其他坐标系数都称为交流分量(AC分量)。只要加入大量的水印信息都不会使得水印之后的图像与初始图像对比之后在视觉上都不会产生较大差别,此时的感觉容量即为最大,这个位置也是最适合在这64个DCT系统中添加水印信息的位置,同时还能够确保在经过恶意攻击之后,图像依旧可以完整的提取水印信息。鲁棒性较高的区域刚好位于人们视觉敏感区域,此时的信号在信息处理过程中很难被除掉。
4 基于DCT变换技术的数字水印算法的应用步骤
对于彩色图片,基本DCT算法的流程是,首先将RGB图片转成YUV格式,然后再将图像矩阵分成互不重叠的8*8块,DCT模块对其中的Y分量,而后经YUV2 RGB输出嵌入后的RGB流。流程图如图1。
图1 水印算法流程图
具体嵌入方法为:读取水印信息w(这里w取1或-1),按公式更改s系数的值,其中T是选定的阈值。数字水印是将一些不能被看见的信息嵌入到内容数据中,通常情况下是可以护内容数据的完整性。
扩频原理的叠加使用,是水印技术保证并升级DCT算法的可靠性的优质方案,用来满足数字水印设计方案的需求。DCT变换的最佳独特之处就在于,普通的信息只能将块状的信息汇聚在少量的低频DCT系数中,如此仅少量系数可以变换,还不会对图像的质量有危害。当分块的运算出现时,使得图像嵌入更为简易。因此DCT变换在低频中更适用,高频编码是容易被各种处理方法破坏使用,不被使用。扩频技术实现起来还是比较简单的,目前人们正在研究的数字水印算法更多的是基于变换域的,而这些变换域主要以频域为主,在空域算法方面,弥补了不足。
图2 原图与嵌入水印后的图像
5 水印的提取
当水印信息嵌入到图像之后,需要通过DCT变换等比较系统的方式将水印提取出来。
(1)基于DCT变换对含水印信息的数字作品进行变换。
(2)最佳嵌入区域需要根据嵌入算法来找到嵌入区域。
(3)按照水印嵌入时的基本规则将二元数组和三元数组两者的数值对比之后,就可以确定水印信息值了。
(4)将确定的水印信息值经过变换之后就可得到提取出的水印信息。
6 DCT水印攻击实验分析
从直观的角度观察水印的感知透明度就是DCT水印的攻击测试。
(1)本次分析主要对图像嵌入水印序列,之后再对已经加入水印的图像进行水印的提取。通过实验可以得出基于DCT变换后的数字水印算法的透明性有明显改善。
(2)以恶意攻击实验的方式,来验证数字水印算法在数字媒体当中的作用。能否使得版权信息得到保护;能不能快速并且有效的将信息提取出来;嵌入的水印经过攻击后是否可以完整的提取。
二、部分源代码
function varargout = manit1(varargin)
% MANIT1 M-file for manit1.fig
% MANIT1, by itself, creates a new MANIT1 or raises the existing
% singleton*.
%
% H = MANIT1 returns the handle to a new MANIT1 or the handle to
% the existing singleton*.
%
% MANIT1('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in MANIT1.M with the given input arguments.
%
% MANIT1('Property','Value',...) creates a new MANIT1 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before manit1_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to manit1_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 manit1
% Last Modified by GUIDE v2.5 03-Mar-2022 16:04:06
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @manit1_OpeningFcn, ...
'gui_OutputFcn', @manit1_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 manit1 is made visible.
function manit1_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 manit1 (see VARARGIN)
% Choose default command line output for manit1
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes manit1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = manit1_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 browsecoverimg.
function browsecoverimg_Callback(hObject, eventdata, handles)
% hObject handle to browsecoverimg (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile({'*.jpg';'*.bmp';'*.gif';'*.*'}, 'Pick an Image File');
S1 = imread([pathname,filename]);
S=imresize(S1,[512,512]);
axes(handles.axes1)
imshow(S)
title('Cover Image')
set(handles.text3,'string',filename)
setappdata(0,'cImage',S)
cImage=imshow(S);
set(cImage,'ButtonDownFcn',@sCallback)
handles.S=S;
guidata(hObject,handles)
% not use
function axes1_CreateFcn(hObject, eventdata, handles)
% click picture ,popping a figure(source picture)
function sCallback(hObject, eventdata, handles)
figure(1);
S=getappdata(0,'cImage');
imshow(S);
% --- Executes on button press in browsemsg.
function browsemsg_Callback(hObject, eventdata, handles)
% hObject handle to browsemsg (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile({'*.bmp';'*.jpg';'*.gif';'*.*'}, 'Pick an Image File');
msg = imread([pathname,filename]);
axes(handles.axes2)
imshow(msg)
title('Input Message')
set(handles.text4,'string',filename)
setappdata(0,'msgImage',msg)
msgImage=imshow(msg);
set(msgImage,'ButtonDownFcn',@mCallback);
handles.msg=msg;
guidata(hObject,handles)
% click picture ,popping a figure(source picture)
function mCallback(hObject, eventdata, handles)
figure(2);
msg=getappdata(0,'msgImage');
imshow(msg);
% --- Executes on button press in DWT.
function DWT_Callback(hObject, eventdata, handles)
% hObject handle to DWT (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
message=handles.msg;
cover_object=handles.S;
var=get(handles.popupmenu1,'Value');
[watermrkd_img,PSNR,NCC,MSSIM,recmessage,attack_image,attack_message,PSNR_a, NCC_a, MSSIM_a]=dwt(cover_object,message,var);
axes(handles.axes3)
imshow(watermrkd_img)
title('Watermarked Image')
setappdata(0,'wImage',watermrkd_img)
wImage=imshow(watermrkd_img);
set(wImage,'ButtonDownFcn',@wCallback)
axes(handles.axes4)
imshow(recmessage)
title('Recovered Message')
setappdata(0,'recMsg',recmessage)
recMsg=imshow(recmessage);
set(recMsg,'ButtonDownFcn',@rmCallback)
axes(handles.axes5)
imshow(attack_image)
title('Attack Image')
setappdata(0,'aImage',attack_image)
aImage=imshow(attack_image);
set(aImage,'ButtonDownFcn',@aCallback)
axes(handles.axes6)
imshow(attack_message)
title('Attack Message')
setappdata(0,'aMsg',attack_message)
aMsg=imshow(attack_message);
set(aMsg,'ButtonDownFcn',@amCallback)
a=[PSNR,PSNR_a]';
b=[NCC,NCC_a]';
c=[MSSIM,MSSIM_a]';
t=table1;
set(t,'Visible','on');
setappdata(0,'Data',[a b c]);
guidata(hObject,handles)
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019.
[2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019.
[3]杨守义,姬留杰,穆晓敏,齐林.基于FRFT的数字水印算法分析[J].计算机应用与软件. 2009,26(01)
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/123329994
- 点赞
- 收藏
- 关注作者
评论(0)