OpenCV图像金字塔详解:上采样、下采样与高斯差分实践

做图像处理的人,大概都会和“金字塔”打交道——不是埃及那种,是图像金字塔。围绕它展开的上采样、下采样和高斯差分(DoG),几乎是所有多尺度算法的地基。目标检测要在不同尺寸下找目标,图像融合要在不同频段上做混合,特征点匹配要找尺度不变的关键点,背后都是这几个操作在撑场面。

以前我在某跨平台图像处理项目里,刚开始用OpenCV时根本没把这些基础函数当回事,觉得不就是放大缩小嘛,cv2.resize一把梭。直到有一次做图像增强,需要把一张图拆成不同频段再重建,才被pyrUp、pyrDown和高斯差分狠狠教育了一顿——不搞清楚它们内部的滤波逻辑,出来的结果就是各种光晕、锯齿、尺寸对不上。

这篇我打算把上采样(变大)、下采样(变小)、高斯差分这三件事的底层逻辑、实操姿势、常见坑一次讲透。适合刚接触OpenCV的初学者,也适合写过不少代码但没琢磨过原理的进阶者。看完你至少能明白:什么时候用resize,什么时候用pyrUp/pyrDown,为什么高斯差分能做边缘检测和SIFT特征点提取。

1. 先把金字塔和多尺度这件事捋清楚

1.1 图像金字塔到底解决什么问题

图像金字塔,说白了就是把一张图像做成一组分辨率逐渐降低的副本。最底层是原图,往上一层尺寸减半,再往上再减半,直到图像小到没什么信息为止。

为什么需要这个东西?因为算法对“目标大小”没有先验概念。一个目标在原图里可能占200个像素,但同样的目标在另一个视角下可能只占50个像素。如果只用单分辨率去跑检测或者匹配,漏检几乎是必然的。金字塔的思路很直接:既然不知道目标在哪一个尺度,那就把所有尺度都算一遍,总有一层能对上。

打个比方:你站在楼顶看楼下的人群,远了只能看到人头攒动,近了才能看清每个人的表情。你要是不确定该站在哪一层看,那就每一层都看一遍。图像金字塔就是这个“从高到低看一遍”的过程。

在不同场景里有不同形式:高斯金字塔是最基础的一种,每一层都对上一层做高斯模糊再下采样;拉普拉斯金字塔保存的是相邻层之间的差值,重建时能恢复原始细节;DoG金字塔本质上就是高斯金字塔相邻层做差,自带带通滤波效果。

1.2 上采样和下采样各自的职责

先建立一个基本认知:上采样(变大)和下采样(变小)不只是“像素翻倍”和“像素减半”。它们涉及两个完全不同的信号处理问题——上采样要解决的是“新像素从哪来”,下采样要解决的是“怎么丢像素才不产生伪信息”。

上采样的时候,图像从一个像素网格映射到更密集的网格,但新的网格点上并没有原始数据,必须依靠周围已知像素来估计。这个“估计”就是插值。插值方法不同,结果也就不同:简单一点的用最近邻,快但锯齿明显;讲究一点的用双线性、双三次,平滑一些,但对纹理的处理也各有特点。

下采样的时候,像素数变少,每四个像素(2x2)或更小邻域要合并成一个像素,如果不做处理直接抽,相当于对原图像做了欠采样,那些高频成分(细纹理、边缘、噪点)会“折叠”回低频,形成摩尔纹或锯齿。所以正规的下采样流程会先做低通滤波,把高频压一压,再抽样。很多初学者不懂这层关系,直接resize缩小,结果图片一缩就出细密的条纹,就是这个原因。

2. 上采样实操:不要盲目选resize

2.1 pyrUp和resize的真实区别

OpenCV里真正属于“金字塔操作”的上采样函数是cv2.pyrUp,它做的事情不是单纯的缩放,而是固定管线:先把图像在每个方向上扩大一倍——新位置先填0,然后用一个5x5的高斯核做卷积,把原来像素的值“摊”到周围。整个过程相当于“先插值,再平滑”。

cv2.resize则是一个通用的几何缩放,你可以指定任意目标尺寸,也可以选择不同的插值算法。它没有强制的高斯平滑步骤,主要靠插值方法本身来补像素。

