逆滤波越除越崩?维纳滤波如何在频域稳住图像复原的PSNR

简介:面向图像处理课程作业与实验场景,这份资源提供了一套完整的大气湍流退化图像复原方案。主要内容是使用大气湍流模型对原始图像进行退化,并叠加高斯噪声,随后分别通过维纳滤波和逆滤波实现复原对比,最终以PSNR和MSE作为客观评价指标。资源包共包含3个文件,包括两个MATLAB脚本(homework.m为主程序、psnr_mse.m为评价函数)以及一张测试用jpg图像,压缩包整体仅107KB,适合快速下载和运行。目前已有2489人学习下载,适合正在完成图像复原相关作业或需要参考滤波实现细节的学生。实验代码可直接运行,并特别讨论了取整误差对逆滤波的影响:即便不添加高斯噪声,逆滤波也难以完全还原原始图像,而维纳滤波在抑制噪声和保持细节方面表现更佳,为理解两类方法的适用条件提供了直观对比。

1. 图像复原里的反直觉现场:逆滤波越除越崩,维纳滤波看着糊却稳住了 PSNR

图像复原这个领域里最反直觉的一件事,恰好是“数学上越完美,结果越灾难”:对一张被大气湍流模糊、又叠了高斯噪声的图做逆滤波,公式推导出的解是唯一且精确的,可落到代码里就是满屏雪花;而维纳滤波只是把除法换成了加权处理,视觉上看着“糊了一层”,PSNR 和 MSE 却反而健康得多。这个反差不是实现 Bug,而是两个滤波器对噪声频谱的假设根本不同。搞懂维纳滤波为什么能稳住数值、逆滤波又是在哪一步自爆的,等于摸清了图像复原最核心的机制:在频域做除法之前,必须先回答“这个频点上的值,该信信号还是信噪声”。

2. 大气湍流模型:从波前畸变到频域 OTF 的工程近似

2.1 湍流为什么让成像退化:折射率扰动与等晕区

大气湍流的成因,是温度和压强随机起伏导致空气折射率在空间和时间上共同脉动。光线穿过这种起伏介质时,波前相位被随机扭曲,点光源在像平面上不再成像为一点,而是被展成一个模糊斑。长时间曝光下,这些随机游走的光斑累积成一个平滑的、近似高斯形状的扩散函数——这就是图像复原里“大气湍流模糊”的真实来源。

这个物理过程严格建模需要 Kolmogorov 湍流统计和相位屏模拟,但图像复原实验通常不做那么重。业界通行的做法是引入等晕区近似:在等晕区内,成像系统被看成线性平移不变系统,湍流的影响完全由一个空间不变的点扩散函数 h(x,y) 描述,频域上则对应一个平滑低通形态的 OTF。这套近似让实验可以脱离光线追迹,直接在频域生成退化函数,也提供了评价不同滤波器效果的统一基准。

2.2 卷积变成乘法:频域为什么是复原算法的主战场

退化模型在空域写作 g = h ⊗ f + n,其中 h 是点扩散函数,n 是加性噪声,⊗ 是二维卷积。卷积定理说,两个函数卷积的傅里叶变换等于各自傅里叶变换的乘积,于是这个模型在频域变成:

G(u,v) = H(u,v) · F(u,v) + N(u,v)

这个等式的价值不只是让 FFT 把卷积复杂度从 O(N²) 降到 O(N log N),更关键的是它把两种性质完全不同的失真拆开了:模糊是乘性的,它把高频分量乘以一个小于 1 的衰减系数;噪声是加性的,它往每个频点都注入一个随机量。两个效应在空域里纠缠在一起,到频域里却能逐点审视——每一个频点的观测值,都是“信号乘以系统增益再加噪声”。如果系统增益很大,噪声被信号淹没,除法没有风险;如果系统增益趋近于零,那个频点几乎全是噪声,直接做除法就等于把噪声放大到失控。图像复原的所有滤波器,本质上都在回答同一个问题:这个频点的值,该信信号还是信噪声?

2.3 用代码生成湍流 OTF 并叠加噪声

import numpy as np def turbulence_otf(size, k=0.0025): """生成大气湍流的频域传递函数 OTF。 采用经典湍流经验模型 H = exp(-k * (u^2 + v^2)^(5/6)), u、v 用整数频率坐标,k 控制湍流强度,越大模糊越重。 """ u = np.fft.fftfreq(size) * size # 整数频率坐标,范围 -N/2 到 N/2-1 v = np.fft.fftfreq(size) * size U, V = np.meshgrid(u, v) H = np.exp(-k * np.power(U**2 + V**2, 5/6)) return H def simulate_degraded(image, H, noise_var=0.01): """频域退化:乘 OTF 再加高斯白噪声,返回退化图。""" F = np.fft.fft2(image) g = np.fft.ifft2(F * H).real noise = np.random.normal(0, np.sqrt(noise_var), g.shape) return np.clip(g + noise, 0, 255).astype(np.uint8)

