☰
StarNet星点分离实战:深空摄影后期从安装到双图层合成全流程
2026/9/29 18:17:53 网站建设 项目流程

深空摄影这块有个老段子:拍星云最花时间的往往不是拍,而是后期怎么对付满屏的星星。尤其目标本身是暗淡云气的时候,密密麻麻的星点会把背景压得又脏又乱,星云云气反而成了配角。StarNet就是专门解决这件事的免费软件,用神经网络把星点从图中“摘”出去,留下干净的星云背景。我在后期流程里测试了相当长时间,也从各种失败案例里踩了不少坑,这篇把完整心得写出来,从安装到出图一条线讲清楚。

StarNet 是 Nikita Misiura 开发的开源项目,2019 年前后在 AP(Astro Photography,天文摄影)圈子里传开,2023 年放出 V2 模型后,分离速度和细节保真度都上了一个台阶。适合正在做窄带合成、宽带 LRGB 后期,想把星点和星云分开处理的人参考,也适合科研预处理时批量剥离恒星前景。对比传统手工抠星点的方式,它最大的价值不是“省时间”这么简单,而是把“画面中恒星和星云云气的关系”从像素层面拆开,让后期每个环节都能针对性地工作。

1. 为什么后期流程里必须有一道“分离星点”的工序

1.1 星点不仅挡画面,还挡了云气的动态范围

拍深空的时候,一个尴尬的事实是:传感器上真正占大头信号的往往是恒星,不是星云。星点虽然看起来小,但峰值亮度极高,亮星核的强度很容易超过目标云气的几百倍。一张图里如果同时包含亮星和暗云气,做 HistogramTransformation(直方图拉伸)的时候就有大麻烦:拉伸到云气可见时,星点早就过曝成了毫无层次的死白;压到星点不刺眼时,云气又暗得无法看。

这个矛盾在我处理 M31 仙女座星系的时候体会特别深。星系中央核球和旋臂的亮度差非常大,如果单一做全图层拉伸,旋臂里的暗尘埃细节几乎全丢。当时第一次用 StarNet 把星系主体往外摘,再对星点层单独做“压缩高光+保留颜色”,最后重新合成,整个画面的信息被彻底释放了。所以分离星点不是“为了画面干净”这种审美问题,它直接关系到动态范围利用率。

1.2 传统抠星的工作量让人崩溃

在 StarNet 出现之前,分离星点基本靠土办法。最笨的办法是 PS 里用套索选中星点、羽化、填充背景色,大星点还好,几百颗小星点选到眼花;稍微讲究一点的办法是 PS 里的“最小值”滤镜做星点收缩形态学处理,再配合蒙版把星点挖掉。这些方法的通病是:遇到密集星场、双星、衍射芒刺、星点饱和溢出的场景,很容易留下暗黑边缘或灰白色残留,处理一晚上可能只弄干净一小块。

另一个思路是用动态范围压缩后再调色差,比如DBE(Dynamic Background Extraction,动态背景提取)把渐变背景校准后,用“ATrousWaveletTransform”小波分层,把包含星点的高频层单独压低。这套方法花了很多年,仍然是很多人处理星点的核心手段,但很难真正做到“把星点从图像中物理移除”,高频层里既有星点也有云气的纤维细节,一损俱损。

1.3 现在的做法:让神经网络学会“无星世界”

StarNet 的模型底层是一个针对天文图像做过大量训练的卷积网络,输入一张图,输出的是“如果这张图里没有恒星,应该长什么样”。训练时用的是海量成对图,一张是真实带星点图,一张是对应星空背景图(通常由模拟或人工方式生成),网络在这个任务上迭代。实际使用的时候,它并不理解“什么是恒星”的物理定义,而是学会在像素尺度上识别星点局部形态,同时保留云气的光滑结构。

我第一次看到输出图的感受是“这根本不是滤镜效果,而是重新画了一张物理上说得通的星空背景”。云气纹理反而比原来更清楚。这就是它的独到之处:先做减法,去掉星点后再做增强,云气细节就自然浮出来了。

2. 动手前把环境准备好,模型选型也不必纠结太久

2.1 StarNet 的运行条件与安装

StarNet 官方提供 Windows x64 和 Linux x64 的二进制文件,Mac 用户没有官方包,常见做法是在 Linux 虚拟器或 Docker 里跑,或者在 Windows 虚拟机里跑。官方版本并不需要安装 TensorFlow 之类大环境,解压后直接用,但前提是系统里有 .NET 6 运行库。很多朋友卡在这一步,症状是运行命令后提示“You must install .NET to run this application”,装上对应版本的 runtime 就好了。

