目录

  • 代码及其注释
  • 理解

代码及其注释

function amplify_spatial_lpyr_temporal_iir(vidFile, resultsDir, ...alpha, lambda_c, r1, r2, chromAttenuation)% ~ 在这里表示忽略输出参数,在这里为什么不涉及扩展名?[~,vidName] = fileparts(vidFile);%从结果上我们可以看到只提取了名字,并没有提取到后缀outName = fullfile(resultsDir,[vidName '-iir-r1-' num2str(r1)...'-r2-' num2str(r2)...'-alpha-' num2str(alpha) ...'-lambda_c-' num2str(lambda_c) ...'-chromAtn-' num2str(chromAttenuation) '.avi']);% Read videovid = VideoReader(vidFile);%创建对象vid,其中括号里的是该对象读取的视频路径% Extract video info 获取视频信息vidHeight = vid.Height;vidWidth = vid.Width;nChannels = 3;fr = vid.FrameRate;len = vid.NumberOfFrames;temp = struct('cdata', ...zeros(vidHeight, vidWidth, nChannels, 'uint8'), ...'colormap', []);%这里的数据存在空矩阵里还是零矩阵里startIndex = 1;endIndex = len-10;%为什么去掉结尾的十帧vidOut = VideoWriter(outName);%创建一个视频对象vidOut同时对其进行命名为outName,可以将若干图像转换为视频vidOut.FrameRate = fr;open(vidOut)% firstFrametemp.cdata = read(vid, startIndex);%获取该视频对象的第一帧的所有数据[rgbframe,~] = frame2im(temp);%将得到的第一帧的帧数据转化为图像数据 frame2im将电影帧转换为索引图像。
%[x,map]=frame2im(f)将单个电影帧f转换为索引图像x和关联的颜色映射。电影帧是getframe或im2frame的结果。如果帧包含TrueColor数据,则映射为空。rgbframe = im2double(rgbframe);%常用的是im2double函数,将uint8图像转为double类型,范围为0-1,如果是255的图像,那么255转为1,0还是0,中间的做相应改变。frame = rgb2ntsc(rgbframe);%yiqmap=rgb2ntsc(rgbmap)将rgbmap中的m-by-3 rgb值转换为ntsc颜色空间。Yiqmap是一个m-by-3矩阵,其中包含NTSC亮度(Y)和色度(I和Q)颜色分量,这些分量作为等同于RGB颜色映射中颜色的列。%yiq=rgb2ntsc(rgb)将TrueColor图像rgb转换为等效的ntsc图像yiq。[pyr,pind] = buildLpyr(frame(:,:,1),'auto');%pyr列向量696325*1,第1个元素是拉普拉斯金字塔的第8层(最底层)960*540的[1 1]元素,第696325个元素是第一层(最高层)8*5的[8 5]元素%pind各层大小%拉普拉斯金字塔的第2到第8层都是高斯金字塔同层减去上采样图像,但是拉普拉斯金字塔的第一层就是高斯金字塔,第一层不进行下采样,不进行相减操作。pyr = repmat(pyr,[1 3]);[pyr(:,2),~] = buildLpyr(frame(:,:,2),'auto');[pyr(:,3),~] = buildLpyr(frame(:,:,3),'auto');lowpass1 = pyr;lowpass2 = pyr;output = rgbframe;%im2uint8用于将归一化到0~1之间(im2double 处理后的图像)转换为uint8类型writeVideo(vidOut,im2uint8(output));nLevels = size(pind,1);for i=startIndex+1:endIndex%progmeter里没有执行任何操作progmeter(i-startIndex,endIndex - startIndex + 1);%从第二帧重复第一帧的操作,读取帧数据,frame2im将电影帧转换为索引图像,归一化,将TrueColor图像rgb转换为等效的ntsc图像yiqtemp.cdata = read(vid, i);[rgbframe,~] = frame2im(temp);rgbframe = im2double(rgbframe);frame = rgb2ntsc(rgbframe);%构造三通道拉普拉斯金字塔[pyr(:,1),~] = buildLpyr(frame(:,:,1),'auto');[pyr(:,2),~] = buildLpyr(frame(:,:,2),'auto');[pyr(:,3),~] = buildLpyr(frame(:,:,3),'auto');% temporal filtering% 等号右边的lowpass1,lowpass2是第一帧的拉普拉斯金字塔,pyr是第二帧的拉普拉斯金字塔lowpass1 = (1-r1)*lowpass1 + r1*pyr;lowpass2 = (1-r2)*lowpass2 + r2*pyr;filtered = (lowpass1 - lowpass2);%% amplify each spatial frequency bands according to Figure 6 of our paperind = size(pyr,1);delta = lambda_c/8/(1+alpha);% the factor to boost alpha above the bound we have in the% paper. (for better visualization)exaggeration_factor = 2;% compute the representative wavelength lambda for the lowest spatial % freqency band of Laplacian pyramid%计算拉普拉斯金字塔最低空间频率带的代表波长lambda%第一帧不放大 从第二帧开始放大 空间波长等于对角线长度除以3?lambda = (vidHeight^2 + vidWidth^2).^0.5/3; % 3 is experimental constant%注意不要把l和1弄混for l = nLevels:-1:1indices = ind-prod(pind(l,:))+1:ind;% compute modified alpha for this levelcurrAlpha = lambda/delta/8 - 1;currAlpha = currAlpha*exaggeration_factor;if (l == nLevels || l == 1) % ignore the highest and lowest frequency bandfiltered(indices,:) = 0;elseif (currAlpha > alpha)  % representative lambda exceeds lambda_cfiltered(indices,:) = alpha*filtered(indices,:);elsefiltered(indices,:) = currAlpha*filtered(indices,:);endind = ind - prod(pind(l,:));% go one level down on pyramid, % representative lambda will reduce by factor of 2%拉普拉斯金子塔每下降一层,lambda就折一半lambda = lambda/2; end%% Render on the input videooutput = zeros(size(frame));output(:,:,1) = reconLpyr(filtered(:,1),pind);output(:,:,2) = reconLpyr(filtered(:,2),pind);output(:,:,3) = reconLpyr(filtered(:,3),pind);%抑制颜色通道,相对的就放大了亮度通道output(:,:,2) = output(:,:,2)*chromAttenuation; output(:,:,3) = output(:,:,3)*chromAttenuation;%放大的视频加上原始的视频output = frame + output;%转RGB颜色模型output = ntsc2rgb(output);
%filtered = rgbframe + filtered.*mask;%矫正一些超出归一化的值 output(output > 1) = 1;output(output < 0) = 0;%im2uint8用于将归一化到0~1之间(im2double 处理后的图像)转换为uint8类型writeVideo(vidOut,im2uint8(output));%将帧写入视频,第一个参数是视频对象,第二个参数是视频的各帧endclose(vidOut);
end