代码里的两个参数直接决定了后面所有滤波器的命运。k 是湍流强度系数,k 越大 OTF 的高频衰减越快,图像越糊;noise_var 是高斯噪声的方差,它和 k 一起决定了“在哪个频点附近噪声开始压制信号”。有一个容易踩的坑:np.fft.fftfreq 返回的是归一化频率(范围 -0.5 到 0.5),必须乘回图像尺寸得到整数频率坐标,k 的取值范围才稳定在 0.0025 到 0.01 这个经典区间。否则同一个 k 在不同分辨率图上的模糊程度完全不同,后续做参数对比时结果没有可比性。

3. 逆滤波自爆点:除法在数学上无懈可击,数值上满盘皆输

3.1 逆滤波的推导与它的“理想解”

不考虑噪声时,退化模型退化为 G = H·F,于是最直接的复原就是做除法再反变换:F_hat = G/H。这就是逆滤波的原始形态,没有任何花哨。它确实是最小化形式误差的解,也是频域复原问题的理论起点。可一旦把观测模型改成带噪声的完整形式 G = H·F + N,代入还原出的结果是:

F_hat = G/H = F + N/H

结果里第一项 F 是完美的原始信号,问题全出在第二项 N/H。逆滤波不是“滤掉了噪声”,而是“把噪声也一起当信号除了一遍”。

3.2 高频噪声放大机制:H 趋近零时,噪声增益爆炸

OTF 的形态是低频接近 1、高频趋于 0。H 在低频处约等于 1,那里的 N/H ≈ N,噪声维持原样;但到了高频处,H 衰减到 0.01 甚至更小,N/H 相当于把噪声幅值放大了 1/H 倍。白噪声的功率谱是全频段平坦的,于是高频区布满被放大的噪声。当这个放大后的噪声功率超过图像本身的细节能量时,输出就成了一幅“干净的低频背景 + 满屏雪花高频”的混合体。

一个具体数字能让这个问题更直观:如果某个高频点 H=0.01,叠加的高斯噪声幅值只有 0.1,那么 F_hat 在该点的噪声误差是 0.1/0.01=10,比真实信号幅值还高出好几个数量级。逆滤波在每一个频点上都是“无偏的”,但正因为无偏,它让方差失控。这个频点上的“正确”还原,代价是灾难性的整体方差——统计学习里说的偏差与方差权衡,在这里以最极端的方式现形。

3.3 工程上的保护措施,以及保护之后还剩什么

实际的逆滤波实现几乎不会裸写除法,通常会加一层阈值保护:

def inverse_filter(g, H, thresh=0.02): """带阈值保护的逆滤波:H 幅度过小的频点直接不做除法。""" H_inv = np.zeros_like(H) mask = np.abs(H) > thresh H_inv[mask] = 1.0 / H[mask] F_hat = np.fft.fft2(g) * H_inv return np.fft.ifft2(F_hat).real

mask 的作用是把 H 接近零的频点跳过去,防止噪声放大失去控制。这一步的本质是“承认高于某个频率的细节我放弃恢复”,所以带保护的逆滤波退化成一个低通滤波器加少量高频补偿,恢复效果受限于阈值对应的截止频率。这也是逆滤波最尴尬的地方:阈值设得小,噪声爆炸;阈值设得大,细节全丢。它把问题从“怎么做除法”变成了“在哪里截止”,可截止本身又是一个新的超参,且它对噪声水平的适应性极差——噪声一变,最优截止点就变了,你得重新调。

4. 维纳滤波:在每个频点单独做最小化 MSE 的权衡

4.1 从最小化均方误差推导出维纳解

维纳滤波换了一个目标:不再要求“解出 F”,而是要求“估计值 F_hat 与真实 F 之间的期望均方误差最小”。设线性估计为 F_hat = W·G,W 是一个频域滤波器,目标函数是:

min E[ |F - W·G|² ]

把 G = H·F + N 代入,并对每个频点独立求解,在信号与噪声互不相关的假设下,得到最优滤波器的标准形式:

W(u,v) = H*(u,v) / ( |H(u,v)|² + S_n(u,v) / S_f(u,v) )

其中 S_n 是噪声功率谱,S_f 是信号功率谱,H* 是 H 的共轭。实际使用中很少能量测两条完整的功率谱曲线,于是做进一步假设:噪声为白噪声,S_n 为常数;信号功率谱在全频段变化不剧烈时,比值 S_n/S_f 可近似为一个常数 K。这就是维纳滤波最终代码形态——分母加一个常数的由来。

对比逆滤波的 1/H,维纳滤波的 W 中,当 |H|² 远大于 K 时,W ≈ 1/H,行为近似逆滤波;当 |H|² 远小于 K 时,W ≈ H*/K,增益随 H 一起趋于零而不是爆炸。它相当于在每个频点上自动判断:信号增益够大就大胆除,信号增益撑不住噪声就用乘法压住。

4.2 K 的语义:信噪比倒数的替身,也是滤波强度的旋钮

K 在公式里的位置,本质是 S_n/S_f 的近似值,也就是“噪声功率与信号功率之比”的替身。K=0 表示假定没有噪声,维纳解退化成逆滤波;K 越大,表示在更低频处就开始压制噪声,输出越平滑。实际操作中 K 很少用功率谱准确估计,而是直接作为旋钮:K 偏小时噪声残留可见,K 偏大时细节被磨平。判断 K 是否合适的代价函数,正是项目里自带的 PSNR 与 MSE 指标。

需要特别注意的是,K 不是越接近理论值越好。真实图像不是平稳随机过程,边缘和纹理区域局部信噪比差异很大,常数 K 只在全局平均意义上最优。你在天空区域觉得它过度平滑,可能在纹理区域它正好合适。这也是为什么维纳滤波在平坦区域表现好、在细节丰富区域会被诟病“抹掉纹理”——它不是把细节当噪声滤掉了,而是它只能为整幅图选择一个平均意义上的信噪比平衡点。

4.3 维纳滤波代码实现与 K 值扫描

def wiener_filter(g, H, K=0.01): """维纳滤波:W = H* / (|H|^2 + K),K 是噪声/信号功率比替身。""" H = np.asarray(H, dtype=np.complex128) Hsq = np.abs(H)**2 W = np.conj(H) / (Hsq + K) F_hat = np.fft.fft2(g) * W return np.fft.ifft2(F_hat).real def compute_psnr(original, restored): """PSNR 计算:基于 MSE 的峰值信噪比。""" mse = np.mean((original.astype(float) - restored.astype(float))**2) if mse == 0: return float('inf') return 10 * np.log10(255.0**2 / mse)

验证维纳滤波行为最直接的方法是做 K 值扫描:在 0.0001 到 0.1 之间取对数网格,对每个 K 算一次 PSNR,绘制“K 与 PSNR”的曲线。曲线会有一个明显的峰值:K 小于峰值位置时,画面仍有噪声残留,PSNR 爬升中;K 越过峰值后,画面逐渐平滑,细节损失让 MSE 反弹,PSNR 开始下降。这个峰的位置,恰好落在“该信噪声还是该信信号”的转折频率附近——峰值 K 越大,说明退化图的噪声功率相对于信号越高,需要更早压制高频。相比逆滤波每次换一张图都要重新找截止阈值,维纳滤波的 K 和噪声方差有更直接的对数线性关系,迁移到不同退化图时更有规律可循。

5. 评价指标避坑:PSNR 每年骗我一次的地方

5.1 现象:MSE 只差几个灰度级,PSNR 就掉了一档

MSE 与 PSNR 是同一个公式的两面:PSNR = 10·log10(255² / MSE)。255² 是 65025,这意味着 MSE 每放大 10 倍,PSNR 掉 10 dB。下面这张表展示了对 8 位灰度图熟悉的对应关系:

MSEPSNR (dB)视觉感受(典型)
1.048.1几乎无差别
20.735.0轻微细节损失
65.530.0明显可见退化
205.725.0显著模糊加噪声

这个数值越往上越让人产生“一切尽在掌握”的错觉。实际调参时经常出现的情况是:两个方案的 PSNR 只差 0.3 dB,对应 MSE 只差几个灰度级平方和,但打开图片一看,一个边缘清晰,一个已经出现振铃。原因在于 MSE 是逐像素平方误差的平均,它对误差的空间分布完全不敏感——误差均匀散布在整幅图时,MSE 不大;误差全部集中在边缘或振铃条纹上时,MSE 也不大。可人眼对“误差聚集在边缘”的感知远比对“误差均匀散布在平坦区”敏感得多。

注意:PSNR 作为滤波器效果判据时,务必同时观察边缘区域的局部截图,否则很容易把振铃当成微弱噪声、把细节磨平当成干净去噪。

