【图像隐写】基于matlab GUI DCT数字水印嵌入与提取【含Matlab源码 1323期】
一、DCT数字水印嵌入与提取简介
1 基本DCT变换
目前,基于DCT域的水印方法已经成为数字水印算法研究的热点,它的核心思想就是通过离散傅立叶变换对图像块进行处理后,再选择变换域中的一些系数值依据一定规则来嵌入水印。
由于图像块中DCT系数频带分布由左上角的直流分量DC往下对应的系数频率由低频升至高频,因此在不影响原图质量的前提下,可将水印信息根据能量大小嵌入相应系数频带中。通过图像块量化与水印嵌入结合的处理方法将水印信息均匀分布在图像的整个空间域,在图像裁剪和滤波方面,变换域的水印比在空间域的更能表现出一定的鲁棒性。
2 水印算法描述
2.1 水印嵌入算法
该算法采用加性嵌入的方式在经过DCT变换后的子图像块的中频域中,选取隐秘位置嵌入水印信息,具体的嵌入流程如下图1所示:
图1 分块水印嵌入流程
(1)分块处理:设宿主图像为P,将其分块处理为8*8的K个子块。
(2)水印预处理:设水印图像为W,对其进行互补变换,变换后的水印图像和变换前的水印图像相互补。
(3)对水印图像进行Arnold置乱变换,并依据混沌映射规则,选取密钥混沌序列并与水印序列异或运算,将置换次数和异或运算处理后的结果分别作为水印嵌入算法的密钥1和密钥2。
(4)DCT变换:对各子块内做DCT变换,利用zig-zag对DCT系数进行扫描,得到第k块子图像块的序列为Zk(i),i=0,1,2,…63.
(5)水印嵌入算法:依据zig-zag排序,在各子块的中、低频段选取特定系数x(m)和x(n),在系数坐标(a,b)和(c,d)处嵌入水印信息图像W,并将其作为密钥3。同理,嵌入互补水印图片W’,并将嵌入的位置作为密钥4。水印嵌入的方法如下:
(6)IDCT变换:将每一个子图像块作二维DCT逆变换。
(7)子块合并:将每一个子块合并成嵌入水印的图像P’。
2.2 水印提取算法
将嵌入水印的图像P’分块处理,并对各子块进行二维DCT变换,由密钥3和4推断所选择的水印系数,若x(m)≤x(n),则水印信息为0,若x(m)>x(n),则水印信息为1,再利用密钥1和2将初步水印的信息解密再进行Arnold逆变换,最终提取出水印信息。
2.3 水印检测算法
本文通过计算峰值信噪比PSNR的值评价嵌入水印的宿主图像的质量,一幅m和n的图像,PSNR度量标准定义为:
归一化相关系数NC的值判断嵌入水印的图像与宿主图像的相似度,其定义为:
二、部分源代码
function varargout = wmark_enc_export(varargin)
%
%
%
%
% WMARK_ENC_EXPORT MATLAB code for wmark_enc_export.fig
% WMARK_ENC_EXPORT, by itself, creates a new WMARK_ENC_EXPORT or raises the existing
% singleton*.
%
% H = WMARK_ENC_EXPORT returns the handle to a new WMARK_ENC_EXPORT or the handle to
% the existing singleton*.
%
% WMARK_ENC_EXPORT('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in WMARK_ENC_EXPORT.M with the given input arguments.
%
% WMARK_ENC_EXPORT('Property','Value',...) creates a new WMARK_ENC_EXPORT or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before wmark_enc_export_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to wmark_enc_export_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 wmark_enc_export
% Last Modified by GUIDE v2.5 04-Jun-2021 11:45:59
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @wmark_enc_export_OpeningFcn, ...
'gui_OutputFcn', @wmark_enc_export_OutputFcn, ...
'gui_LayoutFcn', @wmark_enc_export_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 wmark_enc_export is made visible.
function wmark_enc_export_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 wmark_enc_export (see VARARGIN)
% Choose default command line output for wmark_enc_export
handles.output = hObject;
axes(handles.iim); axis off
axes(handles.oim); axis off
axes(handles.omsg); axis off
axes(handles.demsg); axis off
set(handles.emmsg,'Enable','off')
set(handles.extmsg,'Enable','off')
set(handles.msg,'Enable','off')
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes wmark_enc_export wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = wmark_enc_export_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 exit.
function exit_Callback(hObject, eventdata, handles)
% hObject handle to exit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close wmark_enc
% --- Executes on button press in extmsg.
function extmsg_Callback(hObject, eventdata, handles)
% hObject handle to extmsg (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
embimg=handles.embimg;
wm=exwmark(embimg);
axes(handles.demsg); imshow(wm); title('Extracted MSG')
handles.wm=wm;
guidata(hObject,handles)
% --- Executes on button press in emmsg.
function emmsg_Callback(hObject, eventdata, handles)
% hObject handle to emmsg (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
img=handles.img; msg=handles.msg;
h=warndlg('Wait....','Processing');
[embimg,ps]=wtmark(img,msg);
handles.embimg=embimg;
axes(handles.oim); imshow(embimg); title('Embedded Image')
set(handles.impsnr,'String',ps)
set(handles.extmsg,'Enable','On')
close(h)
guidata(hObject,handles)
% --- Executes on button press in inp.
function inp_Callback(hObject, eventdata, handles)
% hObject handle to inp (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[fname path]=uigetfile({'*.jpg';'*.bmp';,'*.jpeg';'*.tiff';'*.png'},'Browse Image');
if fname~=0
img=imread([path,fname]);
if length(size(img))>2
img=rgb2gray(img);
end
axes(handles.iim); imshow(img);
title('Orignal Image')
handles.img=img;
set(handles.msg,'Enable','on')
else
warndlg('Please Select Image File');
end
guidata(hObject,handles);
% --- Executes on button press in msg.
function msg_Callback(hObject, eventdata, handles)
% hObject handle to msg (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[fname path]=uigetfile({'*.jpg';'*.bmp';,'*.jpeg';'*.tiff';'*.png'},'Browse Image');
if fname~=0
msg=imread([path,fname]);
if length(size(msg))>2
msg=rgb2gray(msg);
end
axes(handles.omsg); imshow(msg);
title('MSG')
handles.msg=msg;
set(handles.emmsg,'Enable','on')
else
warndlg('Please Select Image File');
end
guidata(hObject,handles);
% --- Creates and returns a handle to the GUI figure.
function h1 = wmark_enc_export_LayoutFcn(policy)
% policy - create a new figure or use a singleton. 'new' or 'reuse'.
persistent hsingleton;
if strcmpi(policy, 'reuse') & ishandle(hsingleton)
h1 = hsingleton;
return;
end
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]万谊丹.基于Arnold和DCT的抗剪切攻击图像水印研究[J].网络安全技术与应用. 2021,(08)
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/120454308
- 点赞
- 收藏
- 关注作者
评论(0)