理解

首先这个函数算是欧拉放大的核心代码之一了,博主在里面加了不少的注释。
我们把该段代码再来捋一遍,先是读取视频,用fileparts找到视频的名称,用outName设定输出视频的路径名称扩展名等,这里不多说。接着读取第一帧用以获取该视频文件的第一帧,并且构造拉普拉斯金子塔。然后用一个循环结构,从第二帧开始进入滤波的操作。这里的滤波器用的是差分方程直接构造的,并没有设计什么巴特沃斯切比雪夫之类的滤波器。滤波之后就是放大处理。随着空间频率的增加,放大因子也在不断变小。至于里面放大的公式我还一知半解。期待下回解析。最后把处理好的视频帧叠加到输出视频文件里。下面的图是该代码里用的滤波器,用的是两个低通滤波器的差。

专题一:欧拉视频放大(线性)------MATLAB代码解析(二.amplify_spatial_lpyr_temporal_iir())相关推荐

  1. 专题一:欧拉视频放大(线性)---理想带通滤波器对于大视频内存不足的改进

    问题 在线性欧拉视频关于窄频规律性运动放大中使用的理想带通滤波器会存在内存不足的问题. 也就是amplify_spatial_lpyr_temporal_ideal(-)里的ideal_bandpas ...

  2. 专题一:欧拉视频放大(线性)------线性放大理论分析

    目录 前言 整体框架 空间滤波 空间滤波作用 时域滤波 放大 合成效果 前言 在对论文及程序有一定的理解之后,我们对欧拉线性放大的整体做一个总结,以加深理解. 整体框架 欧拉线性放大主要分为四个步骤, ...

  3. 专题二:欧拉视频放大(基于相位)---原理解析

    目录 前言 实施的步骤 空间滤波.提取相位 时域滤 放大 合成 数学原理推导 前言 由于欧拉线性放大方法会不可避免的放大噪声,所以放大率和放大效果都会受到影响.而基于相位的放大方法不会放大噪声,只会平 ...

  4. 专题一:欧拉视频放大(线性)------MATLAB代码解析(一.maxPyrHt(imsz,filtsz))

    目录 绪论 代码及分析 绪论 今天开始我的课题研究知识的积累,估计这个专题我要写好久. 代码及分析 function height = maxPyrHt(imsz, filtsz)imsz = ims ...

  5. 专题一:欧拉视频放大(线性)------随时间改变放大系数

    目录 前言 理论推导 1.线性变化 2.正弦函数变化 代码更改 实际效果 前言 最近有小伙伴问我怎么设置随时间改变放大因子,实现在一个视频中放大倍数不断变化的效果.现在我们来看一下. 理论推导 首先我 ...

  6. 欧拉运动放大算法实现心率检测

    由于疫情的影响,一系列的非接触设备的到应用,如无人消毒机器人.红外测温.除了体温,心率也是衡量人体状况的重要指标.心率可以通过颈动脉.桡动脉还有皮肤颜色来进行提取.2012年,Wu等人基于欧拉视频放大 ...

  7. 埃氏筛与欧拉筛(线性筛)

    目录 一.前言 二.埃氏筛与欧拉筛(线性筛) 1.问题描述 2.基本思路 (1)埃氏筛法 (2)欧拉筛法 三.题例 1.上链接 2.简单思路 3.代码 (1)埃氏筛python版 (2)欧拉筛pyth ...

  8. 筛选质数,埃氏筛和欧拉筛(线性筛)

    求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...

  9. 素数筛法(传统普通、朴素筛法、埃式筛法、欧拉筛法(线性筛))

    素数筛法(普通.朴素筛法.埃式筛法.欧拉筛法) 1.题目 2.分析 3.代码 传统普通 朴素筛法 朴素筛法(6.14) 埃式筛法 埃式筛法(6.14) 欧拉筛法(线性筛) 欧拉筛法(线性筛 6.14) ...

