基于扩频的数字视频水印嵌入和检测算法matlab仿真

目录

1.算法运行效果图预览

2.算法运行软件版本

3.部分核心程序

4.算法理论概述

5.算法完整程序工程


1.算法运行效果图预览

 

 

 

 

2.算法运行软件版本

matlab2022a

3.部分核心程序

.................................................................
for j =1:length(attens)jatten      = attens(j);%读取水印 msg0       = imresize(imread('bupt.bmp'),1);[row2,col2]= size(msg0);msg        = msg0(:);load mpeg2_toolbox\mpeg_avi.matMPEG2_I_frame       = MPEG2_avi{1};MPEG2_I_frame1      = imresize(MPEG2_I_frame,5);[row,col] = size(MPEG2_I_frame1);s_len     = row*col;%generate msg to be embeddedi=1;while floor(s_len/(row2*col2)) > 2^ii=i+1;endfrag    = 2^(i-1); msg_len = floor(s_len/frag);degree  = 5;%degree为m序列的级数pn0     = 2*pn_gen([degree,2,0],[zeros(1,degree-1),1],0)-1;pn1     = 2*pn_gen([degree,2,0],[zeros(1,degree-1),1],1)-1;for i = 1:1%读取视频MPEG2_I_frame       = MPEG2_avi{i};MPEG2_I_frame1      = imresize(MPEG2_I_frame,5);s         = MPEG2_I_frame1;[row,col] = size(MPEG2_I_frame1);s_len     = row*col;len       = row2*col2;%帧间运动检测,加入水印bld       = func_add_sy(frag,msg,len,s,atten,pn0,pn1);%进行攻击out0      = double(vedio_attack(bld,SEL));%提取水印out       = func_del_sy(frag,out0,len,pn0,pn1)';om        = Vector2Matrix(out,col2,1);
%         figure(1);
%         subplot(221);
%         imshow(MPEG2_I_frame1,[]);title('原始视频');
%         subplot(222);
%         imshow(msg0);title('水印');    
%         subplot(223);
%         imshow(bld,[]);title('原始视频加入水印');
%         subplot(224);   
%         imshow(om);title('提取水印');     %计算提取误差ERR1(j) =  1/mean(mean(abs(MPEG2_I_frame1-out0)));ERR2(j) =  mean(mean(abs(om-msg0)));PSNR(j) = psnr(MPEG2_I_frame1, out0);end
end
figure;
plot(attens,PSNR,'b');
grid on
xlabel('水印嵌入强度');
ylabel('视频质量');figure;
semilogx(attens,ERR1,'b');
grid on
xlabel('水印嵌入强度');
ylabel('视频质量');
%  PSNR = psnr(MPEG2_I_frame1, bld)figure;
semilogx(attens,ERR2,'b');
grid on
xlabel('攻击强度');
ylabel('水印嵌入强度');
%  PSNR = psnr(MPEG2_I_frame1, bld)if SEL==1save R1.mat attens ERR1 ERR2 PSNR
end
if SEL==2save R2.mat attens ERR1 ERR2 PSNR
end
if SEL==3save R3.mat attens ERR1 ERR2 PSNR
end
03_015m

4.算法理论概述

      在MPEG压缩标准中,数据流是以多路复合流的格式存储和传输的。多路复合流由音频流和视频流复合组成。多路复合流的基本单位时包,而一个包由三个组组成。组分为视频组和音频组,在此只介绍视频组。它采用分层的语法定义,每一层包括一个或多个从属层。

       由于视频流被分成多个图片组,每个组包含特征相近的一些图像帧的集合,帧又被分成画面,再分成宏块。画面内编码的基本单位是宏块,一个宏块由6个8*8像素块构成:四个亮度块Y0, Y1, Y2, Y3,一个色度块U,一个色度块V。注意,四个亮度块覆盖的画面区域与每个色度块覆盖的画面区域是相同的,原因是由于色度信息的信息量比亮度信息少,为了提高数据压缩率而对色度信息作了适合人类视觉系统灵敏度的亚采样。

      MPEG视频压缩编码的目的是为了在保持较好画面质量的同时获得较高的压缩比。由于在编码过程中不能保持精确的像素值,所以该算法是有失真的,视频压缩的最优性能依赖于高质t画面、高压缩比与数据流读取三者之间矛盾的折衷。

         原始视频信号的数据量非常大,不利于存储和传输,所以视频信号需要进行数据压缩。为了获得高压缩比,就必须有效的去掉视频在时域和空域上的冗余。MPEG-2采用基于块的运动补偿以减少时域冗余。运动补偿用于对当前画面作相对于前一幅画面的因果预测,对当前画面作相对于后一幅画面的非因果预测,或作相对于前、后画面的差补预测。对每一个8*8像素的画面区域均定义一个运动矢量,以保证能有效恢复画面。用DCT变换对差值信号(即预测误差)作进一步压缩,以消除空域冗余:然后以一个不可逆的过程对DCT系数量化,删去不太重要的信息;最后,将运动矢量与DCT信息结合,并用变长码进行嫡编码,得到压缩的视频流。

         在MPEG视频中,由于视频的I帧上色度的离散余弦变换DCT的直流系数DC是一个始终在视频流中存在而且很鲁棒的参数,我们将水印信息经m序列调制后加入到I帧的色度DCT的直流系数中,这样水印信息在不影响视频效果的情况下一般是难以去除的,所以鲁棒性是足够的,这里我们采用了扩频的方法,以方便有效的检测水印,另外有效的抵抗各种攻击及干扰。这里关键问题是色度DCT的直流系数DC是一个对于视觉系统很敏感的参数,我们在色度DCT的直流系数DC上加水印相当于对其加入微量干扰,必须使这种千扰低于一定的门限制,使得人眼的视觉系统对视频中色度的微小变化感觉不到,所以我们将根据直流系数的大小自适应的加上不同程度的水印,以提高数字水印检测率并且提高了视频的效果。下面分别给出水印嵌入和提取的算法:

       由于使用了伪随机序列调制水印,水印信号类似于白噪声,水印对未授杠来说是很难检测、定位、移除和处理的。图描述了扩频水印的嵌入过程。

       水印的提取通过把嵌入水印的视频流与相同懂得伪随机序列作相关运算,根据相关值的大小来判定水印的比特值。水印的提取框图如图所示。 