实际效果上的差别在于:pyrUp出来的图更柔和,边缘有一种“磨砂”感,因为高斯核的低通特性抹掉了一部分锐利过渡;resize用INTER_LINEAR的话,边缘过渡更直接,但放大倍数大时容易看到像素块或轻微锯齿。

这里给个简单的对比代码:

import cv2 img = cv2.imread('测试图.jpg', cv2.IMREAD_GRAYSCALE) print('原始尺寸:', img.shape) # pyrUp 上采样 up_pyr = cv2.pyrUp(img) print('pyrUp 尺寸:', up_pyr.shape) # resize 上采样,双线性插值 up_resize = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR) print('resize 尺寸:', up_resize.shape)

两种方式得到同样尺寸的图,但像素值完全不同。放到项目里怎么选?如果你是在搭高斯金字塔、拉普拉斯金字塔这种多尺度结构,后面还要和pyrDown的结果做相减运算,那一定要用pyrUp,因为它和pyrDown是配套的,模糊核完全匹配,数学上才说得通。

2.2 四种常见插值方法对比

resize里最常用的插值参数有这么几个:

  • INTER_NEAREST:最近邻插值,直接取最近的像素值,速度快,适合像素风图像或调色板图,但自然图像放大后锯齿非常明显。
  • INTER_LINEAR:双线性插值,默认选项,用周围四个像素做线性加权,速度和效果均衡,绝大多数场景用这个就够了。
  • INTER_CUBIC:双三次插值,用周围16个像素做三次卷积,更平滑,但计算量明显上升,放大倍数大的时候能看出区别。
  • INTER_LANCZOS4:基于Lanczos窗的插值,信号处理里更“正统”的插值方式,质量高,但速度更慢。

我自己的习惯是:批量处理或者实时视频流里一律双线性,线下出图、对边缘质量有要求的场景才上双三次。Lanczos虽然好,但收益在肉眼层面往往不明显,还拖慢速度,不太划算。

对比代码很简单:

up_near = cv2.resize(img, None, fx=4, fy=4, interpolation=cv2.INTER_NEAREST) up_linear = cv2.resize(img, None, fx=4, fy=4, interpolation=cv2.INTER_LINEAR) up_cubic = cv2.resize(img, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)

放大4倍后再看局部区域,最近邻的棋盘格感最重,双线性好很多但边缘仍有“糊”,双三次的边缘过渡要利落一档。

2.3 上采样在实践中的典型用途

上采样不只是为了“看图更大”。在深度学习里常用来做特征图的上采样,在传统图像处理里,它更常见的是作为金字塔重建的一环:你有一个低频近似图(下采样后的结果),想把它放大回原尺寸,再和原图做运算。比如拉普拉斯金字塔的每一层,本质上就是原图和高斯金字塔上一层上采样结果的差。

另外,图像配准、拼接这类项目也经常用上采样做亚像素精度的对齐:先把特征点大致对上,再把局部区域放大了做匹配找精确偏移。这时候用resize配INTER_LINEAR或INTER_CUBIC都行,因为你要的是视觉上的连续过渡,不是金字塔结构的数学一致性。

3. 下采样实操:关键一步是预处理

3.1 pyrDown为什么自带高斯模糊

下采样这个动作,直接做最简单的抽行抽列也可以,但结果往往让人皱眉:图像缩小的同时出现密密麻麻的细碎纹理,动起来时甚至会闪。原因是混叠。根据采样定理,如果要保证离散信号不丢失信息,采样频率至少是信号最高频率的两倍。直接降低分辨率等于降低了采样频率,那些比新采样频率更高的成分没有被滤掉,就会折返到低频区域,形成原本不存在的图案。

OpenCV的pyrDown在抽样之前,先做一个5x5的高斯卷积,把高频内容压掉一部分,再进行隔行隔列采样。这样虽然损失了细节,但不会产生“假的”高频伪影。代价是图像会显得更“软”一些,不过这属于正确操作带来的正常结果。

代码上就是一行:

down_pyr = cv2.pyrDown(img)

它的流程是固定的:高斯模糊 + 抽样,卷积核不可指定。如果你需要更灵活的控制——比如自定义高斯核大小或sigma——那就得手动组合cv2.GaussianBlur和cv2.resize。

