一、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 = untitled(varargin)
% UNTITLED M-file for untitled.fig
%      UNTITLED, by itself, creates a new UNTITLED or raises the existing
%      singleton*.
%
%      H = UNTITLED returns the handle to a new UNTITLED or the handle to
%      the existing singleton*.
%
%      UNTITLED('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in UNTITLED.M with the given input arguments.
%
%      UNTITLED('Property','Value',...) creates a new UNTITLED or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before untitled_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to untitled_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 untitled% Last Modified by GUIDE v2.5 08-May-2021 09:30:13% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @untitled_OpeningFcn, ...'gui_OutputFcn',  @untitled_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 untitled is made visible.
function untitled_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 untitled (see VARARGIN)% Choose default command line output for untitled
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes untitled wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = untitled_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 OpenImage.
function OpenImage_Callback(hObject, eventdata, handles)
% hObject    handle to OpenImage (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global mydata
[filename,pathname]=uigetfile('*.*','select picture to open');
if filename==0return;
end
str=[pathname,filename];
mydata.a=imread(str);mydata.a=rgb2gray(mydata.a);
axes(handles.YsImage);
imshow(mydata.a);
%按钮
set(handles.OpensyImage, 'Enable', 'on');set(handles.AddImage, 'Enable', 'off');set(handles.Extractsy, 'Enable', 'off');set(handles.popupmenu1, 'Enable', 'off');set(handles.popupmenu2, 'Enable', 'off');set(handles.OutputImage, 'Enable', 'off');%clear static textset(handles.text3, 'String', ''); %clear nc%clear img2 TODO...
cla(handles.SyImage, 'reset');
set(handles.SyImage, 'Box', 'on');
set(handles.SyImage, 'XTick', inf);
set(handles.SyImage, 'YTick', inf);cla(handles.ClhImage, 'reset');
set(handles.ClhImage, 'Box', 'on');
set(handles.ClhImage, 'XTick', inf);
set(handles.ClhImage, 'YTick', inf);cla(handles.TqsyImage, 'reset');
set(handles.TqsyImage, 'Box', 'on');
set(handles.TqsyImage, 'XTick', inf);
set(handles.TqsyImage, 'YTick', inf);% --- Executes on button press in AddImage.
function AddImage_Callback(hObject, eventdata, handles)
% hObject    handle to AddImage (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global mydata
cimage=mydata.a;
a1_string=get(handles.popupmenu2,'String');
p1_string=a1_string{get(handles.popupmenu2,'Value')};
switch p1_stringcase '10'alpha=10;case '20'alpha=20;case '30'alpha=30;case '40'alpha=40;case '50'alpha=50;case '60'alpha=60;
end
OutputImage=DCT(mydata.a,mydata.b,alpha);
a2_string=get(handles.popupmenu1,'String');
p2_string=a2_string{get(handles.popupmenu1,'Value')};
gjfs=gongji(OutputImage,p2_string);
mydata.c=gjfs;
axes(handles.ClhImage);
imshow(mydata.c);
set(handles.Extractsy, 'Enable', 'on');
set(handles.OutputImage, 'Enable', 'on');function gjfs=gongji(image,gj)
switch (gj)case '没有受到攻击'gjfs=image;case '加入白噪声'gjhimage=image;Wnoise=20*randn(size(gjhimage));Wnoise=uint8(Wnoise);gjhimage=gjhimage+Wnoise;gjfs=gjhimage;case '高斯低通滤波'H=fspecial('gaussian',[4,4],0.5);gjfs=imfilter(image,H);case '剪切'gjhimage=image;gjhimage(1:128,1:128)=256;gjfs=gjhimage;case '旋转'gjhimage=image;gjhimage=imrotate(gjhimage,10,'bilinear','crop');gjhimage=double(gjhimage);gjhimage=mat2gray(gjhimage);gjfs=gjhimage;case '压缩'gjhimage=image;
%          WImage5=a1;gjhimage=im2double(gjhimage);
%              gjhimage=wextend('2D','sym',gjhimage,8);cnum=10;dctm=dctmtx(8);P1=dctm;P2=dctm.';imageDCT=blkproc(gjhimage,[8,8],'P1*x*P2',dctm,dctm.');DCTvar=im2col(imageDCT,[8,8],'distinct').';n=size(DCTvar,1);DCTvar=(sum(DCTvar.*DCTvar)-(sum(DCTvar)/n).^2)/n;[dum,order]=sort(DCTvar);cnum=64-cnum;

三、运行结果

四、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)

【图像隐写】基于matlab GUI DCT数字水印嵌入与提取【含Matlab源码 943期】相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【图像隐藏】基于DCT算法实现数字水印嵌入+检测+攻击含Matlab源码

    1 简介 介绍了数字水印的产生.发展及其应用,讨论了数字水印的分类,提出了图像的预处理思想,利用MATLAB中的剪切函数.缩放函数,以及调整图像直方图的方法对图像进行预处理,并用MATLAB进行了仿真 ...

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

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

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

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

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

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

最新文章

  1. SQL Server通过web方式进行远程维护,管理
  2. [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path
  3. 图像处理与计算机视觉:基础,经典以及最近发展(4)图像处理与分析
  4. 关于photoshop处理图片的自动化
  5. Educational Codeforces Round 72 (Rated for Div. 2)
  6. html原生音频播放器倍速,HTML5倍数功能视频播放器(加速2倍,1.5倍播放)
  7. Linux命令(七)Linux用户管理和修改文件权限
  8. SpringBoot集成Actuator监控管理
  9. Spark之性能优化(重点:并行流数据接收)
  10. 数据库创建存储过程_创建存储过程来修复孤立的数据库用户
  11. 低代码的兴起:花更少的钱,赚更多的钱
  12. java字符串替换的问题
  13. AD19中画MOSFET的常见错误——封装出错
  14. xp 远程桌面无法找到该计算机,XP系统中远程无法连接指定计算机的处理方法
  15. 谷歌放弃go_用 Go 实现 Flutter
  16. 使用谷歌云盘和colab训练自己的数据集(yolov5格式)
  17. pcs增加mysql资源_pcs命令配置示例(详细版)
  18. 对言语上的自律和真正的自律的一些想法
  19. Android build.gradle文件详解
  20. 计算机英语大专期末考试,电子科技大学《大学英语2(专科)》20春期末考试【标准答案】...

热门文章

  1. bundle adjustment原理(1)
  2. sqlserver 触发器语法
  3. 在2003上实现Custom Task Pane
  4. 七月算法机器学习5 回归分析与工程应用
  5. 黑马程序员 Python学习笔记之 算数运算符
  6. Atitit prgrmlan 编程语言主题列表 \0 it impttech topic\prgrmlan topic编程语言专题\AOP拦截器 表达式写法.docx \0 it impttec
  7. Atitit java zip compress use apache tool jar 压缩的问题 static void zip(java.lang.String zipFileName,
  8. Atitit  404错误的排查流程总结 v3 qaf
  9. Atitit 图像处理的摩西五经attilax总结
  10. Atitit. 委托的本质 c#.net java php的比较