一、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 = watermaked(varargin)
% WATERMAKED M-file for watermaked.fig
%      WATERMAKED, by itself, creates a new WATERMAKED or raises the existing
%      singleton*.
%
%      H = WATERMAKED returns the handle to a new WATERMAKED or the handle to
%      the existing singleton*.
%
%      WATERMAKED('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in WATERMAKED.M with the given input arguments.
%
%      WATERMAKED('Property','Value',...) creates a new WATERMAKED or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before watermaked_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to watermaked_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 watermaked% Last Modified by GUIDE v2.5 26-May-2008 14:22:42% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @watermaked_OpeningFcn, ...'gui_OutputFcn',  @watermaked_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 watermaked is made visible.
function watermaked_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 watermaked (see VARARGIN)% Choose default command line output for watermaked
handles.output = hObject;
handles.contain=imread('nvlang512x512.jpg');      %  读入载体图
handles.name=imread('name32x32.bmp');             %  读入水印
handles.sel=0;                                    %  不加攻击
handles.jpeg=0;
handles.gau=0;
handles.salt=0;
handles.ang=0;
handles.filt=0;                                  %   不滤波
set(handles.edit3,'string',handles.jpeg);        %  文本框设置为0
set(handles.edit2,'string',handles.jpeg);
set(handles.edit1,'string',handles.jpeg);
set(handles.edit7,'string',handles.ang);
guidata(hObject, handles);
guidata(hObject, handles);
% Update handles structure
guidata(hObject, handles);% UIWAIT makes watermaked wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = watermaked_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 pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
contain_ind=rgb2gray(handles.contain);           %  灰度图象  可以接受
figure,imshow(uint8(contain_ind)); title('原始图象');guidata(hObject, handles);% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)figure,imshow(handles.name);title('水印');guidata(hObject, handles);% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[handles.contain_lsb,handles.bit]=LSB;
figure,imshow(handles.contain_lsb);
handles.pnsr=PSNR(handles.contain,handles.contain_lsb);
title_string=strcat('含水印的图象(时域) PNSR:',num2str(handles.pnsr));
title(title_string);guidata(hObject, handles);% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles.watermarked_lsb=LSBextract(handles.contain,handles.contain_lsb,handles.name,handles.bit,handles.sel,handles.gau,handles.salt,handles.jpeg,handles.filt,handles.ang);
figure,imshow(uint8(handles.watermarked_lsb));title('提取的水印(时域)');guidata(hObject, handles);% --- Executes on button press in pushbutton20.
function pushbutton20_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton20 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)delete(get(0,'children'));
clear all;% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[handles.contain_marker_dwt,handles.SORT_IND]=testname;
figure,imshow(uint8(handles.contain_marker_dwt));title('含水印的图象(小波域)');handles.pnsr=PSNR(handles.contain,handles.contain_marker_dwt);
title_string=strcat('含水印的图象(小波域) PNSR:',num2str(handles.pnsr));
title(title_string);
guidata(hObject, handles);% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles.name_ex_dwt=extract_name(handles.contain,handles.contain_marker_dwt,handles.SORT_IND,handles.sel,handles.gau,handles.salt,handles.jpeg,handles.filt,handles.ang);
figure,imshow((handles.name_ex_dwt));title('提取的水印(小波域)');
guidata(hObject, handles);% --- Executes on slider movement.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
[handles.contain_marker_dwt_times,handles.SORT_IND,handles.name1]=name_imbed;
figure,imshow(uint8(handles.contain_marker_dwt_times));title('含水印的图象(改进的小波域)');
handles.pnsr=PSNR(handles.contain,handles.contain_marker_dwt_times);
title_string=strcat('含水印的图象(改进的小波域) PNSR:',num2str(handles.pnsr));
title(title_string);guidata(hObject, handles);

三、运行结果