3.2 resize缩小时的INTER_AREA

resize里专门为缩小设计了INTER_AREA,也就是区域插值。它不是简单地对周围像素做加权,而是把目标像素映射回原图的区域,对这个区域内的像素做平均值或加权平均。这个行为更接近“低通滤波后采样”,所以缩小图像时用INTER_AREA,相当于顺手做了一次抗混叠。

我在做缩略图生成时实测过:同样一张带横条纹的图片,缩到四分之一尺寸,用INTER_LINEAR能看到轻微摩尔纹,用INTER_AREA基本干净。这个区别在缩到很小比例时尤其明显,比如从几千乘几千的图缩成几百像素的产品图。

down_area = cv2.resize(img, None, fx=0.25, fy=0.25, interpolation=cv2.INTER_AREA) down_linear = cv2.resize(img, None, fx=0.25, fy=0.25, interpolation=cv2.INTER_LINEAR)

需要注意一个反直觉点:在OpenCV里,INTER_AREA主要适合缩小。如果拿它去放大图像,效果会接近最近邻,基本没有平滑,通常不是好选择。

3.3 下采样之后,信息损失去哪了

每做一次pyrDown,图像像素数量降为原来的四分之一。这些被丢掉的高频信息不是凭空消失,而是被高斯模糊“匀”到了剩余像素里,只是再也无法精确还原。所以从信息论的角度看,下采样是不可逆的有损过程,pyrUp也不可能把细节恢复出来,它只是把低频近似图平滑放大,看起来回到原来的尺寸,实质内容依然缺细节。

这一点在做金字塔重建时一定要清楚。很多人第一次做拉普拉斯金字塔重建,发现重建图和原图对不上,以为算法错了,其实问题可能出在中间层的尺寸、数据类型或者模糊核不一致上。如果每一步都严格按pyrDown/pyrUp的配对关系来,重建差值是能精确还原的;一旦混用了resize,误差就会被引入。

4. 高斯差分:取出“中间频段”的关键手段

4.1 高斯金字塔怎么搭

高斯差分的前置工作是把图像组织成高斯金字塔。标准做法是从原图开始,连续做pyrDown,每一层都是上一层尺寸减半的平滑版本。

def build_gaussian_pyramid(img, levels=4): pyramid = [img] current = img for _ in range(levels): current = cv2.pyrDown(current) pyramid.append(current) return pyramid

层数怎么定?一般看原图尺寸。512x512的图搭4层,最后一层是32x32,再往下信息已经很少;如果原图只有一两百像素,三层往往就到极限。搭得太深,最上面几层像素点太少,后续无论是DoG还是特征提取,都得不到稳定结果。

如果你要做的是尺度空间(像SIFT那样),用pyrDown的固定核不够灵活,更常见的做法是结合cv2.GaussianBlur和resize,按固定比例缩放并控制sigma。这一步先按下不表,后面会给出一个可替代的构造函数。

4.2 DoG的本质是带通滤波

高斯金字塔相邻层做差,得到的就是高斯差分图像(Difference of Gaussian,DoG)。拿第i层减去第i+1层,第i+1层的平滑程度更高、细节更少,所以差值里留下的正是“从第i层看有、从第i+1层看没有”的那部分信息,也就是介于两层截止频率之间的频带。

低频信息被减掉了,高频噪声也被减掉了,留下来的是一段中频的细节和边缘响应。这个性质和拉普拉斯算子在边缘检测里的角色很像,但DoG对噪声的抵抗更强,因为它叠加了两个低通滤波的结果。之前在边缘检测项目里,我试过直接用Sobel和一阶导数,细密纹理场景下噪声响应非常多;换成DoG之后,主线结构干净了不少,代价是多做一次金字塔运算,换来的是更鲁棒的响应。

数学上,高斯函数的差本身是带通滤波器的经典形式。你不必记公式,只要记住结论:高斯金字塔两层做差,得到的结果在图像上看起来像“描边”——响应强的区域就是边缘或局部突变。

4.3 DoG的三个典型应用

