遥感影像预处理实战:归一化与异常值去除的完整流程
1. 影像预处理到底在解决什么问题遥感影像拿到手第一件事不是急着跑分类或者做时序分析而是先看看数据本身干不干净。我见过太多人直接把原始影像丢进模型里结果跑出来的结果惨不忍睹回头排查半天才发现是异常值在作祟。影像归一化和异常值去除这两个步骤说白了就是给数据“洗澡”和“理发”——把量纲统一了把毛刺磨平了后面的分析才有意义。归一化的核心目的是消除不同传感器、不同时相之间的量纲差异。比如Landsat 8的SR数据反射率范围是0到10000MODIS的反射率是0到32767哨兵2号的L2A数据又是0到10000但带有偏移量。你不做归一化把这些数据混在一起分析就好比拿厘米和英寸直接相加结果肯定是错的。异常值去除则是处理那些云边缘、阴影、传感器故障导致的极端像素值这些值如果不处理会严重拉偏统计结果。这套流程适合谁呢如果你在做土地利用分类、植被指数时序分析、水体提取、城市扩张监测这类工作影像预处理是绕不过去的基本功。新手可以把它当作入门必修课老手也可以看看有没有自己平时忽略的细节。我下面会从设计思路、核心原理、实操步骤到踩坑经验完整走一遍这个流程。2. 归一化的本质与实现路径拆解2.1 为什么不能跳过归一化直接分析很多人觉得归一化就是简单除个系数没什么技术含量。但实际项目中归一化做得好不好直接影响后续分析的精度。我举个实际例子假设你在做某区域的NDVI时序分析用了Landsat 8和Landsat 9两颗卫星的数据。这两颗卫星的OLI传感器虽然设计相似但辐射定标系数有细微差异。如果不做归一化同一块农田在Landsat 8上算出来的NDVI是0.75在Landsat 9上可能是0.73这个差异在时序曲线上就会表现为一个虚假的波动你可能误判为作物受到了胁迫。归一化的数学本质是把数据映射到一个标准区间通常是[0, 1]或者[-1, 1]。对于遥感反射率数据最常见的做法是除以缩放因子。Landsat Collection 2的SR数据缩放因子是0.0000275偏移量是-0.2哨兵2号L2A的缩放因子是0.0001。这些参数不是随便定的而是根据传感器的辐射分辨率计算出来的。注意不同数据集的缩放因子和偏移量完全不同用错一个参数整幅影像的反射率就全错了。建议在代码里把参数写成常量不要硬编码在计算式里。2.2 归一化的三种主流方案对比在实际操作中归一化有几种不同的实现路径各有适用场景。我整理了一个对比表格方便你根据项目需求选择。方案计算公式适用场景优点缺点缩放因子法(DN × scale) offset标准SR产品物理意义明确可逆需要知道准确的缩放参数最大最小值法(DN - min) / (max - min)单幅影像快速可视化简单直观受异常值影响大不可跨影像比较均值标准差法(DN - mean) / std机器学习输入分布标准化利于模型收敛破坏物理量纲不适合定量遥感缩放因子法是我最推荐的方式因为它保留了数据的物理意义。你算出来的反射率就是真实反射率可以直接和地面实测数据对比。最大最小值法适合快速出图看看效果但如果你要做多时相分析每幅影像的min和max都不一样归一化后的值就没法比较了。均值标准差法在深度学习领域很常见但它把数据变成了标准正态分布你就没法再说“这块地的反射率是0.3”了。2.3 在GEE中实现归一化的关键细节在Google Earth Engine里做归一化表面上看就是一行map函数的事但有几个细节特别容易翻车。第一个是波段名称的匹配问题。Landsat 8的SR产品波段名是SR_B1到SR_B7Landsat 5是SR_B1到SR_B7但对应的是TM传感器波段波长范围不一样。你如果直接按波段名批量处理可能会把不同物理意义的波段混在一起。第二个细节是偏移量的处理。Landsat Collection 2引入了一个-0.2的偏移量目的是让反射率可以为负值从而更准确地表示暗目标比如水体的反射率。如果你忘了加这个偏移量水体的反射率会被截断在0附近导致水体指数计算出现偏差。// Landsat 8 Collection 2 SR归一化示例 var normalizeLandsat8 function(image) { var opticalBands image.select(SR_B.).multiply(0.0000275).add(-0.2); var thermalBands image.select(ST_B.*).multiply(0.00341802).add(149.0); return image.addBands(opticalBands, null, true) .addBands(thermalBands, null, true); };这段代码里multiply(0.0000275).add(-0.2)就是标准的缩放因子加偏移量操作。热红外波段用的是另一套参数因为热红外的物理量是亮温单位是开尔文缩放因子和偏移量完全不同。我见过有人把光学波段的参数套到热红外上结果亮温算出来是负几百开尔文那就闹笑话了。3. 异常值去除的底层逻辑与实操方法3.1 异常值从哪来长什么样异常值的来源主要有四类云和云阴影、传感器故障、地形阴影、以及数据处理过程中的错误。云和云阴影是最常见的一朵薄云就能让反射率飙升到0.8以上而云阴影又会让反射率骤降到接近0。传感器故障比较少见但一旦出现就是整条扫描线的数据异常表现为规则的条纹。地形阴影在山区很普遍阳坡和阴坡的反射率差异可能达到3倍以上。这些异常值在直方图上的表现很典型正常反射率分布是一个近似正态的钟形曲线异常值会在两端形成孤立的小峰。如果你不做处理后续的均值、标准差、回归系数都会被这些极端值拉偏。我做过一个测试在一幅有5%云覆盖的影像上不剔除异常值算出来的NDVI均值是0.42剔除后是0.38差了将近10%。3.2 基于位运算的云掩膜方案在GEE里处理Landsat数据最标准的做法是用QA_PIXEL波段做位运算。QA_PIXEL是一个16位的整数每一位代表一种状态。比如第3位是云第4位是云阴影第5位是雪。你需要用位运算提取这些标志位然后生成掩膜。// Landsat 8 QA_PIXEL云掩膜 var maskLandsat8 function(image) { var qa image.select(QA_PIXEL); var cloudBit 1 3; var shadowBit 1 4; var snowBit 1 5; var mask qa.bitwiseAnd(cloudBit).eq(0) .and(qa.bitwiseAnd(shadowBit).eq(0)) .and(qa.bitwiseAnd(snowBit).eq(0)); return image.updateMask(mask); };这段代码的逻辑是如果某一位是1说明该像素被标记为对应的状态我们就把它掩掉。1 3表示把1左移3位得到二进制1000也就是十进制的8。bitwiseAnd做按位与运算如果结果等于0说明这一位是0像素是干净的。提示不同传感器的QA波段位定义不同。Landsat 8的云位是第3位Landsat 5的云位是第4位哨兵2号的QA60波段又是另一套逻辑。用之前一定要查清楚文档不要凭记忆写。3.3 基于统计阈值的异常值剔除QA波段不是万能的有些异常值它标记不出来比如薄云边缘的过渡像素、传感器噪声、以及某些地形阴影。这时候就需要用统计方法做二次过滤。最常用的是百分位截断法计算整个影像或者整个时间序列的某个百分位比如2%和98%把超出这个范围的像素值截断或者掩掉。// 基于百分位数的异常值剔除 var removeOutliers function(image) { var ndvi image.select(NDVI); var percentiles ndvi.reduceRegion({ reducer: ee.Reducer.percentile([2, 98]), geometry: image.geometry(), scale: 30, maxPixels: 1e13 }); var lower ee.Number(percentiles.get(NDVI_p2)); var upper ee.Number(percentiles.get(NDVI_p98)); var mask ndvi.gte(lower).and(ndvi.lte(upper)); return image.updateMask(mask); };这个方法的关键在于百分位的选择。2%和98%是比较保守的适合大多数场景。如果你做的是水体提取可能需要用1%和99%因为水体的NDVI分布很集中稍微放宽一点就会把陆地混进来。如果你做的是稀疏植被监测可能需要用5%和95%因为稀疏植被的NDVI本身就很低太严格的截断会把有效信号也去掉。3.4 时序维度的异常值检测单幅影像的异常值好处理时序上的异常值更隐蔽。比如某一年因为云覆盖严重整幅影像的NDVI都偏低你在做年际比较时就会误判为植被退化。这时候需要用时序滤波的方法比如Savitzky-Golay滤波或者谐波分析来识别和修复异常。在GEE里做时序异常检测我常用的思路是先计算每个像素的时序均值和标准差然后把偏离均值超过2倍标准差的时相标记为异常。这个方法假设NDVI的时序变化是平稳的对于季节性明显的区域需要先做去季节化处理。// 时序异常检测 var detectTemporalOutliers function(collection) { var mean collection.mean(); var std collection.reduce(ee.Reducer.stdDev()); var threshold 2; var lower mean.subtract(std.multiply(threshold)); var upper mean.add(std.multiply(threshold)); return collection.map(function(image) { var mask image.gte(lower).and(image.lte(upper)); return image.updateMask(mask); }); };这个方法的局限在于它假设异常是双向的既可能偏高也可能偏低。但实际中云污染通常导致反射率偏高云阴影导致偏低两者的物理机制不同可能需要分别处理。我一般会先做云掩膜再做时序异常检测这样能减少误判。4. 完整实操流程与参数调优记录4.1 数据准备与区域筛选假设我要分析某农业区2015到2023年的NDVI时序变化。第一步是筛选数据。Landsat 8从2013年开始有数据Landsat 9从2021年开始所以2015到2023年主要用Landsat 82021年之后可以融合Landsat 9。区域筛选要注意去掉影像边缘的无效区域以及云覆盖超过80%的影像。var region ee.Geometry.Rectangle([116.0, 36.0, 117.0, 37.0]); var landsat8 ee.ImageCollection(LANDSAT/LC08/C02/T1_L2) .filterBounds(region) .filterDate(2015-01-01, 2023-12-31) .filter(ee.Filter.lt(CLOUD_COVER, 80));CLOUD_COVER是元数据里的云覆盖百分比但这个值是基于整幅影像的你的研究区可能只占影像的一小部分。所以即使CLOUD_COVER是80%你的研究区可能完全无云。我一般会把这个阈值设得宽松一些比如80%到90%然后用QA波段做精细掩膜。4.2 归一化与云掩膜的串联处理数据筛选完之后把归一化和云掩膜串成一个map函数。顺序很重要先归一化再云掩膜。因为QA波段是基于原始DN值的如果你先做了归一化QA波段的值也被缩放了位运算就会出错。var preprocess function(image) { // 第一步归一化 var optical image.select(SR_B.).multiply(0.0000275).add(-0.2); var thermal image.select(ST_B.*).multiply(0.00341802).add(149.0); var normalized image.addBands(optical, null, true) .addBands(thermal, null, true); // 第二步云掩膜 var qa normalized.select(QA_PIXEL); var mask qa.bitwiseAnd(1 3).eq(0) .and(qa.bitwiseAnd(1 4).eq(0)); // 第三步计算NDVI var ndvi normalized.normalizedDifference([SR_B5, SR_B4]) .rename(NDVI); return normalized.addBands(ndvi).updateMask(mask); }; var processed landsat8.map(preprocess);这里有个细节addBands的第三个参数设为true表示替换原有的波段。如果不设这个参数归一化后的波段会以新名字追加原来的DN值波段还在后面容易搞混。我建议养成替换的习惯保持波段列表干净。4.3 异常值去除的参数调优云掩膜之后还有大约5%到10%的异常像素残留。这时候用百分位截断做二次过滤。百分位的选择需要根据你的研究区调整。我一般会先跑一遍不做截断的统计看看NDVI的分布范围再决定截断阈值。// 先看看NDVI的分布 var ndviStats processed.select(NDVI).reduceRegion({ reducer: ee.Reducer.percentile([1, 5, 95, 99]), geometry: region, scale: 30, maxPixels: 1e13 }); print(NDVI percentiles:, ndviStats);如果1%和99%的值在-0.2到0.9之间说明数据比较干净用2%和98%截断就够了。如果1%的值低于-0.5说明有云阴影残留需要更严格的截断。我遇到过一种情况研究区有大量水体水体的NDVI是负值如果用2%截断会把浅水区的有效信号也去掉。这时候需要先做水体掩膜再对陆地部分做异常值剔除。4.4 时序合成与结果导出预处理完之后通常需要合成到月尺度或者年尺度。月合成用中位数比均值更稳健因为中位数对残余异常值不敏感。合成的时候要注意如果某个月的有效像素太少比如少于30%这个月的合成结果就不可靠应该标记为无效。var monthlyComposite processed .filterDate(2020-01-01, 2020-12-31) .map(function(image) { return image.set(month, image.date().get(month)); }) .filter(ee.Filter.eq(month, 6)) .median();导出的时候如果研究区很大直接导出可能会超时。我一般会先导出到Drive再用本地脚本做后续分析。导出分辨率设为30米和原始Landsat一致。如果要做区域统计可以先用reduceRegions在GEE里算好只导出统计结果数据量小很多。5. 常见问题排查与避坑经验5.1 归一化后反射率出现负值正常吗正常。Landsat Collection 2的偏移量-0.2就是为了让暗目标的反射率可以为负。水体的反射率在近红外波段接近0加上偏移量后可能是-0.01到-0.02。这不是错误而是传感器噪声和大气校正残差的表现。如果你做的是植被分析这些负值会被NDVI计算自动处理掉如果你做的是水体分析需要把负值截断到0。5.2 云掩膜后影像出现大量空洞怎么办这是云掩膜的常见副作用。如果研究区云覆盖频繁单幅影像掩膜后可能只剩30%的有效像素。解决方案有两个一是用多时相合成把一个月内所有影像的中位数作为该月的代表这样即使单幅有云合成后也能填补空洞二是用时序插值比如用前后两个月的均值来填补缺失月份。我一般优先用多时相合成因为插值会引入虚假的平滑信号。5.3 百分位截断把有效信号去掉了怎么排查先检查百分位的计算范围。如果你用的是整幅影像的百分位而研究区只占影像的一小部分那百分位可能被影像其他区域的特征主导。比如影像大部分是水体NDVI集中在-0.1到0.1你的农田NDVI是0.6用整幅影像的98%百分位可能是0.2直接把农田截掉了。解决方法是用reduceRegion限定在研究区范围内计算百分位。5.4 时序异常检测误判了真实变化怎么办时序异常检测的假设是“正常变化是平稳的”但真实的植被变化可能很剧烈比如森林砍伐、火灾、洪水。这些真实变化会被误判为异常。解决方法是在时序检测之前先用已知的干扰事件比如火灾记录做掩膜或者用更宽松的阈值比如3倍标准差。我一般会先用2倍标准差跑一遍看看被标记的像素是不是集中在已知干扰区域如果是就调整阈值。5.5 不同传感器数据融合时的归一化陷阱Landsat 8和Sentinel-2的波段设置不同Landsat 8没有红边波段Sentinel-2有。如果你要做两者的NDVI时序融合需要确保使用的波段是对应的。Landsat 8的NIR是B5Red是B4Sentinel-2的NIR是B8Red是B4。波段名一样但物理意义不同这是最容易翻车的地方。我建议在融合之前先把两个数据集重命名成统一的波段名比如都叫‘NIR’和‘Red’然后再做计算。问题现象可能原因排查方法解决方案反射率全为负偏移量用错检查缩放参数确认使用对应传感器的参数掩膜后无有效像素云覆盖过高查看QA波段统计放宽云覆盖阈值或改用多时相合成NDVI异常偏高云边缘残留检查QA掩膜位增加云置信度阈值或做百分位截断时序曲线断裂异常值剔除过度查看被掩膜像素比例放宽百分位阈值或分区域处理不同影像反射率不一致归一化参数不统一对比同一地物反射率统一使用缩放因子法6. 我个人的实操体会与进阶建议这套流程我用了好几年踩过的坑基本都写在上面了。最后分享几个文档里不会写但很实用的经验。第一个是关于计算效率的GEE的reduceRegion操作很耗时如果你要对几百幅影像做百分位统计最好先合并成一个ImageCollection用reduce而不是逐幅map。我试过逐幅计算100幅影像跑了20分钟改成集合操作后只要2分钟。第二个经验是关于掩膜顺序的。很多人习惯先算NDVI再掩膜但NDVI计算涉及两个波段如果其中一个波段有异常值NDVI也会异常。正确的顺序是先对每个波段做异常值检测生成一个综合掩膜再应用到NDVI上。这样能避免异常值通过波段运算传播。第三个经验是关于结果验证的。预处理完之后一定要抽样检查。我一般会随机选20个点把预处理前后的反射率值打印出来对比。如果某个点的反射率从0.3变成了0.8那肯定是哪里出错了。这个步骤花不了几分钟但能帮你发现很多隐蔽的问题。如果你要做深度学习归一化后的数据还需要做进一步的标准化。我通常会把反射率截断到[0, 1]区间然后减去0.5再除以0.5映射到[-1, 1]。这个范围对大多数神经网络更友好梯度不会消失也不会爆炸。但记住这个操作是不可逆的如果你后面要做定量反演需要保留原始反射率数据。最后说一个关于数据版本的问题。GEE上的数据集会更新Collection 1和Collection 2的预处理参数完全不同。Collection 1的Landsat 8 SR缩放因子是0.0001没有偏移量Collection 2是0.0000275加-0.2。如果你在网上抄了一段代码一定要确认它对应的是哪个版本。我见过有人混用两个版本的参数结果反射率算出来差了将近一倍。