5.算法完整程序工程

OOOOO

OOO

O

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/68427.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中有哪些可以用于日期和时间的API?

从Java 8开始,java.time包提供了新的日期和时间API,新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。主要涉及的类型有以下几类: LocalDate:不包含具体时间的日期。 Lo…

Kotlin开发笔记:类层次结构和继承

Kotlin开发笔记:类层次结构和继承 简介 面向对象编程的语言中,关于对象层次的抽象是很重要的,这会涉及到类层次的结构,接口和继承等内容,本篇文章将会介绍与之相关的内容,包括: 接口的相关内容…

ChatGLM-RLHF(七)-PPO实践(Proximal Policy Optimization)原理实现代码逐行注释

从open AI 的论文可以看到,大语言模型的优化,分下面三个步骤,SFT,RM,PPO,我们跟随大神的步伐,来学习一下这三个步骤和代码实现,本章介绍PPO实践。 生活中,我们经常会遇到…

实战指南,SpringBoot + Mybatis 如何对接多数据源

系列文章目录 MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难,MyBatis动态Sql标签解析 从零开始,手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 Spring监听器…

Git Cherry-pick使用

概述 无论项目大小,当你和一群程序员一起工作时,处理多个 Git 分支之间的变更都会变得很困难。有时,与其把整个 Git 分支合并到另一个分支,不如选择并移动几个特定的提交。这个过程被称为 "挑拣", 即 Cherry-pick。 本…

maven如何建立JavaWeb项目并连接数据库,验证登录

这里是建立建立web项目:Maven如何创建Java web项目(纯干货版)!!!_明天更新的博客-CSDN博客 我们主要演示如何连接数据库验证登录。 1.在webapp目录下创建我们的登录页面:index.jsp 还需要再…

论文略读:城市道路场景下车辆编队运动规划与控制算法研究

1. 一些观点: (1)我曾经认为不能复现的论文都是垃圾。我现在看到能够量产的论文之后发现,论文的复现实属难得,即使给你代码,反复钻研,一个月之久才敢说略微看懂,所以论文的复现实在是…

探讨uniapp的navigator 页面跳转问题

navigator 页面跳转。该组件类似HTML中的<a>组件&#xff0c;但只能跳转本地页面。目标页面必须在pages.json中注册。 "tabBar": {"color": "#7A7E83","selectedColor": "#3cc51f","borderStyle": "bl…

【网络编程(二)】NIO快速入门

NIO Java NIO 三大核心组件 Buffer&#xff08;缓冲区&#xff09;&#xff1a;每个客户端连接都会对应一个Buffer&#xff0c;读写数据通过缓冲区读写。Channel&#xff08;通道&#xff09;&#xff1a;每个channel用于连接Buffer和Selector&#xff0c;通道可以进行双向读…

Django-配置邮箱功能(一):使用django自带的发送邮件功能

一、获取邮箱授权码 以QQ邮箱为例子&#xff1a; 1、进入到设置&#xff0c;找到账户 2、开启POP3等服务&#xff0c;点击管理服务 3、进入管理服务&#xff0c;生成授权码 4、按照要求发送短信就可以了 5、将授权码复制保存&#xff0c;离开界面就看不到了 二、django项目中…

【Vue】Vue2创建移动端项目实战教程,创建移动端项目保姆级教程,设置axios,utils工具包,vue.fonfig.js配置项 (下)

系列文章目录 这里是创建移动端项目 【Vue】Vue2.x创建项目全程讲解&#xff0c;保姆级教程&#xff0c;手把手教&#xff0c;Vue2怎么创建项目&#xff08;上&#xff09; 【Vue】Vue2创建移动端项目实战教程&#xff0c;创建移动端项目保姆级教程&#xff0c;接上一篇创建Vue…

无法解析的外部符号cusolverDnCreate

问题&#xff1a; 无法解析的外部符号cusolverDnCreate 解决方案 那么就在启动项目-》属性-》连接器-》输入-》附加依赖项&#xff1a;加&#xff1a; cublas.lib cublas_device.lib cuda.lib cudadevrt.lib cudart.lib cudart_static.lib cufft.lib cufftw.lib curand.lib …