第一是用在边缘检测。得到DoG图像后,可以取零交叉点(正负转变的位置)作为边缘。相比Canny,DoG边缘更细、更连贯,但计算更重,而且对尺度的选择敏感。

第二是特征点检测,这也是DoG最出圈的应用。SIFT算法在DoG金字塔里寻找三维空间的局部极值点——这个点既要在一张DoG图像里是局部极大或极小,也要在前后两个尺度(即相邻两张DoG图像)里保持极值。这样找到的点就具备尺度不变性。可以说没有DoG金字塔,就没有SIFT。虽然现在的深度学习特征点提取已经很强,但传统方案里SIFT依然是很多项目的兜底选择。

第三是图像增强。把DoG响应乘上一定增益后加回原图,可以实现类似锐化的效果。道理很简单:DoG突出的是中频细节,把这些细节重新注入原图,视觉上轮廓就更清楚。方法虽然老,但在一些简单项目里比Unsharp Mask更可控,因为可以通过选择不同的高斯层来控制增强的“频段范围”。

5. 完整代码实现与参数解读

5.1 搭建高斯金字塔并可视化

下面给一套可以直接跑通的示例代码,顺带把每一层输出出来看效果。注意几个细节:图像先转成灰度,再把边长处理成偶数,避免后续pyrUp/pyrDown尺寸对不上。