相关新闻

八种顺序读写函数

八种顺序读写函数

目录 摘要: 一:文件操作的流程 1:fopen 2:fclose 3:文件的路径 4:顺序和随机的区别 5:默认流 二:顺序读写函数 1:fputc 2:fgetc 3:fpu…

2026/10/15 5:34:21 阅读更多 →
智能AI雷达名片系统设计拆解:招商获客与多租户SAAS实战

智能AI雷达名片系统设计拆解:招商获客与多租户SAAS实战

做了这么多年招商获客相关的工作,我最强烈的感受是:企业根本不缺产品、不缺优惠政策,缺的是第一时间知道“谁在看我们”。传统招商就像在广场上撒传单,传单发完了,谁捡起来看了、看的那个人是什么来头,一概…

2026/10/15 5:34:21 阅读更多 →
Rust RFC 1649 深度解读:原子类型的内存布局保证与 get_mut / into_inner 直接访问方法

Rust RFC 1649 深度解读:原子类型的内存布局保证与 get_mut / into_inner 直接访问方法

文档 【免费下载链接】rfcs RFCs for changes to Rust 项目地址: https://gitcode.com/gh_mirrors/rf/rfcs 点击查看 免费下载 导读 本文围绕 Rust 官方 RFC 仓库(rust-lang/rfcs)中的 RFC 1649:atomic_access 展开,…

