尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

StarNet去星网络:深空摄影后期中的星点移除与背景重构

发布时间:2026/9/29 18:18:02

资讯中心
01
ARTICLE

StarNet去星网络:深空摄影后期中的星点移除与背景重构

StarNet去星网络:深空摄影后期中的星点移除与背景重构
1. 为什么要把星空里的星星抹掉先说一个反直觉的结论玩天文摄影和深空后期的人恐怕都经历过这样的崩溃瞬间辛辛苦苦拍了一晚上叠加出来一看星点又圆又细噪点压得干干净净但背景里那团若有若无的云气偏偏被密密麻麻的星点遮了个严实。银心方向尤其明显——星星多得像撒了一把芝麻把原本应该清晰呈现的暗星云、电离氢区全都盖住了。传统的处理思路是避让缩星、羽化、用蒙版一点点擦或者干脆放弃那些靠近亮星的细节。直到StarNet出现这思路被彻底掀翻了——它的做法是反着来的把星星整体从画面里剥离出去剩下的就是纯粹的、无星的背景影像。这个结果就像把一张照片分成了两张底片一张只保留恒星和它们的衍射芒刺另一张是干干净净的星云气体和尘埃结构。大多数人会以为StarNet只是个更高级的缩星插件其实完全不是。它是基于神经网络训练的专用模型架构上走的是卷积神经网络的分支做的事情本质上是语义分割——把图像里的每一个像素判断成属于恒星还是不属于恒星然后只保留后者。训练语料是天量的人工合成星场与真实深空影像配对所以它对不同焦段、不同采样率、不同星点形态的泛化能力相当强。这篇文章我会把StarNet从原理讲到实操覆盖它的安装、参数调校、脚本化批处理以及最容易让人踩坑的边界条件和去星痕迹问题。适合三类人看被银心高密度星场折磨的深空摄影师、做星系与暗星云研究的业余天文数据处理者、以及那些后期流程卡在星点与云气分离这一步很久的HDR玩家。2. StarNet的物理逻辑恒星是一层可以单独拆掉的前景2.1 一张深空照片到底由哪几层信息组成想用好StarNet先得理解一张天文照片在数学上不是一张图而是好几层信息的叠加。第一层是天空背景包括天光梯度、月光散射、大气辉光还有光污染造成的雾第二层是延伸天体也就是星云、星系、超新星遗迹这些空间上连续分布、亮度渐变的对象第三层是恒星和它们的光学伪影包括星点本身、衍射芒刺、内反射鬼影。最后才是传感器噪声和暗电流留下的底噪。传统后期把这三层混在一起处理所以当你试图用曲线拉伸暗部细节时亮星周围的光晕会跟着一起被拉出来星云边缘和背景噪声也会纠缠不清。StarNet的价值在于它把第三层单独剥离出来让你只对第二层做拉伸、反卷积、HDR合成做完再决定要不要把星星贴回去。2.2 神经网络如何判断哪里算一颗恒星StarNet的具体实现是把输入图像切成若干块逐块送入训练好的卷积网络。网络内部通过多级特征提取逐层从像素边缘、局部亮度峰值、对称性这些维度去判断这一簇像素是不是恒星的PSF点扩散函数。有个细节值得注意StarNet对检测到的恒星做的不是抠图而是拟合和重构。它会用恒星周围一定半径内的背景梯度去估算该恒星原本应该覆盖的区域里云气大概长什么样然后用内插值把前景抹掉。这也是为什么StarNet处理完的图星点所在位置不会出现黑窟窿或白斑——它是在理解背景结构的基础上做填充不是简单地PS里那种内容识别移除。实测下来的规律是焦内锐利的星点识别率最高轻度拉线的星点也能识别但严重拖线或大出瞳光斑比如星芒特别夸张的反射镜容易残留。这个后面会细说。2.3 三个反直觉的结论去星不是少一根钉子而是重构背景我最初用StarNet时有个错误预期以为它只是把星星变成更小、更淡的圆点类似强力缩星。但实际用下来我发现有三个结论和直觉完全相反第一去星之后的图像不要直接用来当作最终出图它是中间层资产。你需要在无星图层上完成所有需要干净背景才能做的操作最后再用线性减淡混合或叠加方式把星星还原回来。第二去星后再缩星效果比直接对原图缩星好一个档次。因为StarNet剥离掉了恒星后原本被耀眼光芒掩盖的暗云气细节全部露了出来你再对这个结果做HDR或色调映射层次感是无可星版本完全比不了的。第三StarNet处理过的无星图拿来跑反卷积是外挂级别的辅助。天文圈里大家普遍怕反卷积把星点处理成牛顿环或者黑边但如果先去掉星点反卷积算的就只有平滑的延伸结构稳定性大大增加。3. 环境准备从安装到跑通一张图的完整链路3.1 版本选择和依赖清单StarNet目前主流有两种分发形式一是集成在PixInsight里的StarNet模块由akhil等人维护二是独立的命令行Python包。前者对普通玩家最友好后者适合做自动化批处理。我这里主要讲Python独立版的部署路径因为跨平台更灵活也方便后续写脚本批量处理。需要的依赖如下Python 3.9以上实测3.10和3.11都没问题TensorFlow 2.xCPU版即可一张图耗时大概30秒到2分钟取决于分辨率Astropy和NumPy用于FITS文件读写PIL或OpenCV用于处理JPG/TIFF格式输入安装命令很简单pip install starnet tensorflow astropy numpy pillow需要注意一点如果你在纯净的Python环境里装TensorFlow尽量用虚拟环境避免和系统其他版本的NumPy起冲突。我见过不少朋友卡在这一步报错信息全是core dumped最后发现就是NumPy版本被TensorFlow自动降级导致的。3.2 最容易翻车的预处理细节归一化和数据类型StarNet模型训练时的输入是归一化到0-1的浮点数据。如果你直接扔一张16位整数FITS进去出来的结果往往惨不忍睹——不是完全没反应就是背景被压成斑马纹。正确做法是先把数据转为32位浮点然后做线性归一化。这里有个常见的误区有些教程建议直接除以最大值但深空图像有少量非常亮的恒星或者热像素最大值会被拉得畸形导致绝大多数像素归一化后集中在接近0的区间模型根本分辨不出恒星和背景。我实测下来稳定的预处理是使用百分位截断from astropy.io import fits import numpy as np data fits.getdata(input.fits, ext0) data np.float32(data) # 裁掉最高0.1%的极端像素 p99_9 np.percentile(data, 99.9) data_clipped np.clip(data, 0, p99_9) # 线性归一化到0-1 data_norm (data_clipped - np.min(data_clipped)) / (np.max(data_clipped) - np.min(data_clipped))这步完成后再送进StarNet成功率会高很多。如果是彩色JPG同理先转成三通道浮点0-1矩阵但要注意彩色数据建议拆成单通道分别去星再合并原因后面讲。3.3 跑通第一张图CPU推理和GPU推理的真实耗时差异不写代码只跑一次推理的话StarNet官方提供starnet命令行入口用法非常直观starnet --input input.fits --output output_nostar.fits它会默认使用GPU如果有没有GPU则自动回退到CPU。我自己三台不同设备的实测数据供参考设备输入分辨率推理耗时峰值内存低功耗移动U4核2048x2048约3分10秒2.1GB中端桌面U8核2048x2048约1分05秒2.8GB中端独显GPU2048x2048约12秒3.2GB所以如果你要批量处理上百张图GPU几乎是必需品偶尔处理一两张CPU完全等得起。4. 两种去星路线之争先拆后练 vs 先练后拆谁更适合做最终出图4.1 路线A无星图层做全部拉伸最后再把星星贴回去这是StarNet最经典、也是最推荐新手的应用方式流程是对线性数据先做十分轻微的白平衡和背景提取用StarNet生成无星版本对无星版本做强力拉伸、HDR多重曲线、反卷积、降噪怎么处理都不怕扰动星点对原图单独做缩星可用MorphologicalTransformation等工具把星点收细、保形在PS或PixInsight里用Lighten混合模式把缩星后的原图叠回无星图层。这条路线最大的好处是把复杂问题拆成了两个互相独立的子问题。星点处理管星点云气处理管云气互不干扰。调试成本低且出图干净度显著提升。4.2 路线B直接去星出片保留纯净背景作为风格化选择也有摄影师喜欢直接输出无星版本作为最终作品尤其是暗星云和IFN银河系内尘埃云题材。因为这些目标本身亮度极低、结构细腻一颗3等亮星都可能遮挡数百像素范围内的细节。强行保留星点观众注意力会被星星勾走弱化了主体。这条路线我觉得只有一个前提主体必须是弥漫性结构。比如马头星云周围的暗带、巴纳德环、波江座尘埃环这一类。如果主体本身就是疏散星团或者包含密集亮星的球状星团去星就失去了意义。4.3 延展没有月亮窗口期也能出好片还有一个配套技巧值得专门说说——用StarNet处理非理想天况的数据。有一次我急着出片满月在头顶曝光才累计了90分钟背景梯度巨大星点周围全是散射光环。在无星网出现之前这种素材基本被判死刑。但我去星之后发现因为去星过程本身把星点周围的光环区域重新插值成了背景模型等于把月光散射的影响也一并抹掉了大半。后续再对无星图层做背景提取梯度修正比平时容易得多。当然这不是说StarNet能抵御光污染它不能。但它可以做选择性忽略把光害对星点的染色效应从模型中剔除有利于后期修复。5. StarNet在实际场景下的边界条件什么数据能用什么数据不能用5.1 严重拉线星场一颗颗椭圆斑模型会当成什么StarNet训练的样本大量来自正常导星的数据星点接近圆形高斯分布。当你给它一张拉线严重的图像比如盲跟或者导星中途失控它会陷入两难拉长的轨迹既像恒星又像细小星云纤维。实测结论是拉线长度小于2倍星点直径时StarNet基本能正确去除残留的只是拉线两端略微暗淡的痕迹。但如果拉线超过5倍星点直径就会大量残留而且残留物会呈现出中间清楚、两边切除的诡异状态——看起来像一排断断续续的短条比原图还难看。这种数据的处理建议是先用反卷积或星点对齐把星点尽量归一化再去跑StarNet。不要指望模型能处理严重跟踪失败的数据。5.2 双星和饱和核心为什么亮星中心会留下黑圈遇到过这个问题的人不少图像里最亮的两三颗星去星后中心留下一个浅浅的暗圈像陨石坑。原因其实很简单——模型对饱和恒星的内部结构缺乏先验它在估算背景时把饱和核心周围的光晕和衍射环推断成了云气的一部分于是补上了一个中心偏暗的圆形区域。解决办法有两个第一对亮星周围做局部蒙版保护不送进模型第二先用HDR合成或缩星把饱和核心压回线性范围再送StarNet。我推荐后者因为饱和核心区域往往和星点本身是重叠的蒙版边界容易被看出过渡痕迹。先缩星再把保守的星点轮廓交给模型是最稳的策略。5.3 窄带Ha、OIII、SII数据通道分离处理比RGB数据更稳定窄带数据天然有一个优势恒星在Ha和SII通道里往往偏暗在OIII通道里偏亮但亮度分布和宽带RGB有差别。StarNet在宽带数据上表现最好但在窄带上也不差不过有一点必须强调一定要对单通道单独做归一化和去星而不是把三通道合成后才能送进去。原因在于StarNet是基于亮度形态做判断RGB合并后的彩色图中恒星表现为白色或偏色光点模型还能识别但窄带合成后恒星的色度信息反而会干扰识别——同一颗恒星在Ha通道里很弱在OIII通道里很亮合成后就变成一颗中心绿边红的怪星模型的置信度会下降。实操经验是把Ha、OIII、SIII分别存成单通道FITS各跑一次去星再下载到RGB通道。这样比一次性处理合成RGB图稳定得多。5.4 对去星痕迹我有话说有些残留不是模型的错做天文后期的人大概都知道StarNet去星后最容易被人发现的问题就是边缘发灰和背景起雾。我排查过好几次最后发现大部分情况不是模型的问题而是数据的前期预处理没做到位——尤其是去偏置和去暗场不彻底留下的固定模式噪声FPN在去星后会被当成云气结构完整保留下来。这些噪声长得很像暗云气模型没办法区分自然就留在原地了。加上去星后背景对比度比原来高那些原本被星点光芒掩盖的弱噪声就显现了出来。所以去星之前必须严格校准偏置场不能用master bias替代、暗场温度和曝光要匹配、平场要打到主镜的2/3口径以下关闭平场滤波片。这些跟StarNet本身无关但它决定去星结果的下限。6. 进阶玩法用Python脚本把去星变成自动化流水线6.1 单脚本串起归一化 → 去星 → 反归一化 → 存档如果只是偶尔处理几张手动跑命令就够了。但真正有实际意义的应用场景往往是一批数据一起处理比如一个夜晚拍摄了10组不同的目标每组6小时曝光叠加或者是一个巡天项目的几百张切块图像。这时候手点鼠标会点到怀疑人生我写了一个小脚本整个流程串起来挺稳的这里贴出来供参考import os import numpy as np from astropy.io import fits from starnet import StarNet def remove_stars(input_path, output_path, pclip99.9): hdul fits.open(input_path) data hdul[0].data.astype(np.float32) header hdul[0].header hdul.close() # 归一化 pmin np.percentile(data, 0.1) pmax np.percentile(data, pclip) data_norm np.clip((data - pmin) / (pmax - pmin), 0.0, 1.0) # 推理 model StarNet() result_norm model.remove_stars(data_norm) # 反归一化保留原始数据范围 result result_norm * (pmax - pmin) pmin fits.writeto(output_path, result, headerheader, overwriteTrue) # 批量处理目录下所有 _master.fits 文件 folder /data/masters/ for fname in os.listdir(folder): if fname.endswith(_master.fits): in_path os.path.join(folder, fname) out_path os.path.join(folder, fname.replace(_master.fits, _nostar.fits)) remove_stars(in_path, out_path) print(fdone: {fname})这个脚本里我特意用百分位而不是固定阈值做归一化就是为了适应不同目标之间的亮度分布差异。实际跑下来银心、仙女座星系、猎户座大星云的master都能一次搞定不用为每个目标调参数。6.2 无月夜自动规划多目标多滤镜的批处理模板更深一层你可以把StarNet纳入到整个后期流水线里先用一个调度脚本检查数据文件夹里哪些master已完成、哪些还没生成无星版本然后自动调用去星脚本最后把结果归档到指定目录。这个听起来很工程化但对经常处理大量数据的玩家来说省下的时间非常可观。我自己的习惯是所有master一叠完立刻生成去星版本存进nostar/子目录后续无论是做缩星合成、反卷积还是HDR直接拿现成文件用省去每次重复加载模型的开销。6.3 提升精度的隐藏技巧对提升窗口做分块重叠推理StarNet模型在推理时会采用固定大小的感受野等于是用滑动窗口去扫描整张图。如果你直接把整张大图一次性送进去边缘区域的感受野不够靠近边界的恒星识别率明显下降。实测下来边缘区域大概5%的恒星会漏掉。解决办法是重叠分块推理把大图切成4块或9块每块之间保留10%的重叠对每块单独跑再去掉边缘的10%后拼接。虽然耗时翻倍但精度提升肉眼可见尤其是处理边长超过4000像素的素材时强烈建议用这个方法。也有朋友问能不能直接把模型改成更大感受野我建议别折腾——训练时的固定维度是硬约束强行改输入尺寸会影响识别率。用重叠分块是最简单且无损的解法。7. 聊聊替代方案和工具链选型StarNet之外你还需要什么7.1 StarNet还在一直更新吗有哪些同思路工具StarNet虽然名字带Star但它本质是纯Python库训练框架是TensorFlow模型文件是tflite模式很轻量化。社区里比较活跃的还有PixInsight原生的StarXTerminatorRuss Croman出品和Starnet的PI封装版本。三者各有偏好人群。StarXTerminator的商业版在窄带、LRGB、严重拉线数据上表现更好但对没预算的朋友来说StarNet已经完全够用。StarNet的长处是开源、无授权限制、可脚本化短处是模型的泛化能力稍微保守。我的建议是如果你只用PixInsight直接用StarXTerminator或者StarNet如果你有Python批量处理需求独立版StarNet反而是最好的选择。7.2 配套的三个神级辅助工具让去星效果再上一个台阶去星只是手段最终目的是出图。我在完整的后期流程里会给无星图层配上下面三件套噪声抑制灰度图用TGVDenoise彩色图用MMT或ACDNR。重点是对无星图层做保守降噪不要拉太狠否则背景会被压成塑料感反卷积无星图层上跑RL反卷积两次就够了目的是锐化暗云气的边缘。传统上害怕反卷积在星点周围画圈去星后这个顾虑可以放下HDR多重曲线无星图层可以把云气细节从极暗提到极亮连续拉伸12到15次都不会出现星点爆炸这让核心区与外围暗云气的过渡变得极其自然。7.3 为什么我不建议跳过去星前校准直接莽可能有人会想反正模型理解背景我随便拿一张有云缝、有热像素、有渐变的原图去跑是不是也能去掉我不会拦着你去试但结果大概率是边缘发毛、背景有细碎斑驳。原因是模型对真实结构的敏感度和对伪结构的敏感度并不相等它分不清哪些是噪声伪影、哪些是真实天体。因此去星前的基础校准永远是第一步而不是可选项。这也是整个工具链里唯一不可跳过的前置动作。8. 从一次去星事故说起我在实用中踩过的坑和修复办法8.1 事故现场额头上有三颗永不消失的黑点有次处理一组NGC扩展目标的窄带数据我用StarNet去星后得到的结果里原本亮星位置出现了一圈明显的暗环。第一反应是参数问题但调了好几轮都没解决。后来我把原图单独做了一次轻微散焦或平移后重跑暗环消失了。复盘后发现原因在于该目标中心区域有一颗超过20等、接近全饱和的恒星它的电荷溢出在CMOS上形成了纵向的柱状伪影。StarNet的卷积核不擅长处理这种非圆对称的伪结构于是把溢出的梯形区域当成了部分云气强行用周围的值填补结果正好在饱和核心中心留下了一个凹坑。修复思路很直接把有溢出伪影的窄条区域在原图上做局部涂抹或裁掉再重新去星再补回那个区域。不需要对整个图重新跑只需对受损区域做小范围重推理然后羽化缝合。8.2 批量处理时的经验每次跑完都该对比有星/无星的统计量眼尖的人可能问怎么判断一次去星到底做得好不好不能只看眼睛。我推荐一个量化办法——加载原图和无星图计算两者的峰值信噪比PSNR和结构相似性指数SSIM并记录无星图的亮度均值。评估规则很简单无星图的背景均值应比原图低因为星点发光贡献被移除但不应低过头否则说明模型误删了云气。PSNR太高比如超过40dB也不正常说明去星幅度太小星星没彻底移除。这些指标能在批量流水线里自动筛选异常文件。8.3 那些不该去星的素材我现在的识别准则是这样的我还总结了一套是否适合去星的快速判断清单星点拖线超过3个星点直径不建议恒星饱和面积超过全图0.5%不建议直接跑需先HDR压缩图上同时存在亮彗星或带外晕的反射星云建议做局部蒙版目标本身是疏散星团或球状星团不建议整体去星只对背景区裁剪后再去曝光严重不足导致背景只有不到100 ADU16位动态去星结果可能不理想先拉满再判断。这张清单在实操中帮我避开了至少5次返工。分享出来希望对你有用。9. 收尾处说一点个人的偏执我自己用StarNet一年多最大的心得倒不是它有多神奇而是它改变了我的后期思维方式——以前做深空后期总是绕着星星走缩星、羽化、避让一切操作都像在雷区里跳舞。现在我已经习惯先拆掉星星把力气花在云气本身上最后再把星星按自己的审美摆回去。这种拆解再组合的思路让我出图的风格和效率都有了质的改变。最后说一个小技巧如果你出图时发现某些大而明亮的恒星在贴回无星图层时显得突兀可以单独对那一两颗星做高斯模糊处理再以柔光模式叠入观感会立刻自然很多。这是常规教程里绝对找不到的细节但在实际出片时非常管用。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。