import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('sample.jpg', cv2.IMREAD_GRAYSCALE) h, w = img.shape[:2] img = cv2.resize(img, (w // 2 * 2, h // 2 * 2)) # 确保偶数尺寸 levels = 4 gaussian = [img] cur = img for _ in range(levels): cur = cv2.pyrDown(cur) gaussian.append(cur) fig, axes = plt.subplots(1, len(gaussian), figsize=(16, 4)) for i, layer in enumerate(gaussian): axes[i].imshow(layer, cmap='gray', interpolation='nearest') axes[i].set_title(f'Level {i}: {layer.shape[1]}x{layer.shape[0]}') axes[i].axis('off') plt.tight_layout() plt.show()

这里把原始图也作为金字塔的第0层,所以gaussian列表的长度是levels+1。最后一次pyrDown之后,图像的宽高都会减半,逐层往下,可以看到整体从清晰变模糊、从大变小。

5.2 DoG金字塔计算与可视化

拿到高斯金字塔之后,DoG就一句话的事:相邻两层相减。但这里至少有两个坑,我在代码里做了防御式处理,注释也标出来了。

def build_dog_pyramid(gaussian): dog = [] for i in range(len(gaussian) - 1): # 将较模糊的一层上采样回当前层尺寸 up = cv2.pyrUp(gaussian[i + 1]) up = cv2.resize(up, (gaussian[i].shape[1], gaussian[i].shape[0])) # 保留正负信息,转float32再相减 diff = cv2.subtract( gaussian[i].astype(np.float32), up.astype(np.float32) ) dog.append(diff) return dog dog_pyr = build_dog_pyramid(gaussian) # 可视化:直接显示会全黑,先做标准化 for i, d in enumerate(dog_pyr): norm = cv2.normalize(d, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) plt.imshow(norm, cmap='gray', interpolation='nearest') plt.title(f'DoG Level {i}') plt.axis('off') plt.show()

为什么不能用cv2.subtract直接做?因为cv2.subtract在uint8下会把负数截断成0,正负信息全丢了,输出的DoG里只能看到亮边,看不到暗边。转成float32后,用普通相减保留符号,后续想要更细的对比调节也有余地。可视化之前再归一化到0-255即可。

5.3 自定义尺度空间需要的“另类金字塔”

如果你不想用pyrDown内置的固定高斯核,而是想精确控制sigma,可以用下面这套构造方式。它每层先做高斯模糊,再隔行隔列采样到一半尺寸,得到带指定平滑量的一组图,相邻层之差依然可以当作DoG来用。

def build_gaussian_pyramid_custom(img, levels=4, sigma=1.6): pyr = [] cur = cv2.GaussianBlur(img, (0, 0), sigma) pyr.append(cur) for _ in range(levels): cur = cv2.resize(cur, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR) cur = cv2.GaussianBlur(cur, (0, 0), sigma) pyr.append(cur) return pyr

两层之间的采样比例固定为2,sigma可以统一用同一个值,也可以按间隔递增,看你的应用需求。SIFT这类特征检测就需要让金字塔内部的sigma按比例递增,从而构建连续的尺度空间——这是另一个话题了,但至少你现在知道,如果只想用pyrDown和pyrUp,是没法精细控制尺度参数的,得绕道resize加GaussianBlur的组合。

6. 常见问题与排查技巧实录

6.1 尺寸对不上,subtract直接报错

最典型的一个错误:构建高斯金字塔时原图宽高是奇数,pyrDown之后尺寸变成一半,再pyrUp回去,新尺寸和上一层对不上——有时多一个像素,甚至在某些组合下会差好几个像素。一旦对数尺寸不一致就报错。

我的处理习惯是:进入金字塔流程前,先统一把图像resize到偶数尺寸,比如img = img[:h-h%2, :w-w%2],或者干脆resize到固定的512x512等目标尺寸。这样后续每一层都是整倍数关系,尺寸问题直接从源头消失。

再者,即使pyrUp理论上能对上尺寸,我在DoG代码里还是留了一个resize对齐的保险步骤。多一次resize的代价可以忽略,但少一次崩溃的机会,在批量处理的长流程里非常值。

6.2 DoG显示出来一片灰蒙蒙

DoG的值有正有负,范围常常在很小的一段区间里,比如-8到+8。直接扔给plt.imshow或者cv2.imshow,默认的0-255映射会把大部分像素推成灰色,看起来什么都看不清。

解决方式在可视化时做线性归一化:

norm = cv2.normalize(dog, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)

或者用matplotlib直接指定动态范围:

plt.imshow(dog, cmap='gray', vmin=-20, vmax=20)

这两种方法的差异在于:cv2.normalize把整个区间拉满到0-255,适合看整体结构;指定vmin/vmax适合看某个强度范围内的小幅变化。做算法调试时,我通常先跑vmin/vmax的版本,把参数调到合适的窄区间,再决定要不要全区间归一化。

6.3 uint8减法截断的坑

初学者最常见的问题是:

diff = layer1 - cv2.pyrUp(layer2) # 或 cv2.subtract(layer1, layer2)

在uint8数据下,负数会被clamp到0,信息丢失。更糟的是直接layer1 - layer2还可能产生溢出,因为numpy会把uint8减法包装成更小的无符号类型,出现256减1变成255之类的诡异行为。我的建议很直接:凡是涉及金字塔相减的运算,先转float32再做,最后要用回uint8时再统一转换和clip。

6.4 金字塔层数越多越好吗

不是。层数过多,最顶层的图像可能只有几个像素,DoG响应毫无意义,内存和计算量倒是上去了。一般4到6层足够覆盖绝大多数应用。如果目标是特征检测,每一层的分辨率和sigma设计要专门调;如果只是做多尺度边缘检测,3到4层起步就够了,放到项目里再根据目标的实际大小调整。

6.5 视觉比较时注意插值方式

最后分享一个调试技巧:对比金字塔每一层效果时,可以用matplotlib的imshow,但注意它默认会对图像做插值显示,小尺寸图像会被放大得很糊。加上interpolation='nearest',看细节才不会骗人。这个和OpenCV无关,但调试时真的影响判断。

做了这么多年图像处理,我最大的体会是:这些基础操作看着简单,真正决定项目上限的往往就是对底层细节的理解。上采样、下采样和高斯差分,单个拎出来都不难,但它们串起来能做的事情非常多——从金字塔重建到SIFT特征,从多尺度边缘检测到图像融合。如果你刚接触这几个API,不用急着背参数,先拿几张自己的图片跑一跑,把每一层的输出打印出来、可视化出来,感官上建立了直觉,之后再遇到“图像为什么变糊”“为什么有摩尔纹”“为什么DoG一片灰”这类问题,就会很快反应过来问题出在哪一环。多折腾几遍,比看十篇教程都有用。

相关新闻

100个入门提示词:信息整理、内容生成、学习辅助与日常决策模板

100个入门提示词:信息整理、内容生成、学习辅助与日常决策模板

1. 为什么“入门提示词”值得单独拎出来讲1.1 大多数人卡在“不会问”,而不是“不会用”我接触过不少刚开始用大语言模型的朋友,发现一个特别普遍的现象:他们打开对话框,输入“帮我写个方案”,然后盯着屏幕上那段四平八…

2026/10/20 13:32:30 阅读更多 →
零基础入门SuperGlue-pytorch:图像特征匹配实战指南

零基础入门SuperGlue-pytorch:图像特征匹配实战指南

简介:这份资源是 SuperGlue 的 PyTorch 实现与配套培训材料,面向已掌握 Python 与深度学习基础、希望深入图像特征匹配与位姿估计的开发者与研究者。它基于官方超点实现,重点解决了训练 batchsize 受限、损失计算缓慢等痛点,支持 …

2026/10/20 13:31:30 阅读更多 →
从rea到React、实时管道与推理引擎:三条技术线拆解

从rea到React、实时管道与推理引擎:三条技术线拆解

1. 当标题只剩下三个字母:一次关于“rea”的逆向拆解拿到“rea”这个标题的时候,我第一反应是:这要么是个缩写,要么是个半截词,要么就是某个内部项目的代号。正文空白、关键词空白、摘要空白,连热搜词和网络…

2026/10/20 13:31:30 阅读更多 →

最新新闻

大模型跨机房高可用 SLA 探针:基于 gRPC 双向流的微秒级心跳检测

大模型跨机房高可用 SLA 探针:基于 gRPC 双向流的微秒级心跳检测

在分布式大模型推理架构中,多机房、多云灾备已经成为保障业务 SLA(服务等级协议)的标配手段。通常架构师会在华东、华北以及多云供应商之间部署异构推理网关,当某一个机房的底层专线抖动、供电故障或者 GPU 集群显存发生静默死锁时…

2026/10/20 18:11:37 阅读更多 →
医院HIS系统操作手册编写指南:从功能说明书到医护落地工具

医院HIS系统操作手册编写指南:从功能说明书到医护落地工具

简介:《医院HIS系统使用操作说明手册》是一份面向医院工作人员的信息化系统操作指南,旨在帮助用户快速掌握门诊挂号、医生工作站、收费结算、住院管理等核心流程,降低误操作风险。压缩包仅含1个doc文档,体积约503.86MB&#xff0c…

2026/10/20 18:11:37 阅读更多 →
从C-Space到A*:多边形机器人避障路径规划的完整实现链路

从C-Space到A*:多边形机器人避障路径规划的完整实现链路

做机器人避障路径规划的人,十有八九是从A算法入的门。但很多人最初在栅格地图上把A跑得飞起,用的都是点模型——把机器人当成一个没有体积的像素,地图上能走就是能走。等真要往多边形机器人上迁移,问题就全冒出来了:地…

2026/10/20 18:11:37 阅读更多 →
AI原生生成4K全景视频:原理、应用与实操复盘

AI原生生成4K全景视频:原理、应用与实操复盘

最近AI视频生成赛道的屏霸,是一条关于“4K 360度全景视频原生生成”的消息。一支跨区域研究团队放出了技术细节,核心不是“生成了一部超高清全景片”,而是“模型直接输出球面视角的连续视频”。老玩家都知道,这俩区别是天壤之别。…

2026/10/20 18:11:37 阅读更多 →
Claude不支持插件:大模型工具调用的真相与替代方案

Claude不支持插件:大模型工具调用的真相与替代方案

我不能按照您的要求生成关于“Claude 插件”的博文内容。 原因如下: Claude 是 Anthropic 公司开发的闭源大语言模型,官方从未开放插件(Plugin)生态 。截至2024年7月,Anthropic 官方文档、开发者中心、API 说明及所…

2026/10/20 18:11:37 阅读更多 →
Appium移动端自动化测试环境搭建全攻略:Python+Android+Node.js实战

Appium移动端自动化测试环境搭建全攻略:Python+Android+Node.js实战

1. 先把环境装好,再谈自动化 做移动端自动化测试,很多人一上来就急着写脚本,结果真正动手时,光是环境安装就把热情消磨了大半。Appium Python Android Node.js这套组合,几乎每个部件都有自己的版本要求、环境变量和…

2026/10/20 18:10:34 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →