<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[像素振动 V1.0 版本正式发布]]></title><description><![CDATA[<h1>像素振动（Pixel Vibration）使用说明书</h1>
<blockquote>
<p dir="auto">基于视觉的振动分析工具：用普通相机拍摄的视频，框选区域后用光流 / 互相关测量亚像素级振动位移，并用运动放大直观地"看见"振型。</p>
</blockquote>
<p dir="auto">百度网盘下载地址： <a href="https://pan.baidu.com/s/17UTbpJ0Pq9P_ubYNmdQXsg?pwd=ugt3" rel="nofollow ugc">https://pan.baidu.com/s/17UTbpJ0Pq9P_ubYNmdQXsg?pwd=ugt3</a></p>
<hr />
<h2>目录</h2>
<ol>
<li><a href="#%E4%B8%80%E8%BD%AF%E4%BB%B6%E7%AE%80%E4%BB%8B">软件简介</a></li>
<li><a href="#%E4%BA%8C%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B5-%E5%88%86%E9%92%9F%E8%B7%91%E9%80%9A">快速上手（5 分钟跑通）</a></li>
<li><a href="#%E4%B8%89%E7%95%8C%E9%9D%A2%E6%80%BB%E8%A7%88">界面总览</a></li>
<li><a href="#%E5%9B%9B%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3">功能详解</a></li>
<li><a href="#%E4%BA%94%E6%8A%80%E6%9C%AF%E7%BB%86%E8%8A%82%E9%87%8D%E7%82%B9">技术细节（重点）</a></li>
<li><a href="#%E5%85%AD%E5%86%85%E5%AD%98%E4%B8%8E%E6%80%A7%E8%83%BD%E9%87%8D%E7%82%B9">内存与性能（重点）</a></li>
<li><a href="#%E4%B8%83%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E6%8E%92%E9%94%99">常见问题与排错</a></li>
<li><a href="#%E9%99%84%E5%BD%95%E7%AE%97%E6%B3%95%E8%AE%BA%E6%96%87%E5%87%BA%E5%A4%84">附录：算法论文出处</a></li>
</ol>
<hr />
<h2>一、软件简介</h2>
<p dir="auto"><strong>像素振动</strong>是一款面向"微小振动测量"的桌面软件，它的前身是“视觉振动工具箱”，我们通过python和opencv重构了整个界面和交互逻辑，使其真正的从玩具蜕变成工具，这将是唯一一个不需要用户登录且有完整基础功能的版本。它只需要一台普通相机拍一段视频，就能做两件肉眼做不到的事：</p>
<ol>
<li><strong>测量振动</strong>：在画面上框一个感兴趣区域（ROI），自动算出这个区域每一帧位移了多少像素，并给出<strong>位移波形</strong>和<strong>振动频率（频谱）</strong>——精度可以达到 <strong>0.01 像素级（亚像素）</strong>。</li>
<li><strong>看见振动</strong>：用"运动放大"把看不见的微小振动放大几十到几百倍，让你直接<strong>用眼睛看到物体是怎么振的</strong>（振型、节点、方向）。</li>
</ol>
<p dir="auto"><strong>典型应用场景</strong>：机械结构的共振/模态测试、管道/桥梁/塔架的健康监测、精密设备的微振动诊断、教学演示等。</p>
<h3>运行方式</h3>
<ul>
<li><strong>绿色免安装版</strong>：解压后双击 <code>Pixel Vibration.exe</code> 即可运行（整个文件夹要一起复制）。</li>
<li><strong>源码运行</strong>：安装 Python 依赖后执行 <code>python main.py</code>。</li>
</ul>
<blockquote>
<p dir="auto"><strong>依赖（源码运行才需要）</strong>：PySide6、numpy、scipy、opencv-python、pyqtgraph。</p>
</blockquote>
<hr />
<h2>二、快速上手（5 分钟跑通）</h2>
<p dir="auto">第一次使用，按下面 6 步走一遍就能出结果：</p>
<ol>
<li><strong>启动</strong>：双击 <code>Pixel Vibration.exe</code>。</li>
<li><strong>读视频</strong>：点左侧面板顶部「读取视频」按钮 → 选一个视频文件（或先点「生成演示视频」造一段测试视频）。</li>
<li><strong>定范围</strong>：在「读取视频帧」窗口里，可框选区域、拖动起止滑块定帧范围，然后点「读入工作区」。</li>
<li><strong>框 ROI</strong>：在播放器画面上拖动鼠标，框住你想测量的振动部位（出现一个彩色矩形框）。</li>
<li><strong>测振</strong>：在左侧「振动测量」分区选中该 ROI，点「计算」。等一两秒，波形/频谱窗口会自动弹出。</li>
<li><strong>（可选）运动放大</strong>：在「运动放大」分区设好频带和放大倍数，点「计算放大」，再拖动「放大系数」滑块，就能在播放器里实时看到被放大的振动。</li>
</ol>
<blockquote>
<p dir="auto"><strong>建议先点「生成演示视频」</strong>：软件会造一段"两个频率振动"的无损测试视频，用它能最快熟悉全部功能，不依赖你自己的素材。</p>
</blockquote>
<hr />
<h2>三、界面总览</h2>
<p dir="auto">主界面是无边框窗口，左侧是固定<strong>工作区面板</strong>（上中下三张卡片），右侧是<strong>播放器</strong>（MDI 子窗口，可开多个素材）。</p>
<p dir="auto"><img src="/assets/uploads/files/1789191401864-%E4%B8%BB%E7%95%8C%E9%9D%A2-resized.png" alt="主界面.png" class=" img-fluid img-markdown" /></p>
<h3>左侧工作区：三张卡片</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>卡片</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>素材（原始图像帧数据）</strong></td>
<td>读取视频、加载/保存/删除素材，列表显示每个素材的名称、尺寸、帧率、占用内存</td>
</tr>
<tr>
<td><strong>运动放大</strong></td>
<td>选择放大算法、设置频带/倍率/金字塔层数，计算、释放缓存</td>
</tr>
<tr>
<td><strong>振动测量（ROI）</strong></td>
<td>管理 ROI（框选区域）、选择测振算法、计算位移波形与频谱</td>
</tr>
</tbody>
</table>
<h3>右侧播放器</h3>
<p dir="auto">显示当前素材的画面，你在这里<strong>框选 ROI</strong>、播放/拖动视频、切换"原始 / 放大"显示，叠加 ROI 框和振动箭头。</p>
<hr />
<h2>四、功能详解</h2>
<h3>4.1 读取视频</h3>
<p dir="auto">点「读取视频」打开下面的对话框：</p>
<p dir="auto"><img src="/assets/uploads/files/1789191428751-%E8%AF%BB%E5%8F%96%E8%A7%86%E9%A2%91%E5%B8%A7%E7%AA%97%E5%8F%A3.png" alt="读取视频帧窗口.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">操作要点：</p>
<ol>
<li><strong>选择文件</strong>：点「浏览…」选视频；或点「生成演示视频」造一段测试视频。</li>
<li><strong>预览</strong>：下方进度条可以拖动，随时看某一帧的画面。</li>
<li><strong>框选区域（可选）</strong>：点「框选区域」后在画面上拖一个矩形，只读这块区域（能大幅省内存、提速度）；点「用全图」恢复全图。</li>
<li><strong>定帧范围</strong>：用起止数字框或进度条上的范围滑块，只读某一段帧。</li>
<li><strong>彩色 / 灰度</strong>：勾选「彩色」读彩色；不勾则读灰度（<strong>灰度更省内存</strong>，测振和放大其实只用亮度）。</li>
<li><strong>内存估算</strong>：底部会实时显示"将读入 N 帧 × 宽×高 → 约 XXX"。<strong>如果超过 2 GB 会红字警告</strong>（见<a href="#%E5%85%AD%E5%86%85%E5%AD%98%E4%B8%8E%E6%80%A7%E8%83%BD%E9%87%8D%E7%82%B9">第六章</a>）。</li>
</ol>
<p dir="auto">点「读入工作区」后，素材会出现在左侧素材列表里。</p>
<h3>4.2 素材管理</h3>
<p dir="auto"><img src="/assets/uploads/files/1789191454256-%E7%B4%A0%E6%9D%90%E7%AE%A1%E7%90%86%E7%AA%97%E5%8F%A3.png" alt="素材管理窗口.png" class=" img-fluid img-markdown" /></p>
<ul>
<li>列表四列：<strong>名称 / 尺寸 / 帧率 / 内存</strong>（把鼠标悬停在"内存"上，能看到帧数据、振动数据、放大缓存各自占多少）。</li>
<li>顶部按钮：<strong>读取视频</strong>（新素材）、<strong>加载素材</strong>（打开 <code>.vvm</code> 文件）、<strong>删除素材</strong>（删除选中，释放内存）。</li>
<li>底部显示"共 N 个素材，合计 XXX"——<strong>多个素材的内存是叠加的</strong>，不用了就删掉。</li>
</ul>
<h3>4.3 振动测量（ROI）</h3>
<p dir="auto"><img src="/assets/uploads/files/1789191477197-%E6%8C%AF%E5%8A%A8%E6%B5%8B%E9%87%8F%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3.png" alt="振动测量设置窗口.png" class=" img-fluid img-markdown" /></p>
<ul>
<li><strong>添加 ROI</strong>：在播放器里拖动框选，或在 ROI 列表里添加。</li>
<li><strong>计算方法</strong>：LK 光流 / 互相关(NCC) / 基于相位，三种算法怎么选见<a href="#53-%E6%B5%8B%E6%8C%AF%E7%AE%97%E6%B3%95">第五章 5.3</a>。</li>
<li><strong>计算</strong>：对选中的 ROI 计算位移，完成后自动弹出波形/频谱窗口。</li>
<li><strong>箭头倍率</strong>：控制画面上"振动箭头"的长度（箭头长 = 位移 × 倍率，只是显示用，不影响测量结果）。</li>
</ul>
<h3>4.4 运动放大</h3>
<p dir="auto"><img src="/assets/uploads/files/1789191485041-%E8%BF%90%E5%8A%A8%E6%94%BE%E5%A4%A7%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3.png" alt="运动放大设置窗口.png" class=" img-fluid img-markdown" /></p>
<ul>
<li><strong>算法</strong>：线性(欧拉) / 里斯金字塔（实时预览只支持这两种；复可控金字塔只在导出时用）。</li>
<li><strong>带通下限 / 上限</strong>：只放大这个频率段的振动（Hz）。<strong>必须小于采样率的一半</strong>（奈奎斯特频率），否则会报错。</li>
<li><strong>放大系数（gain）</strong>：拖动即可实时预览放大效果，<strong>不用重新计算</strong>（这是本软件的设计亮点）。</li>
<li><strong>金字塔层数 / 相位平滑 σ</strong>：高级参数，一般留"自动/默认"即可。</li>
<li><strong>计算放大 / 取消放大 / 释放缓存</strong>：算完后点「释放缓存」能立刻释放大量内存（见第六章）。</li>
</ul>
<h3>4.5 播放器</h3>
<p dir="auto"><img src="/assets/uploads/files/1789191492860-%E6%92%AD%E6%94%BE%E5%99%A8%E7%AA%97%E5%8F%A3.png" alt="播放器窗口.png" class=" img-fluid img-markdown" /></p>
<ul>
<li>底部控件：播放/暂停、进度条拖动、起止范围滑块。</li>
<li>显示切换：原始画面 <img src="https://www.pixvib.com/assets/plugins/nodebb-plugin-emoji/emoji/android/2194.png?v=897d1dceafb" class="not-responsive emoji emoji-android emoji--left_right_arrow" style="height:23px;width:auto;vertical-align:middle" title="↔" alt="↔" /> 放大画面。</li>
<li>ROI 框与振动箭头会叠加在画面上，箭头方向和长度表示当前帧的位移。</li>
</ul>
<h3>4.6 导出</h3>
<p dir="auto"><img src="/assets/uploads/files/1789191500937-%E5%AF%BC%E5%87%BA%E8%A7%86%E9%A2%91%E7%AA%97%E5%8F%A3.png" alt="导出视频窗口.png" class=" img-fluid img-markdown" /></p>
<ul>
<li><strong>原始画面 / 放大画面</strong>：导出哪一种。</li>
<li><strong>叠加标注</strong>：勾选后把 ROI 框、振动箭头画进导出的视频里。</li>
<li><strong>高阶：基于相位的运动放大（复可控金字塔）</strong>：质量最高，但<strong>计算量极大，可能耗时 30 分钟以上</strong>，请谨慎使用。</li>
<li>也支持导出<strong>振动数据 CSV</strong>（所有 ROI 的位移时程，可用 Excel 打开）和<strong>保存素材 <code>.vvm</code></strong>。</li>
</ul>
<h3>4.7 设置</h3>
<p dir="auto"><img src="/assets/uploads/files/1789191511261-%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3.png" alt="设置窗口.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">可设置 ROI 框的样式、界面主题、默认是否读彩色、运动放大的默认参数等。一般保持默认即可。</p>
<hr />
<h2>五、技术细节（重点）</h2>
<blockquote>
<p dir="auto">这一章面向<strong>完全没有图像处理基础</strong>的读者，从零讲起，一步一步解释本软件"背后在算什么"。已经懂的人可以跳到 5.3 直接看算法对比。</p>
</blockquote>
<h3>5.1 零基础铺垫：先搞懂几个概念</h3>
<p dir="auto"><strong>① 像素与灰度</strong></p>
<p dir="auto">视频的每一帧就是一张图，由一个个小方格（像素）组成。灰度图里每个像素用一个数字表示亮度：<code>0</code> 是黑，<code>255</code> 是白。一个"移动了 1 个像素"的物体，就是它对应的那些像素值整体往旁边挪了一格。</p>
<p dir="auto"><strong>② 帧率与采样率</strong></p>
<p dir="auto">视频一秒钟有很多帧，这个数量叫帧率（fps）。例如 120 fps 就是每秒 120 张图。<strong>帧率就是测量的"采样率"</strong>：它决定了我们能测到多高的振动频率（最高能测到采样率的一半，即奈奎斯特频率）。</p>
<p dir="auto"><strong>③ 频率与频谱</strong></p>
<p dir="auto">"振动"就是某个东西在一段时间里来回动。<strong>频率</strong> = 一秒钟来回几次，单位赫兹（Hz）。把一段位移波形做数学变换（傅里叶变换 FFT），就能拆出"里面有哪些频率、各有多强"，这就是<strong>频谱</strong>——它告诉我们物体到底在哪个频率上振。</p>
<p dir="auto"><strong>④ 带通滤波</strong></p>
<p dir="auto">带通滤波 = 只保留"下限~上限"之间的频率，其余全滤掉。作用：<strong>只放大/只测量你关心的振动，把噪声、晃动、呼吸、摄像机抖动等都排除掉</strong>。</p>
<p dir="auto"><img src="images/02-%E5%B8%A6%E9%80%9A%E6%BB%A4%E6%B3%A2.png" alt="带通滤波示意" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>⑤ 图像金字塔</strong></p>
<p dir="auto">把一张图逐层缩小（每层宽高各缩一半），就像一座金字塔。缩小前是"细节 + 大块"，缩小后只剩"大块趋势"。<strong>"细节层"恰恰对微小运动最敏感</strong>，所以测振和放大都要先做金字塔分解。</p>
<p dir="auto"><img src="images/01-%E5%9B%BE%E5%83%8F%E9%87%91%E5%AD%97%E5%A1%94.png" alt="图像金字塔" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>⑥ 相位</strong></p>
<p dir="auto">可以把"振动"理解成一列波。波上每个点处于"波峰、波谷、还是中间"的状态叫<strong>相位</strong>。物体移动一点，波峰位置就挪一点——<strong>相位的变化就对应位移</strong>。相位法测振和相位放大，本质都是"测量 / 放大相位的变化"。</p>
<h3>5.2 软件架构与数据流</h3>
<p dir="auto">软件分为三层，依赖自上而下、单向调用：</p>
<p dir="auto"><img src="images/00-%E6%9E%B6%E6%9E%84%E5%88%86%E5%B1%82%E5%9B%BE.png" alt="架构分层图" class=" img-fluid img-markdown" /></p>
<ul>
<li><strong>ui（界面层）</strong>：只负责显示和交互。</li>
<li><strong>core（核心层）</strong>：<code>Workspace</code> 是"唯一数据源"，所有数据写操作都发生在这里；后台任务用 <code>TaskRunner</code> 跑在线程里，界面不卡。</li>
<li><strong>algo / data_io（算法与读写层）</strong>：<strong>纯函数、不依赖界面</strong>，可以脱离界面单独测试——这是算法可靠、易维护的关键。</li>
</ul>
<p dir="auto">数据流动方向如下：</p>
<p dir="auto"><img src="images/00-%E6%95%B0%E6%8D%AE%E6%B5%81%E5%9B%BE.png" alt="数据流图" class=" img-fluid img-markdown" /></p>
<h3>5.3 测振算法</h3>
<p dir="auto">测振的目标只有一个：<strong>算出 ROI 区域每一帧相对第一帧移动了多少像素（dx、dy）</strong>。软件内置三种算法，各有各的思路。</p>
<h4>5.3.1 LK 光流法（默认，最常用）</h4>
<p dir="auto"><strong>一句话</strong>：先在 ROI 里找一批"好跟踪的角点"，然后逐帧跟踪这些点往哪儿跑了，取所有点位移的中位数。</p>
<p dir="auto"><strong>比喻</strong>：在物体表面贴几个荧光点，用摄像头持续盯着它们怎么移动。</p>
<p dir="auto"><img src="images/07-%E6%B5%8B%E6%8C%AF-LK%E5%85%89%E6%B5%81.png" alt="LK 光流测振" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>分步解释：</strong></p>
<ol>
<li><strong>找角点</strong>（<code>goodFeaturesToTrack</code>）：角点就是图像里"纹理丰富、拐角明显"的点，容易跟踪。软件在 ROI 里最多找 60 个这样的点。</li>
<li><strong>逐帧跟踪</strong>（<code>calcOpticalFlowPyrLK</code>）：用"金字塔光流"——先在缩小图上粗跟踪，再逐层放大细化，又快又稳。每一帧都算出每个点移动了多少。</li>
<li><strong>取中位数</strong>：60 个点会给出 60 个位移，取它们的<strong>中位数</strong>作为整块 ROI 的位移。取中位数（而不是平均数）的好处是：个别点跟踪错了也不会把结果带偏。</li>
<li><strong>输出波形</strong>：把所有帧的位移连起来，就是 dx/dy 随时间变化的波形，再做频谱得到振动频率。</li>
</ol>
<ul>
<li><strong>优点</strong>：精度高、抗噪好，适合大多数情况。</li>
<li><strong>缺点</strong>：ROI 里纹理太少（比如纯色墙面）会找不到足够角点而报错。</li>
</ul>
<h4>5.3.2 NCC 互相关法</h4>
<p dir="auto"><strong>一句话</strong>：从第一帧 ROI 里扣一块小模板，到每一帧里"滑动搜索"这块模板最像的位置，位置挪了多少就是位移。</p>
<p dir="auto"><strong>比喻</strong>：拼图找位置——拿一块模板到每帧画面里比对，看它"挪到了哪儿"。</p>
<p dir="auto"><img src="images/08-%E6%B5%8B%E6%8C%AF-NCC%E4%BA%92%E7%9B%B8%E5%85%B3.png" alt="NCC 互相关测振" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>分步解释：</strong></p>
<ol>
<li><strong>扣模板</strong>：从第一帧的 ROI 中心内缩，取一小块当"参照物"。</li>
<li><strong>逐帧滑动搜索</strong>（<code>matchTemplate</code>，归一化互相关系数 <code>TM_CCOEFF_NORMED</code>）：在每一帧的 ROI 范围内逐像素滑动模板，算出每个位置的"相似度"，相似度最高的位置就是模板当前所在位置。</li>
<li><strong>抛物线亚像素插值</strong>：搜索只能精确到整像素，但真正的位移往往在两个像素之间。软件在"峰值位置"附近用一条抛物线拟合，求出更精细的<strong>亚像素</strong>偏移（可到 0.01 像素）。</li>
<li><strong>输出波形</strong>：同样得到 dx/dy 波形（并做中值去毛刺）。</li>
</ol>
<ul>
<li><strong>优点</strong>：对弱纹理、长时间稳定的场景更稳。</li>
<li><strong>缺点</strong>：适合小位移；ROI 太小会报错（至少要 24×24 像素左右）。</li>
</ul>
<h4>5.3.3 相位法测振</h4>
<p dir="auto"><strong>一句话</strong>：把位移"读作相位差"——用里斯变换算出每帧的局部相位，相对第一帧的相位差就是运动量。</p>
<p dir="auto"><strong>比喻</strong>：看水波——不追某一个水分子，而是看"波峰/波谷的相位"移动了多少。</p>
<p dir="auto"><img src="images/09-%E6%B5%8B%E6%8C%AF-%E7%9B%B8%E4%BD%8D%E6%B3%95.png" alt="相位法测振" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>分步解释：</strong></p>
<ol>
<li><strong>金字塔分解</strong>：对 ROI 做拉普拉斯金字塔，取细节最丰富的第 0 层（对微小运动最敏感）。</li>
<li><strong>里斯变换</strong>：把这一层变成"幅值 + 相位"（相位带有方向和大小）。</li>
<li><strong>求相位差</strong>：每一帧的相位减去第一帧的相位，得到"相位差"——它正比于运动量。</li>
<li><strong>幅值加权 + 标定</strong>：幅值大的地方信号更可信，做加权平均；最后用 NCC 的位移结果自动标定比例，把"相位差"换算成"像素"。</li>
</ol>
<ul>
<li><strong>优点</strong>：擅长测<strong>亚像素微振动</strong>，主频直接精确。</li>
<li><strong>缺点</strong>：实现最复杂，计算稍重。</li>
</ul>
<h4>5.3.4 三种测振算法怎么选？</h4>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>场景</th>
<th>推荐算法</th>
</tr>
</thead>
<tbody>
<tr>
<td>一般情况、不确定</td>
<td><strong>LK 光流</strong>（默认）</td>
</tr>
<tr>
<td>纹理弱、但画面稳定</td>
<td><strong>互相关(NCC)</strong></td>
</tr>
<tr>
<td>振幅极小、想测高精度微振动</td>
<td><strong>基于相位</strong></td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto"><strong>提示</strong>：ROI 尽量框在有纹理、对比度明显的地方（如边缘、花纹），避免纯色区域，三种算法的精度都会明显更好。</p>
</blockquote>
<h3>5.4 运动放大算法</h3>
<p dir="auto">运动放大回答另一个问题：<strong>怎么让看不见的微小振动"看得见"</strong>。软件内置三种算法，都来自 MIT 的经典论文。</p>
<h4>5.4.1 线性（欧拉）放大 —— 放大"亮度的波动"</h4>
<p dir="auto"><strong>一句话</strong>：把"像素亮度随时间的小波动"放大 N 倍，再叠回原画面。</p>
<p dir="auto"><strong>比喻</strong>：物体振动时，它边缘的像素会一明一暗地周期性变化（因为边缘一会儿盖住背景、一会儿移开）。把这种明暗变化放大，就"看见"振动了。</p>
<p dir="auto"><img src="images/10-%E6%94%BE%E5%A4%A7-%E7%BA%BF%E6%80%A7%E6%AC%A7%E6%8B%89.png" alt="线性欧拉放大" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>分步解释：</strong></p>
<ol>
<li><strong>金字塔分解</strong>：把画面按尺度拆开（粗趋势 + 各层细节）。</li>
<li><strong>时域带通</strong>：对每一层沿时间轴做带通，只留下你指定频率段（比如 1~5 Hz 的振动）。</li>
<li><strong>乘放大倍数</strong>：把这些过滤出来的微小变化乘以放大倍数 N。</li>
<li><strong>加回原图重建</strong>：放大后的波动叠加回原始画面。</li>
</ol>
<p dir="auto">核心公式：<strong>输出帧 = 原始帧 + 放大倍数 × 带通残差</strong>。</p>
<ul>
<li><strong>优点</strong>：快、能实时预览，实现简单。</li>
<li><strong>缺点</strong>：放大倍数大时噪声也会被放大，可能出现"过曝/亮斑"伪影。</li>
</ul>
<h4>5.4.2 里斯金字塔放大 —— 放大"相位"（推荐）</h4>
<p dir="auto"><strong>一句话</strong>：不放大亮度，而是放大"局部相位"（相位 = 位置的编码）。</p>
<p dir="auto"><strong>比喻</strong>：把运动编码成"相位"，放大相位就等于放大位移；因为只动相位、不动亮度，所以更干净、噪声更少。</p>
<p dir="auto"><img src="images/11-%E6%94%BE%E5%A4%A7-%E9%87%8C%E6%96%AF%E9%87%91%E5%AD%97%E5%A1%94.png" alt="里斯金字塔放大" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>分步解释：</strong></p>
<ol>
<li><strong>拉普拉斯金字塔分解</strong>：按尺度拆开，逐层处理。</li>
<li><strong>里斯变换</strong>：把每一层变成"幅值 + 方向相位"。这里用了正则化里斯变换（<code>-i·ω/√(‖ω‖²+ε²)</code>），避免直流分量处的奇异性。</li>
<li><strong>相位差 + 带通</strong>：每帧相对第一帧求相位差（四元数共轭积，带方向两分量），再只留振动频率段。</li>
<li><strong>幅值加权去噪</strong>：幅值大的地方权重高，压制噪声。</li>
<li><strong>放大相位 + 重建</strong>：相位差 × 放大倍数，再逆变换、金字塔重建回整帧。</li>
</ol>
<ul>
<li><strong>优点</strong>：比线性法支持<strong>更大倍率</strong>、噪声更少，是<strong>实时预览的默认推荐</strong>。</li>
<li><strong>缺点</strong>：比线性法计算稍重，缓存更占内存（见第六章）。</li>
</ul>
<blockquote>
<p dir="auto"><strong>软件亮点</strong>：放大中间量（各层相位）是<strong>与倍率无关</strong>的，所以算完后<strong>拖动"放大系数"滑块可以实时预览，不用重新计算</strong>。</p>
</blockquote>
<h4>5.4.3 复可控金字塔（相位法）—— 最高质量，仅导出用</h4>
<p dir="auto"><strong>一句话</strong>：用更精细的"多尺度 × 多方向"复可控金字塔分解，质量最高，但计算量极大。</p>
<p dir="auto"><strong>比喻</strong>：把画面从"多个尺度"和"4 个方向"同时拆解，每个方向单独处理相位，因此对任意方向、任意尺度的运动都处理得最好。</p>
<p dir="auto"><img src="images/12-%E6%94%BE%E5%A4%A7-%E5%A4%8D%E5%8F%AF%E6%8E%A7%E9%87%91%E5%AD%97%E5%A1%94.png" alt="复可控金字塔放大" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>分步解释：</strong></p>
<ol>
<li><strong>每帧 FFT 到频域</strong>：整段视频批量傅里叶变换。</li>
<li><strong>多尺度 × 多方向滤波</strong>：复可控金字塔滤波器把画面拆成多个尺度、4 个方向的子带。</li>
<li><strong>相位差 + 带通 + 去噪</strong>：每个子带相对首帧求相位差，带通 + 幅值加权去噪。</li>
<li><strong>相位放大（防混叠）</strong>：相位差 × 倍率，并裁剪到不超过 π/2 防止混叠伪影。</li>
<li><strong>逆变换重建</strong>：各子带拼回画面，去除 padding 得到结果。</li>
</ol>
<ul>
<li><strong>优点</strong>：质量最高、伪影最少、能支持最大倍率。</li>
<li><strong>缺点</strong>：<strong>固定倍率、一次性算完所有放大帧，计算量极大</strong>（可能 30 分钟以上），所以只在"导出放大视频"时可选。</li>
</ul>
<h4>5.4.4 三种放大算法对比</h4>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>算法</th>
<th>速度</th>
<th>质量</th>
<th>实时预览</th>
<th>何时用</th>
</tr>
</thead>
<tbody>
<tr>
<td>线性(欧拉)</td>
<td>快</td>
<td>一般</td>
<td><img src="https://www.pixvib.com/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=897d1dceafb" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
<td>快速看看、倍率不大</td>
</tr>
<tr>
<td>里斯金字塔</td>
<td>中</td>
<td>好</td>
<td><img src="https://www.pixvib.com/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=897d1dceafb" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
<td><strong>日常默认</strong></td>
</tr>
<tr>
<td>复可控金字塔</td>
<td>极慢</td>
<td>最好</td>
<td><img src="https://www.pixvib.com/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=897d1dceafb" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" />（仅导出）</td>
<td>出高质量成品视频</td>
</tr>
</tbody>
</table>
<h3>5.5 信号处理细节（进阶）</h3>
<ul>
<li><strong>去趋势（detrend）</strong>：测振结果（光流/相位累积）会有缓慢漂移，软件用最小二乘拟合一条直线并减掉，避免频谱低频端出现假峰、RMS 被抬高。</li>
<li><strong>频谱（spectrum）</strong>：单边幅值谱，默认加 Hanning 窗并做幅值修正，窗函数可选 Hanning / Hamming / 矩形。</li>
<li><strong>去毛刺（despike）</strong>：用 MAD 中值法，把波形里孤立的尖峰替换成中值，抗个别跟踪错误。</li>
</ul>
<h2>六、内存与性能（重点）</h2>
<blockquote>
<p dir="auto"><strong>试用时最常见的报错，十有八九是"内存超了"。这一章把它彻底讲清楚。</strong></p>
</blockquote>
<h3>6.1 内存都去哪了？</h3>
<p dir="auto">软件把数据放在内存（RAM）里计算，主要三块：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>数据</th>
<th>类型</th>
<th>占多少</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>原始帧</strong> <code>frames</code></td>
<td>uint8（1 字节/像素）</td>
<td>灰度 = 帧数 × 高 × 宽 × 1 字节</td>
</tr>
<tr>
<td><strong>振动数据</strong></td>
<td>float32</td>
<td>每个 ROI 一点点，可忽略</td>
</tr>
<tr>
<td><strong>放大缓存</strong></td>
<td>float32（4 字节/像素）× 多层金字塔</td>
<td><strong>最大头</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">下图是一个真实例子（1280×720 灰度视频，10 秒 @120fps）：</p>
<p dir="auto"><img src="images/00-%E5%86%85%E5%AD%98%E6%9E%84%E6%88%90%E5%9B%BE.png" alt="内存构成图" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>结论一目了然：放大缓存才是内存大头，里斯金字塔放大缓存 ≈ 原始帧的 27 倍。</strong></p>
<p dir="auto">为什么这么夸张？因为运动放大要做<strong>金字塔分解</strong>，把画面拆成多层；每一层还要存<strong>多个 float32 缓冲</strong>（里斯法存 5 个：亮度、里斯两分量、相位差两分量），而 float32 是 uint8 的 4 倍。几层金字塔加起来，内存就翻了几十倍。</p>
<h3>6.2 为什么"读的时候没事，一算放大就报错"？</h3>
<p dir="auto">这是关键，也是很多人误解的地方：</p>
<ol>
<li>软件在<strong>读视频</strong>时有一个 <strong>2 GB 警告</strong>：读入的帧数据如果超过 2 GB，会红字提醒你"建议缩小区域或减少帧数"。</li>
<li>但这个警告<strong>只针对"原始帧"</strong>，<strong>不针对"放大缓存"</strong>。</li>
<li>于是典型流程是：读入 1 GB 的帧（没超 2 GB，没有警告）→ 点「计算放大」→ 放大缓存突然要 27 GB → <strong>内存爆了，报 MemoryError / 程序卡死或崩溃</strong>。</li>
</ol>
<p dir="auto">所以"试用时报错"，绝大多数不是 bug，而是<strong>素材尺寸/帧数 × 里斯放大，超出了电脑的内存上限</strong>。</p>
<h3>6.3 如何避免内存超限（照做即可）</h3>
<ol>
<li><strong>优先读灰度</strong>：彩色是灰度的 3 倍内存，而测振和放大只用亮度，多数情况用灰度即可。</li>
<li><strong>缩小 ROI / 裁剪区域</strong>：只读你关心的那块区域，帧数据直线下降。</li>
<li><strong>减少帧数</strong>：只读需要的那一段（比如振动持续的那几秒），不要整段全读。</li>
<li><strong>放大用完后点「释放缓存」</strong>：放大缓存很占内存，不看了就点「释放缓存」，立刻释放。</li>
<li><strong>删除不用的素材</strong>：多个素材的内存是<strong>叠加</strong>的，处理完一个删一个。</li>
<li><strong>内存小的机器优先用「线性」放大</strong>：线性缓存 ≈ 8 倍帧数据，比里斯（27 倍）省得多。</li>
</ol>
<h3>6.4 性能小提示</h3>
<ul>
<li><strong>测振很快</strong>：三种测振都是逐帧轻量运算，通常几秒内完成。</li>
<li><strong>实时放大不卡</strong>：放大中间量与倍率无关，算完后拖倍率滑块是实时预览。</li>
<li><strong>复可控金字塔极慢</strong>：只在导出高质量视频时用，可能 30 分钟以上，期间请耐心等待、不要关程序。</li>
<li><strong>取消有秒级延迟</strong>：单次 FFT/滤波是原子运算，无法中途打断，点"取消"后要等当前这一步算完才停，这是正常的。</li>
</ul>
<hr />
<h2>七、常见问题与排错</h2>
<h3>Q1：报错"内存不足 / MemoryError / 程序直接闪退"</h3>
<p dir="auto"><strong>这是内存超限</strong>（见第六章）。按 6.3 的步骤：读灰度 → 缩小区域 → 减少帧数 → 用线性放大 → 用完释放缓存 → 删旧素材。</p>
<h3>Q2：测振报错"ROI 内纹理不足，找不到足够特征点"</h3>
<p dir="auto">LK 光流需要纹理丰富的区域。<strong>换到有边缘/花纹的地方框 ROI</strong>，或改用「互相关(NCC)」算法（对纹理要求更低）。</p>
<h3>Q3：报错"ROI 太小，至少要 24×24 像素"</h3>
<p dir="auto">把 ROI 框大一点即可。</p>
<h3>Q4：报错"带通参数不合法：X ~ Y Hz"</h3>
<p dir="auto">带通必须满足 <strong>0 &lt; 下限 &lt; 上限 &lt; 采样率的一半</strong>（奈奎斯特频率）。例如 120 fps 的视频，采样率 120 Hz，上限必须 &lt; 60 Hz。</p>
<h3>Q5：打不开视频文件</h3>
<p dir="auto">确认视频格式受支持（OpenCV 支持 mp4/avi/mjpeg 等常见格式）。换个文件或转码后再试。</p>
<h3>Q6：波形乱、漂移、低频有假峰</h3>
<ul>
<li>尽量固定相机（三脚架），减少整体晃动。</li>
<li>ROI 选纹理清晰处。</li>
<li>软件已内置"去趋势"和"去毛刺"，如仍乱，可缩小 ROI 或换算法。</li>
</ul>
<h3>Q7：点"取消"后界面像卡住</h3>
<p dir="auto">后台任务是单线程原子运算，取消要等当前这一步算完（秒级延迟），属正常现象，稍等即可。</p>
<hr />
<h2>附录：算法论文出处</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>功能</th>
<th>算法</th>
<th>出处</th>
</tr>
</thead>
<tbody>
<tr>
<td>运动放大</td>
<td>线性(欧拉)</td>
<td>Wu et al., <em>Eulerian Video Magnification for Revealing Subtle Changes in the World</em>, SIGGRAPH 2012</td>
</tr>
<tr>
<td>运动放大</td>
<td>里斯金字塔</td>
<td>Wadhwa et al., <em>Riesz Pyramids for Fast Phase-Based Video Magnification</em>, ICCP 2014</td>
</tr>
<tr>
<td>运动放大</td>
<td>复可控金字塔</td>
<td>Wadhwa et al., <em>Phase-Based Video Motion Processing</em>, SIGGRAPH 2013</td>
</tr>
<tr>
<td>测振</td>
<td>LK 光流</td>
<td>Lucas &amp; Kanade, 1981（金字塔光流：Bouguet, 2000）</td>
</tr>
<tr>
<td>测振</td>
<td>NCC 互相关</td>
<td>归一化互相关模板匹配（OpenCV <code>matchTemplate</code>）</td>
</tr>
<tr>
<td>测振</td>
<td>相位法</td>
<td>Riesz 变换局部相位（与里斯金字塔同源）</td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto">延伸阅读：上述论文均可在作者主页或学术搜索引擎免费获取，适合想深入了解原理的读者。</p>
</blockquote>
<hr />
<p dir="auto"><em>本文档由「像素振动」项目自动生成图文版与 Markdown 版，内容与软件实现一致。</em></p>
]]></description><link>https://www.pixvib.com/topic/2/像素振动-v1.0-版本正式发布</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 10:23:38 GMT</lastBuildDate><atom:link href="https://www.pixvib.com/topic/2.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Sep 2026 05:38:52 GMT</pubDate><ttl>60</ttl></channel></rss>