四、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 LSB+DWT数字水印嵌入+提取+检测+攻击【含Matlab源码 833期】相关推荐

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

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

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

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

  3. 【图像融合】基于matlab GUI高斯金字塔+拉普拉斯金字塔彩色图像融合【含Matlab源码 1506期】

    一.区域分割图像融合简介 图像的分解 对源图像进行融合时,首先对图像进行分解,利用拉普拉斯金字塔分解,先对图像进行高斯金字塔分解,然后再进行拉普拉斯金字塔分解. 1 高斯金字塔分解 记源图像为G0,G ...

  4. 【语音隐写】基小波变换算法求解水印嵌入提取【含Matlab源码 513期】

    ⛄一.简介 随着计算机和网络的飞速发展,人们的许多创作和成果都以数字形式进行存储和发布.然而,数字作品极易被非法拷贝.伪造和窜改,使得很多版权所有者不愿意利用网络公开其作品,从而阻碍其自身发展.目前, ...

  5. 【时钟识别】基于matlab GUI Hough变换指针式时钟识别【含Matlab源码 2085期】

    ⛄一.简介 1 仪表示数识别流程 基于刻度准确定位的指针式仪表示数识别方法包括预处理.指针检测.刻度定位.油位计表盘中心拟合与仪表读数计算5个部分.该方法无需预先添加任何表盘信息,算法流程如图2所示. ...

  6. 【数字信号调制】基于matlab GUI PCM编码和QAM调制系统【含Matlab源码 2080期】

    ⛄一.PCM编码+QAM调制简介 1 PCM 数字信号是对连续变化的模拟信号进行抽样.量化和编码产生的,称为PCM(Pulse Code Modulation),即脉冲编码调制. 脉冲编码调制就是把一 ...

  7. 【车辆计数】基于matlab GUI背景差分法道路行驶多车辆检测【含Matlab源码 1911期】

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

  8. 基于Matlab多平台雷达网络生成雷达检测仿真(附源码)

    目录 一.带旋转雷达阵列的机载平台 二.带有两个雷达阵列的机载平台 三.带有矩形雷达阵列的地面平台 四.机载目标 五.雷达探测的生成 六.总结 七.程序 此示例演示如何从多平台雷达网络生成雷达检测.该 ...

  9. 基于java开发的健身器材电商管理系统.rar(含项目源码前后端项目)

    功能:健身器材信息管理.健身器材分类管理.公告管理.个人中心.订单管理.健身器材入库管理.健身器材出库管理.收获评价管理.系统管理等 前端页面展示 后端管理: 源码下载地址:>>>

  10. matlab svm 语音识别,【情感识别】基于matlab支持向量机(SVM)的语音情感识别【含Matlab源码 543期】...

    一.简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数 ...

最新文章

  1. 并发编程中的GIL锁(全局解释器锁)自己理解的他为啥存在
  2. 全球及中国苯基异丙基聚二甲基硅氧烷市场需求调查与竞争格局策略报告2022版
  3. 什么是servlet?servlet的作用?——计算机网络系列学习笔记
  4. wpf 代码获取contextmenu_[C#] 转:在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件...
  5. Eclipse提速优化方法
  6. 聚焦BCS|吴云坤产业峰会演讲:用内生安全框架提升网络安全产值
  7. 如何做到每天都写代码
  8. NSRunLoop中Autorelease pool 管理
  9. GitHub 简单教程
  10. 在ADS中进行DCR仿真
  11. 论文总结(3):Intelligent Traffic Monitoring Systems for Vehicle Classification: A Survey
  12. Lesson 17.11 案例一:SVHN街道实景门牌识别
  13. Springboot+vue项目火车订票管理系统
  14. 利用QRmaker制作二维码
  15. 第二课《shell 编程基础》
  16. 前端过程性考核,肝了一宿终于肝出来了!!!
  17. 国家网络安全周|2022网络安全知识答题
  18. 百度接口根据关键字生成文章
  19. 微信小程序实现锚点效果 scroll-view的scroll-into-view属性
  20. 安卓Bugly使用教程

热门文章

  1. 点菜单项在面板中打开并判断是否打开
  2. Windows下安装python的scipy等科学计算包(转)
  3. centos 安装qrcode  二维码
  4. Python游戏开发入门3 Pygame屏幕绘制机制
  5. 《图解算法》学习笔记之广度优先搜索(breadth-first search, BFS)
  6. matlab绘图把横坐标修改为自己想的标签 并保存对应图的代码以便下次修改
  7. 181015扇贝有道词霸每日一句
  8. Atitit custom popup 弹窗 techweo layers目录Custom div 1Open 2关闭popup 3关闭事件 3Custom div<!-- pw
  9. Atitit 接受post raw数据目录1. 接受get参数 11.1. //req.query只能拿到get参数 //post请求使用 body-parser拿到 12. 原生expre
  10. Atitit 命令行执行springboot程序 目录 1.1. 执行spel表达式,调用app main,获取context 1 1.2. 直接在Application main函数内执行 1