5.2 现象:PSNR 上升了,双眼却觉得更糊了

这是维纳滤波调参时最容易翻车的场景:K 从小调大,噪声被压下去,PSNR 明明在涨,图却越来越糊。原因并不玄学——MSE 统计的是全局像素差,把高频噪声抹平确实能大幅降低 MSE,但抹平噪声的同时也在抹平真实细节。细节能量占总能量比例很小,细节被磨掉造成的 MSE 增量远小于噪声被压掉带来的 MSE 减量,于是 PSNR 一路走高,而视觉上的锐度已经崩了。

解决手段是分开评价:把图像分成平坦区和纹理区,分别计算局部 PSNR。平坦区 PSNR 提升代表去噪有效,纹理区 PSNR 下降说明细节正在被牺牲。只看全图均值,这两个方向的误差会互相掩盖。我一般还会顺手算一下滤波结果的拉普拉斯方差,边缘响应掉得太厉害时,PSNR 再高也要回头调 K。

5.3 现象:图四角出现明暗条纹,PSNR 毫无察觉

维纳滤波和逆滤波都是频域乘法,隐含了图像周期延拓的假设:FFT 把图像当成在边界处周期性重复,而真实图像左右边界不连续,这个跳变会在恢复结果里引入吉布斯振荡,最典型的呈现就是图像四边出现若干条平行亮暗条纹,业内叫振铃反射。这个效应的能量集中在边界附近,如果评价时用的是整幅图,边界振铃对 MSE 的贡献被大面积中间区域摊薄,PSNR 数据看着正常,裁剪出边界又惨不忍睹。

解决方法是三件套。第一,评价时裁剪掉四周各 1/16 的像素,边界振铃不计入指标;第二,滤波前对图像做镜像延拓再加窗,减弱周期跳变;第三,如果用的是标准库,可以先用边缘渐变平滑(类似 edgedetection 预处理里的 taper)让边界过渡自然。血泪教训是:不要拿整图 PSNR 作为提交标准,至少裁边后再算一次,两次数值差距过大就说明边界伪影在污染评价。

5.4 现象:湍流强度 k 估错了,调 K 怎么都救不回来

如果退化模拟时用的湍流强度和真实不匹配,比如真实 k=0.01,你却用 k=0.0025 的 OTF 去做维纳滤波,输出的图会有一种“永远差一口气”的模糊感。此时不管怎么调 K,画面要么带噪声要么过平滑,但就是回不到清晰。原因在于模型误差与噪声误差性质不同:维纳滤波的 K 项只能压制噪声,它修正不了 OTF 本身幅频响应的错误估计。H 估计偏大时,高频增益被过度补偿,噪声被放大;H 估计偏小时,高频增益补偿不足,细节恢复不出来。K 只是第二个旋钮,第一个旋钮 k 没对准,后面的操作全在错误的基础上打转。

排查方法是做 k 值扫描:固定噪声方差,让 k 在 0.001 到 0.02 之间变化,对每个 k 重算 OTF 再做维纳滤波,记录 PSNR 最大值与对应的 k。峰值位置的 k 就是当前噪声水平下最匹配的湍流强度估计。如果峰值出现在扫描区间边界,说明真实退化可能根本不属于大气湍流这个模型,再去调 K 就是缘木求鱼。

6. 设计取舍:K 明明可以测出来,为什么非要靠手调

维纳滤波理论给出的是完整功率谱之比 S_n/S_f,工程实现却收敛到一个常数 K,这不是偷懒,而是一个刻意为之的取舍。测噪声功率谱很容易——取一块纯背景区域估计方差即可——但测信号功率谱很难:图像不是平稳随机场,每一块区域的纹理密度不同,全图的 S_f 本身就是个分布而不是一条曲线。若真用逐频点的 S_n/S_f 做滤波器,得到的 W 会对噪声极度敏感,一旦估计有偏差,效果还不如常数 K 稳定。把比值压成一个旋钮,等于把“不确定性”集中交给使用者去权衡,代价是失去自适应性,收益是参数可解释、可复现、可迁移。

沿着这个思路再往前一步,就是约束最小二乘滤波。它的做法是把维纳滤波分母里的常数 K 换成拉普拉斯算子的能量约束,只需估计噪声方差,不需要信号功率谱先验,对模型误差的敏感度更低。理解维纳滤波的 K,其实就理解了这一整类“用正则项替换未知功率谱”的频域复原算法的共同骨架:先建立退化模型,再在某一个频点分析信号与噪声谁主导,最后用一个可调参数平衡偏差与方差。从那以后我每次做图像复原实验,都会先把湍流强度 k、噪声方差和 K 值写成一个参数表存下来,跑完立刻对比 PSNR 和边缘局部图,否则调参记录时间一长就是一本糊涂账。这套“先固定退化参数,再调滤波器旋钮,最后裁剪边界做评价”的流程,帮我挡掉了大半写代码时觉得“算法有问题”的假 Bug,希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