2026/10/15 5:34:21 阅读更多 →

最新新闻

SpringBoot+Vue轻量级博客系统设计与实现

SpringBoot+Vue轻量级博客系统设计与实现

1. 项目概述:SpringBootVue轻量级博客系统设计去年帮学弟评审毕业设计时,发现市面上很多博客系统要么功能冗余,要么扩展性差。于是我们决定用SpringBootVue搭建一个轻量级但五脏俱全的在线创作社区。这个系统最核心的特点是采用前后端分离架构…

2026/10/15 6:55:51 阅读更多 →
正念与心流:10分钟呼吸练习,让专注成为生命底色

正念与心流:10分钟呼吸练习,让专注成为生命底色

1. 先说清楚:我们到底在谈什么你有没有过这样的时刻:明明手头有一件重要的事要做,却忍不住五分钟刷一次手机;开会时脑子飘到晚上吃什么;想读几页书,眼睛盯着一行字,心里却已经把明天的待办事项过…

2026/10/15 6:55:51 阅读更多 →
Oracle 数据实时入仓 Doris 和 StarRocks 怎么做?CDC、全量迁移与 5 种方案对比

Oracle 数据实时入仓 Doris 和 StarRocks 怎么做?CDC、全量迁移与 5 种方案对比

在很多企业系统中,Oracle 负责在线事务处理,Doris 或 StarRocks 负责报表、数据分析和实时数据服务。当订单、用户、支付和日志数据持续增长时,直接在 Oracle 上运行复杂统计 SQL,可能影响线上业务。因此,很多团队会建…