最新文章

  1. 差分轮移动机器人模型预测控制MPC
  2. tomcat无法正常关闭问题分析及解决
  3. 关于Ubuntu运行级别、开机启动脚本的说明
  4. jset编写测试vue代码_详解使用jest对vue项目进行单元测试
  5. java 名称可以包含-吗_java – “标签属性名称包含无效字符”. “Android Manifest
  6. git for windows_Git for Windows,Git 国内镜像持续更新
  7. 网页设计师应向肖像画家吸取的11个理念
  8. 项目总结——机房收费系统合作版
  9. jzoj4382-[GDOI2016模拟3.11]历史【并查集】
  10. 1×pbs缓冲液配方_【应用】蒸渗仪与氧化还原电位的测量1
  11. django实现搜索功能
  12. 学习Android 应注意的十个问题
  13. (赵强老师原创)搭建CDH实验环境,三个节点的安装配置
  14. It is impossible to add a QtClass to the current project问题的解决
  15. 自然语言处理NLP星空智能对话机器人系列:论文解读 How Good is Your Tokenizer? (你的词元分析器有多好?多语言模型的单语性能研究)
  16. 永恒之蓝漏洞紧急应对方案
  17. JMeter二次开发
  18. 苹果电子邮件怎么注册_无需购买 iPhone,可以使用哪些苹果的优质服务?
  19. 【西语】【1】Te amor 我爱你
  20. GC overhead limit exceeded问题

热门文章

  1. oracle 11g ora31626,expdp时候出错:ORA-31626,ORA-31637,ORA-39062,ORA-31613
  2. ​专注制造业云SRM,携客云“多快好省”助力智能制造
  3. HP-UX执行Oracle相关命令报错Memory fault(coredump)分析处理
  4. nginx反向代理配置 1
  5. 迅雷近年产品经理笔试题汇总
  6. 计算机命令退出,用cmd命令来关闭或重启电脑。
  7. mipcms栏目分类调用
  8. 国家一级期刊名录(2005)
  9. php设置数据库名,设置数据库表名-海豚PHP1.0.6完全开发手册-基于ThinkPHP5.0.10的快速开发框架...
  10. 171204之条件查询总结