如果走 PixInsight 插件路线就更省事,在 PI(PixInsight 的简称)的 Resources 里更新即可,最新版本已经内置了 StarNet 脚本。安装后出现两个入口:一个是 Script > StarNet,另一个在 Process 菜单下;两个入口逻辑基本一样,只是弹窗参数略有差异。我自己更习惯用 Process 版本,因为可以在 Process Container 里批处理多张图,速度也稳定一些。

2.2 V2 模型和 V1 模型到底选哪个

StarNet 官方主推 V2 模型,我刚上手时用的还是 V1,两者差别非常明显。

V1 模型的特点是原生支持彩色图,但网络规模小一些,对细密小星点的识别不够彻底,如果用短焦镜头拍摄密集星场比如天鹅座一带的富氢区,跑完还会留一些“碎星星”没清干净。V2 模型整体采用双分支结构,一个分支处理星点形态,一个分支处理云气结构,参数规模明显加大,对碎星点和边缘星点的识别能力好了不少。

V2 的代价有两个:一是显存和 CPU 算力要求更高,老显卡或纯 CPU 跑会明显变慢;二是有“伪影问题”,在特别亮的大星周围偶尔出现奇怪的暗环或弧线,社区里常叫“burn-in”。针对这个问题,官方在 V2 模型上增加了一个 anti-burn-in 选项,PixInsight 插件界面里也有对应复选框。我建议默认选 V2 + anti-burn-in,如果目标亮度不高且星点稀疏,再考虑关掉抗伪影来换取细节。

2.3 命令行与插件的取舍

命令行版本叫 starnet_cli,它能精确控制线程数和模型版本,也方便批处理脚本调用。我最初就是用命令行在测试,下面这条命令是最基础的用法:

./starnet_cli input.tif output.tif -t 8 -n v2

其中-t指定线程数,一般设成物理核心数上下浮动,因为同时在跑其他软件的话需要留点余量;-n选模型版本,v1或v2都支持。实际运行中 CLI 不提供预览窗口,只能看到进度条,所以更适合“全流程脚本化”的情况。

PixInsight 插件的优势是当前图像窗口里直接出结果,而且预览神器小图窗能快速判断是否要调参数。我现在的标准做法是:日常处理用插件,纯批处理或需要在其他脚本中串联时用 CLI,两条路都值得留一份。

3. 实操流程:从一张素材图到星与云彻底分离

3.1 输入图像的正确姿势:先拉伸再喂,还是直接喂?

StarNet 的官方文档里明确指出,V1 建议输入已经拉伸到接近显示效果的非线性图,如果输入纯线性图(未做任何拉伸),输出的星云背景往往会偏灰、偏暗。V2 虽然整体鲁棒性提升,但依然建议先做一个前期拉伸。我在实际测试里,把同一张线性图分别用“直接输入”和“先用 HistogramTransformation 拉伸到中等亮度再输入”对比,后者的云气纹理明显更连贯,伪影也少。

PixInsight 插件里专门提供了一个 Linear stretch 复选框,勾选后插件会在内部对线性图做一次自动拉伸,输出仍然是线性尺度还是非线性尺度要分情况。我做摄取后处理的经验是:已经做完全部非线性拉伸的图,就别再勾 Linear stretch;如果输入的是线性图,勾上 Linear stretch 效果通常比不勾好。更高阶的做法是先用 STF(ScreenTransferFunction)预览理想拉伸强度,把这组参数应用到一张轻微拉伸图层,再交给 StarNet。

3.2 跑分离的标准流程

具体到 PixInsight 里,操作流程是这样走的:

  1. 选中预处理好的图像,建议 16 位或 32 位浮点 TIFF,不要用 8 位 JPG 直接跑。
  2. 打开 Process > StarNet,选择模型版本 V2,勾选 anti-burn-in。
  3. 如果输入是线性图,勾选 Linear stretch;如果不是,保持不勾。
  4. 点三角形 Apply 到当前窗口。

几分钟后输出一张 starless 图,这是第一份核心产物。判断这次分离是否成功,就看三个地方:星点是否彻底消失,云气有没有被连带削掉,亮星附近有没有出现暗晕或亮弧伪影。如果星点仍有残留,可以尝试在跑之前先对图层做一次轻微高斯模糊?不,我的经验是应该先对星点做过一次膨胀增强,让弱星点先显露信号,再喂给 StarNet,识别率会高很多。具体可以用 PI 的 Convolution 或 MorphologicalTransformation 对图像做微量开运算。

第二份核心产物是星点层。在 PixelMath 里用一张很简单的公式实现原始图减去 starless 图:$T - starless,$T 代表当前激活通道,starless 是 StarNet 输出层。注意两张图尺寸、位深必须一致,否则 PixelMath 会报错。减法之后得到的就是“只有星点”的图像,把这层存起来,后面用于星点锐化、颜色饱和、光晕压缩。这一步是整个后期工作流里性价比最高的投资,因为星点和云气从此各自为政。