Linux上用MinGW-w64交叉编译VLC插件DLL实战指南

Linux上用MinGW-w64交叉编译VLC插件DLL实战指南

1. 这不是“换个编译器跑通就行”的事:VLC DLL 在 MinGWLinux 环境下的真实定位很多人看到“vlc dll 编译 MinGW on Linux”这个标题,第一反应是:“哦,就是用 Linux 上的 MinGW 工具链把 VLC 的某个动态库编译出来”。但实际动手前…

2026/10/19 17:43:52 阅读更多 →
STM32CubeMX配置HAL库串口通信:从基础到DMA空闲中断

STM32CubeMX配置HAL库串口通信:从基础到DMA空闲中断

简介:基于STM32F103C8T6与HAL库、STM32CubeMX的UART串口通信完整例程包,主要面向嵌入式初学者、单片机爱好者以及需要快速搭建串口收发功能的开发者。压缩包共146个文件,大小4.31MB,源码以c/h文件为主,同时包含ioc工程…

2026/10/19 17:43:52 阅读更多 →
Java+YOLOv5食品包装缺陷检测实战:从模型导出到Spring Boot API对接

Java+YOLOv5食品包装缺陷检测实战:从模型导出到Spring Boot API对接

JavaYOLOv5食品包装缺陷检测实战:从模型导出到Spring Boot API对接前几个月在做一个食品产线的质检项目,需求很朴素:检测包装袋的封口是否平整、有无漏气皱褶、印刷字符是否错位、包装表面有没有污渍。算法那边用YOLOv5训练了一版模型&#x…

2026/10/19 17:43:52 阅读更多 →

最新新闻

三维立体画生成器:从灰度深度图到视差编码的完整实现

三维立体画生成器:从灰度深度图到视差编码的完整实现

简介:这是一套面向图形处理爱好者与三维立体画创作者的三维立体画生成工具,适合希望快速上手立体图制作、又不想依赖昂贵商业软件的用户。软件在真实三维场景中以“照相”方式生成作品,内部采用双深度缓存技术,3D信息全面且左右对…

2026/10/19 18:26:20 阅读更多 →
10元ESP32-S3裸机跑YOLOv5s:边缘AI轻量化实战

10元ESP32-S3裸机跑YOLOv5s:边缘AI轻量化实战

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

2026/10/19 18:23:17 阅读更多 →
Git常用命令实战指南:从数据模型到分支合并与撤销恢复

Git常用命令实战指南:从数据模型到分支合并与撤销恢复

Git 这个东西,说难不难,说简单也真不简单。我见过不少人把add和commit背得滚瓜烂熟,可是一遇到分支合并、代码冲突、提交撤销就手足无措,最后只能靠复制粘贴网上的命令来救急,运气好没事,运气差直接把同事的…

2026/10/19 18:23:17 阅读更多 →
毕业论文智能导航:从选题到查重全流程的AI辅助指南

毕业论文智能导航:从选题到查重全流程的AI辅助指南

毕业论文这个东西,只有真正常年带学生、自己也经历过完整写作过程的人才会明白:绝大多数人最后卡住的地方,根本不是“文笔差”或者“肚子里没货”,而是整个写作过程缺乏一条清晰的路径。选题反复推翻、文献越搜越乱、框架改了又改…

2026/10/19 18:23:17 阅读更多 →
AI辅助毕业论文写作全指南:功能、实操与避坑技巧

AI辅助毕业论文写作全指南:功能、实操与避坑技巧

1. 毕业论文的痛,AI真的能解吗每年到了毕业季,我身边就会冒出一大批“深夜改稿人”。有的在图书馆对着空白文档发呆,有的在跟参考文献格式搏斗到凌晨两点,还有的因为查重报告里的红色标记焦虑到脱发。毕业论文这件事,说…

2026/10/19 18:23:17 阅读更多 →
Kafka Java客户端实战:原理、参数与排障全解析

Kafka Java客户端实战:原理、参数与排障全解析

Kafka这名字,在Java后端圈子里,基本属于“躲不开”的那一类技术。不管是搞微服务、大数据管道,还是简单的异步解耦,消息队列总得选一款,而Kafka往往是选项里最“硬核”的那个。很多人第一反应是“分布式、高吞吐、源码…

2026/10/19 18:22:16 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →