一、简介

随着互联网普及,信息通讯技术的飞速发展,多媒体技术得到了充分的应用。但是开放的互联网使这些多媒体信息的传输变得不安全,而数字水印技术恰恰能保护这些多媒体信息的传输。数字水印技术通过一定的嵌入算法将一些可以用来标识多媒体数据的来源、版本、作者等标志性信息嵌入到多媒体数据中来保护多媒体数据的版权,但是不影响原始数据的使用和价值,并且不易被人察觉 。根据嵌入位置的不同,数字水印算法分为空域和变换域水印算法。一般而言,变换域水印算法稳健性较好,主要的变换域有离散余弦变换 ( discrete cosine transform DCT)、离散小波变换 ( discrete wavelet transform DWT)和离散傅立叶变换 ( discrete fourier transform DFT)。在变换域中奇异值分解(singular value decomposition SVD) 是一种将矩阵对角化的方法。图像的奇异值有较好的稳定性,利用这个原理可将水印信息嵌入到图像经过奇异值变换后的系数。

1 离散余弦变换和奇异值分解

1.1 离散余弦变换

离散余弦变换(Discrete Cosine Transform, DCT)是 一组不同 频率和幅值的余弦函数和来近似衣服图像,实际上是傅里叶变换的实数部分。由于离散余弦变量对于衣服图像,其大部分可视化信息都集中在少数的变换系数上。因此,离散余弦变量是数据压缩常用的一个变换编码方法,它能将高相关数据能量集中,使得它非常适用于图像压缩。一维离散信号f(x) 的离散余弦正变换为:

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_线性代数

二维离散信号 f(x) 的离散余弦正变换为:

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_算法_02

1.2 奇异值分解( SVD)

矩阵经过SVD 分解得到 1个奇异值矩阵 2个正交矩阵。图像的奇异值有很强的稳定性,图像受到轻微的扰动时不会有显著改变。利用奇异值的这种特性,如果将水印嵌入在载体图像 SVD 分解后的奇异值上,当攻击者对含水印图像进行攻击扰乱时,我们仍能从分解的奇异值中提取出水印信息。并且,奇异值对应于图像的亮度特性,而非视觉特性,因此,在奇异值上嵌入水印能保证水印的透明性,保障了水印算法的隐蔽性与安全性。奇异值表征图像矩阵元素的相互关系,在轻微扰动时不会发生变化,因此,在奇异值上嵌入水印不会损害图像的几何特性。 SVD 分解是线性代数中一种非常重要的分解方式其定义如 下。设矩阵 A RRm×n,R表示实数域, m×n表示矩阵大小, A进行 SVD 处理的公式为

A = USVT (3)

式中: U V 都是正交矩阵,S是对角矩阵,奇异值就是矩阵 S 的对角线元素 且这些对角线元素满足 : σ1≥σ2≥σ3≥…σr≥σr+1 =…= σm =0 (其中 ,r表示 A的秩 )。

2 打印和扫描的应用分析

图像水印应用这种应用的挑战包括建立一种鲁棒的水印技术,以从印刷媒体中提取水印。该技术应该能够抵抗由于打印过程而发生的数字到模拟转应该能够抵抗由于打印过程而发生的数字到模拟转换,然后是扫描打印的水印图像时发生的模拟换,然后是扫描打印的水印图像时发生的模拟 - 数数字转换。字转换。 在打印过程中,带水印的图像是模拟格式。在打印过程中,带水印的图像是模拟格式。 为了提取水印,应使用打印扫描过程中的扫描仪或为了提取水印,应使用打印扫描过程中的扫描仪或打印凸轮过程中的相机(移动相机或数码相机)通打印凸轮过程中的相机(移动相机或数码相机)通过捕获过程将模拟数据数字化过捕获过程将模拟数据数字化。。由于引入的攻击,由于引入的攻击,包括几何攻击(例如旋转,缩放,切割和剪切)以包括几何攻击(例如旋转,缩放,切割和剪切)以及由设备引起的扭曲,打印和捕获过程可能具有挑及由设备引起的扭曲,打印和捕获过程可能具有挑战性。战性。 这些失真通常是由在移动电话中存储图像时这些失真通常是由在移动电话中存储图像时的打印和压缩过的打印和压缩过程引起的。一些研究已经研究了这程引起的。一些研究已经研究了这些仍处于初期阶段的应用些仍处于初期阶段的应用。

3 基 于 D C T —SV D 压缩量化的数字 水印

3.1 水印算法

由于具有以下主要特性,SVD能应用于数字水印算法中。 ① 图像的奇异值具有良好的稳定性,即当图像发生微小变化时,其奇异值不会显著变化;② 图像奇异值发生较小改变时,原图像也不会发生较大的变化。因此,在图像的奇异值上嵌入水印,不会对原图像的质量产生太大的影响。 SVD 嵌入水印能有效抵抗几何攻击,但传统 SVD 数字水印算法在提取水印时需要原始载体图像,增加了载体图像在传输时的不安全性,降低了算法的效率。本文算法在嵌入水印过程中没有用到原图 SVD 分解后的正交矩阵,所以,提取水印时不需要原始载体图像。同时,DCT 变换能很好地适应人眼的视觉特性,本文先对载体图像分块,可以将原图的变化集中在每一块中,对每一块 DCT 变换得到近似分量 ;再将近似分量 进行 SVD 分解求得其奇异值矩阵。最后用量化方法得到含水印图像。

3.2 水印的嵌入过程

基于 DCT 和 SVD 的鲁棒性数字水印算法的水印嵌入 算法 过程 ,具体步骤如下

(1) 选取 尺寸为 512˟512大小的图片 颜色模式为 RGB模式的图像 I。

(2) 分离出图像的绿色通道 A。

(3) 对绿色通道进行 DCT变换 ADCT。并对ADCT进行 SVD分解:

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_matlab_03

(4) 读取水印图片,进行灰度化处理。

(5) 对水印图片进行 DCT变换得矩阵 W。

(6) 将水印嵌入到矩阵 S中,即;

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_线性代数_04

(7) 对 图像 ???????????????? 进行逆 DCT变换,将图像从频率域转换到空间域,进而显示 嵌入水印得图像,完成水印嵌入过程,即:

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_线性代数_05

3.3 水印提取过程

本文所述提取含水印图片是经过打印扫描攻击之后的图片 ,????????????. 本文采用数字水印盲 检测的方法,提取水印时之需要嵌入强度 ????的值。 具体步骤如下

(1) 读取 含水印图片 ????????????. 分离图像 RGB颜色通道中的绿色通道,得图像 ????????????_????.

(2) 对图像 ????????????_????. 进行 DCT变换,并对其进行SVD分解。

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_数字水印_06

(3) 计算图像 D

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_数据_07

(4) 计算水印 ????∗

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_算法_08

二、源代码

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

% Last Modified by GUIDE v2.5 25-May-2009 10:07:53

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @main_OpeningFcn, ...
'gui_OutputFcn', @main_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin & isstr(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 main is made visible.
function main_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 main (see VARARGIN)

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

% Update handles structure
guidata(hObject, handles);

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


% --- Outputs from this function are returned to the command line.
function varargout = main_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 mouse press over axes background.
function axes1_ButtonDownFcn(hObject, eventdata, handles)
% hObject handle to axes1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% --- Executes during object creation, after setting all properties.
function popupmenu1_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

三、运行结果

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_算法_09

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_数字水印_10

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_数字水印_11

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_算法_12

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_算法_09

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_算法_12

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_matlab_15

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_数据_16

【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】_算法_17

四、matlab版本及参考文献

1 matlab版本

2014a

2 参考文献

[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.

[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.

[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.

[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

[5]梁欣.基于DWT和SVD的彩色图像数字水印算法研究[J].计算机与数字工程. 2019,47(08)

[6]张秀娟,朱春伟.一种基于DWT-SVD的图像数字水印算法[J].数字技术与应用. 2017,(10)