3.3 星点层处理的核心参数

不少朋友第一次分离完就直接合成出图,发现星点层发灰、颜色不够鲜艳,或者星点背景有灰边。原因很简单:星点层直接保存时,它的黑点并不为 0,而是保留了一层因原始图拉伸而抬升的背景灰度。所以对星点层必须先做一个“黑点重定义”,用 HistogramTransformation 把直方图左端推到背景峰值附近,让星点外的区域基本归零。

我的参数习惯是:打开 STF 自动预览,记录 STF 的阴影点位置,然后应用到星点层,有时再补一次“饱和度提升”,比如 SCNR 绿通道降噪后加一个 CurvesTransformation 拉高中间调。这样星点层会被推到背景纯黑、星点亮色拉满的状态,再和星云背景层叠加时,基本不会出现发灰的情况。

3.4 分离后如何重新合成

重合成这件事,最基础的做法是 PixelMath 里:starless + star_layer,直接加回,恢复到“有星的画面”。但既然已经分开了,就可以做更多事。如果星层太硬刺眼,可以先用 MLT(MultiscaleLinearTransform,多尺度线性变换)对星层的小尺度层做轻微衰减,让大星柔和下来。如果想给星点添加颜色偏移,可以在星点层上用 LRGBCombination 或 ChannelCombination 分别调整 RGB。

我的个人偏好是“分层合成”:先把 starless 图层经过丰富的云气增强处理,拉高对比度、增加局域对比,再用高光压缩把星点层压到每颗星有渐变过渡,最后用 Screen 混合模式合成。这样做出来的星点不再是一个个刺眼白点,而是带颜色的光点。如果你还没试过,可以在这上面花点时间,回报非常明显。

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

4.1 输出慢、显存不足、CPU 满载正常吗

StarNet 推理过程对算力要求不算低。V2 模型跑一张 4000x4000 的全图,在 RTX 3060 级别显卡上通常要一到两分钟,如果只在 CPU 上跑,可能要三分钟以上,老旧笔记本跑十到二十分钟也不稀奇。遇到这种情况,先看任务管理器确认是不是有别的进程占着 CPU;在命令行里指定合适的线程数,不要一味拉满,因为模型内部并行度不是线性增长的,线程太多反而增加调度开销。

显存不足的典型报错是 CUDA out of memory 一类的信息。优先办法是把图像切成小块?StarNet 插件处理大图超过某个尺寸时会自动分块,但仍建议事先把图缩到合理尺寸,比如保留长边在 5000 到 7000 像素范围内,超过部分先用 Resample 缩小再跑,输出后再恢复尺寸。这样既降低显存占用,也避免 V2 在超边界区域产生伪影。

4.2 亮星周围的伪影 —— burn-in 和“海鸥翅膀”

V2 模型最烦人的问题就是亮星留下的伪影。在特别亮的星点周围,跑完后会出现一圈暗环,或者一道弧形光带,像“海鸥翅膀”。这其实是网络在预测“无星”图像时,对高强度像素区域产生了过度响应,并不是原始图像里的东西。

解决办法有这么几个,按优先级排:第一,在插件里勾选 anti-burn-in 再重跑,十次有七次能压住;第二,如果伪影只集中在集中在某几颗超亮星附近,可以在跑之前用 CloneStamp 或 RangeSelection 对超亮星做轻微压暗,跑完再接回;第三,保留原始图,用蒙版把伪影区域隔离,在星点层上动手修复,不影响星云背景。

4.3 输出太暗或背景发灰

输出太暗通常是输入图动态范围接近纯线性、云气信号低。遇到这种情况,先在输入图上做一次模拟拉伸,观察 STF 下的正常显示效果,再把 STF 应用到一份副本上,然后喂给 StarNet。背景发灰则是相反问题,拉伸过头导致背景噪声也被当作“星云”输出。判定标准是:输出的 starless 图背景均匀度是否和原始图背景一致,如果整体都被拉高了很多,多半是拉伸过头。

另一个常见坑是用 JPG 直接跑。8 位 JPG 丢失了大量暗部细节,输出后云气边界粗糙、背景有可见色块,强烈建议全程使用 16 位整数或 32 位浮点 TIFF。

4.4 快速排查参考表

现象最常见原因推荐处理
输出仍有小星点残留输入拉伸不足、弱星信号太弱先做轻微拉伸;或用膨胀处理增强弱星;再跑一遍
大星周围出现暗圈/亮弧V2 的 burn-in 伪影勾 anti-burn-in;局部压暗超亮星后再跑
星云背景太灰/太亮输入拉伸过度降低拉伸强度;输出后对背景做 DBE 校准
星点层整体发灰星点层保存前未重定黑点对星点层做 HistogramTransformation 拉黑
速度特别慢CPU 并行度不足、显存受限指定线程数;降采样到长边 5000 像素内
输出尺寸不一致导致合成报错两张图层尺寸或位深不同Resample 到一致尺寸;都用 32 位浮点保存

5. 进阶玩法:让分离后的两半真正为最终出图服务

5.1 双图层分别做增强再合成

分离后最大的优势是“各自处理”。starless 图层专注于云气增强,可以做局部对比度提升、去背景渐变、窄带映射调色,不用担心星点被误伤;星点层则专注锐化、缩星、色彩统一。我早前处理 M16 老鹰星云时,用了两套完全不同的流程分别增强两个图层,最后合出来,中央云气的层状结构和周围星点的色彩都很难得。

举个例子:starless 图层用 HDRMultiscaleTransform 把云气里的暗尘埃细节拉出来,再用 CurvesTransformation 压低中间调让云气厚实;星点层用 Convolution 做一个轻微高光压缩,再用 Curves 拉高饱和度。合成后星点是柔软的、带颜色的,云气有体积感,整体提升的质感用单层流程很难做到。

5.2 用星点层给窄带图像“点色”

窄带图像的星点颜色往往不太正,因为 Ha 发射线下星点偏红,OIII/SII 偏蓝绿,合成后容易显得颜色死板。单层调整色相容易把云气也带跑,分离后就可以只调整星点层。我的做法是先对星点层做 SCNR 去除偏绿,再用 ColorCalibration 校准到白点,最后用 CurvesTransformation 强化蓝白、橙白对比。这样星点看起来更加符合真实恒星颜色,而对云气毫无影响。

5.3 批处理与脚本化

如果手上有一批素材,比如双窄带长时间序列,StarNet 命令行模式就派上用场了。写一个简单的循环脚本,对列表中的文件依次调用 starnet_cli,输出全部保存到 starless 文件夹,十几分钟的无人值守处理。注意批处理时尽量把所有输入先统一成同一尺寸、同一拉伸状态,否则不同帧的分离效果会不稳定,因为 StarNet 对输入亮度尺度比较敏感。

我自己用 PowerShell 写过一个简单的循环调用,效果稳定。伪代码如下:

$files = Get-ChildItem .\raw -Filter *.tif foreach ($f in $files) { .\starnet_cli.exe $f.FullName .\out\$($f.BaseName)_starless.tif -t 4 -n v2 }

这样跑完,后面的对齐、叠加再也不用担心星点位移问题,因为是同一份 starless 图直接合成的。

5.4 别忘了“原图优先”原则

StarNet 再强,也只是辅助工具。分离结果如果出现无法解释的变形云气,或者某些本不该消失的云气细节被大量削减,这时候千万不要硬套这个图层,宁可回到原始图上手工处理。最好养成“分离结果只作为参考/强化层,不替代原图”的习惯。我在处理猎户座马头星云的云气细节时,StarNet 的一版输出把一部分丝状结构误当作噪声去掉了,幸好保留了原始线性数据,最后手工合成才对。

我的经验是在每一次 StarNet 跑完后,都随手把 starless 图与原始图做一次图层叠加对比,重点看云气的亮部和暗部细节是否都还健在。做到这一点,即使偶尔出现伪影,也不会造成灾难性损失。

6. 踩过的坑与偏向方向

说到整个 StarNet 流程,我最大的心得是:前期准备比后面调参重要。很多人一开始图省事,拿一张线性图直接跑,结果输出灰蒙蒙一片,就下结论说软件不行。其实只需要先把 STF 预览应用到副本上再做一点拉伸,效果立刻天壤之别。这个细节官方文档里只是一笔带过,但我个人认为它决定了 80% 的成败。

另一个心得是 V2 的 anti-burn-in 选项不要太早关闭。虽然我测试时它在极个别图中会让云气稍微变软,但绝大多数场景下对出图质量的提升很实在。

跑 StarNet 这几年,我在窄带、宽带、彩色相机、单色相机素材上都测过,还拿它处理过月球拼接的边缘、行星土星的高倍图,效果有好有差。说到底,它最适合的依然是一般深空图像,尤其是目标云气丰富、星点密集的图。只要正确拉伸、合理选模型、细致检查伪影,这工具用起来相当省心。

如果你还没尝试过把“双图层流程”引入到自己的后期管线里,下次拿一张旧图跑一次,你会明显发现星点和云气各自的空间都变大了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询