2026/10/15 6:55:51 阅读更多 →
SpringBoot+Vue+MyBatis构建企业级电商平台实战

SpringBoot+Vue+MyBatis构建企业级电商平台实战

1. 项目概述"企业级网购平台管理系统"是一个基于SpringBootVueMyBatis技术栈的完整电商解决方案。这套源码包含了电商平台的核心功能模块,采用前后端分离架构设计,数据库使用MySQL,适合快速构建中小型B2C或B2B电商平台。我在实际电…

2026/10/15 6:55:51 阅读更多 →
聚簇索引vs非聚簇索引:从底层原理到实战避坑全解析

聚簇索引vs非聚簇索引:从底层原理到实战避坑全解析

做后端开发这几年,索引相关的坑我踩过不少。面试被问过无数次“聚簇索引和非聚簇索引区别”,带新人的时候也发现,大部分同学对这两个词的理解停留在“一个有序一个无序”或者“聚簇索引就是主键”这种模糊层面。一旦落到实际业务,…

2026/10/15 6:55:51 阅读更多 →
盲盒商城软件开发案例:连接概率说明、微信支付、在线开赏与积分兑换

盲盒商城软件开发案例:连接概率说明、微信支付、在线开赏与积分兑换

盲盒商城的购买过程与普通商品商城有所不同。用户在付款前,需要了解盲盒价格、可抽取内容和相关规则;完成支付后,再进入开赏环节。商品展示、概率说明、支付结果和积分记录之间,需要形成清晰的操作顺序。 某公司的这套盲盒商城软件…

2026/10/15 6:54:51 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →