一、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});
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 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)

【图像隐写】基于matlab GUI DCT+FFT数字水印嵌入+攻击+提取(带面板)【含Matlab源码 1760期】相关推荐

  1. 【语音隐写】基于matlab GUI DCT音频数字水印嵌入提取【含Matlab源码 837期】

    一.离散小波变换的音频信号数字水印技术简介 0 引言 近年来, 数字水印技术的作用越来越重要.数字水印技术是将一些标识信息直接嵌入数字载体当中, 或间接表示在信号载体中, 且不影响原载体的使用价值.通 ...

  2. 【图像隐藏】基于DCT和FFT数字水印嵌入+攻击+提取含Matlab源码

    1 简介 文章对DCT(离散余弦变换)和FFT域图像数字水印算法进行了研究,并用matlab工具进行实验,结果表明该算法使水印的嵌入达到了较好的鲁棒性和不可见性.​ 2 部分代码 function [ ...

  3. 【图像去噪】基于matlab GUI butterworth+中值+维纳+小波图像去噪【含Matlab源码 520期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像去噪]基于matlab GUI butterworth+中值+维纳+小波图像去噪[含Matlab源码 520期] 获取代码方式2: ...

  4. 【物理应用】基于matlab GUI气象参数计算综合指标和IAQI【含Matlab源码 2116期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[物理应用]基于matlab GUI气象参数计算综合指标和IAQI[含Matlab源码 2116期] 点击上面蓝色字体,直接付费下载,即可 ...

  5. 【口罩识别】基于matlab GUI RGB滤波+YCbCr+肤色标定口罩识别【含Matlab源码 1895期】

    ⛄一.口罩识别简介 口罩规范佩戴识别是基于人脸口罩检测结果进行的,该部分的输入是人脸口罩检测的输出且是有佩戴口罩的人脸.首先,将人脸部分的图像提取出来:然后映射到YCrCb颜色空间并进行非线性变换,经 ...

  6. 【语音处理】基于matlab GUI低通滤波器语音信号加噪与去噪【含Matlab源码 1708期】

    ⛄一.语音处理简介(附课程作业报告) 1 语音信号的特点 通过对大量语音信号的观察和分析发现,语音信号主要有下面两个特点: ①在频域内,语音信号的频谱分量主要集中在300-3400Hz的范围内.利用这 ...

  7. 基于JavaWeb Mybatis+MVC(JSP + servlet + javabean)的高校就业管理系统(含项目源码)

    基于JavaWeb Mybatis+MVC的高校就业管理系统 项目简介 基本功能简介 项目要求 概要设计 数据模型(E-R图) 数据库结构设计 主要页面展示 项目实现 创建项目 项目结构展示 项目关键 ...

  8. 【目标检测】基于matlab GUI背景差分算法视频运动物体跟踪【含Matlab源码 1915期】

    一.背景差分法和帧间差分法的车辆运动目标检测简介 1 引言 运动目标检测是从图像序列中检测运动目标.通过运动目标检测可以得到图像中的运动目标,获取图像中的运动信息.运动目标检测在医学辅助诊断.航天航空 ...

  9. 【目标跟踪】基于matlab GUI帧差法结合卡尔曼滤波行人姿态识别【含Matlab源码 1127期】

    ⛄一.基于人体特征识别和卡尔曼滤波的行人跟踪算法简介 1 基于体型和行为姿态特征的人体识别算法 从红外图像中可以得到目标与背景之间的灰度级差别,从而区分出有生命特征的运动物体,但仅从亮度特征无法区别出 ...

  10. 【图像分割】基于matlab GUI医学图像均值聚类+OUST+区域生长法图像分割【含Matlab源码 2210期】

    一.图像分割简介 1 图像分割技术 图像分割 : 根据灰度 , 颜色 , 纹理等,将图像进行分割. 2 常用的分割技术 2.1 边缘检测法 边缘是图像的最重要的特征.边缘是指周围像素灰度有阶跃变化或屋 ...

最新文章

  1. 非对称加密和证书总结
  2. python 打印表格边框_python设置表格边框的具体方法
  3. 用python连接数据库_用Python连接MySQL
  4. 【文末有福利】破解逆概率的迷思
  5. Windows Phone 7 Developer Tools amp; Training Kit 正式版发布!
  6. Android深入浅出系列之实例应用—开机就运行自定义的程序BroadcastReceiver和intent-filter的用法...
  7. 当后台返回的图片在前端加载不出来时,前端做默认图片展示
  8. java测试脚本怎么写_Jmeter测试脚本编写(初学者熟悉篇)
  9. 编写myqq即时聊天脚本,实现相互通信(tcp协议)
  10. 小区门口的健身房,就是韭菜收割厂
  11. 网络空间安全——2021软科中国大学专业排名
  12. 如何编写GIMP插件(三)
  13. GSL-蒙特卡洛积分
  14. 读书笔记:《结构思考力》基于目标定主题
  15. android模仿微信朋友圈图片预览转场缩放动画
  16. 海南信用社计算机试题,2018海南农村信用社考试 计算机 模拟试卷六答案
  17. Redis学习总结和相关资料
  18. 深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)...
  19. 高云FPGA芯片GW2A固化方法
  20. android监听apk安装成功,如何监听apk安装完成

热门文章

  1. 用C#语言实现http协议下的多线程文件传输
  2. 这几天我的生活就是这样的
  3. xshell使用隧道
  4. redis:集群配置
  5. Qt之Dialog\widget\ mainwindow的区别和布局管理器 分裂器的区别
  6. Hibernate【3】——Service层
  7. [IOS]使用UIScrollView和UIPageControl显示半透明帮助蒙板
  8. Vc2008中如何为视图类添加消息响应
  9. 190208每日一句
  10. 扇贝有道180924每日一句