1. 这是干嘛的:一个被名字耽误的后期利器
大概两年前我第一次在朋友的工作流里见到 StarNet 这个工具,当时还以为是哪个新出的卫星网络项目,结果人家只是轻描淡写地说了句“把星星抠掉的插件”。用完之后我直接沉默了三分钟——因为过去一年我用人工修图的方式处理星点,从未如此干净利落。
StarNet(特别是后来的 StarNet++)本质上是一个基于神经网络的星点分离工具,核心功能就一句话:把一张星空照片里的星点拆出来,剩下一张只包含弥散天体(星云、星系、暗尘埃)的“无星”背景图。回到天文摄影后期这条链路上看,它解决的是一个极其痛点的问题:在拍摄银河、广域深空、氢区或暗星云题材时,星点永远又密又亮,你想要叠出背景云气的细节,就得把星点压制、缩小、或者完全翻转成蒙版。过去这套逻辑靠的是 StarMask、Morphological Transformation、缩星脚本这类传统数字图像手段,效果看天吃饭,参数全靠手抖。现在有了神经网络,这个环节几乎变成了一次性的确定性操作——输入一张图,输出一张无星图,稳定得可怕。
在小红书、B站、知乎上搜“starnet”,你大概率看到各种“对比惊人”的效果图。但大多数教程都是“下载安装,跑一下,完事”,很少有人讲透它为什么能这么做、哪些地方会翻车、以及踩完坑之后怎么回去补救。这篇文章就是把我这一年多在各个项目里用 StarNet 总结下来的经验、参数、坑位和处理思路完整写一遍,适合刚入门广域深空后期、被 PixInsight 里一堆缩星名词劝退的同学,也适合已经在用 MT 缩星但觉得效果不够理想的老鸟参考。
先说清楚一件事:StarNet 不是用来“修图”的,它是给后期流程提供中间产物的工具。理解这一点比学会点哪个按钮重要得多。
2. 核心思路拆解:为什么“抠星点”这件事值得专门搞个神经网络
2.1 星点在传统后期里的处理困境
先普及一个背景知识——在天体图像处理里,星点通常不是你的“目标物”,而是干扰物。比如你想拍一面暗星云,全场光收集到的光子绝大部分来自前景的星星和背景的天光,而暗星云本体几乎不发亮。你为了让暗部云气显现出来,画面必须拉伸,但一拉伸,原本就接近饱和的星点全变成了巨大的光晕,旁边的暗星云细节彻底被吃掉。于是后期就要做缩星、挖星、星点蒙版等操作。传统思路比如 PHT 的形态学变换,本质上是对星点做最小值过滤,加一个蒙版保护背景;或者用反卷积去尝试把弥散的星点压缩回原来的点状。问题在于:
- 星点的光学轮廓跟随焦状态变化,并不是统一的圆形;
- 背景亮度不均匀,同一个参数在画面一端过冲、在另一端不足;
- 蒙版边缘容易产生“油亮感”和黑圈,肉眼一看就知道是后期磨皮过度。
这些传统方法往往需要非常精细的蒙版配合,技术门槛高、调试时间长。而网络热词“starnet”出现频繁的原因,恰恰是因为它把这一长串经验性的手工操作,转换成了一个“离线模型推理”的过程。
2.2 StarNet 的模型思路简析
我尽量不扯太多论文术语,StarNet 的底层逻辑你可以通俗地理解成:它看了大量“带星的图像”和对应的“无星干净背景”,学到了一种空间变换关系。具体来说,网络尝试从输入图中分离两个成分——一个是紧凑的、高对比度的局部结构(星点),另一个是大尺度平滑的背景结构(弥散云气)。这个思路有点像照片分离出“纹理层”和“结构层”,但它专门针对天文图像做了精细调校。
StarNet 模型本身对应两条技术路线:最早的开源版 StarNet,是基于灰度图的网络,只处理单通道;StarNet++ 则强化了对彩色图像的通道相关性处理,对星点颜色残差更敏感,实际上在处理氢区窄带图像或者彩色 CCD 图像时,效果会好不少。后面在装环境那节我会详细拆版本差异,这里先掌握一个大原则:处理彩色图优先上 StarNet++,灰度 16bit 图用经典 StarNet 也不差。
2.3 为什么要用 StarNet 而不是直接 Photoshop 差值
有人会问,我用 Photoshop 的高反差保留或者最小值滤镜,配合混合颜色带,是不是也能分离星点?答案是可以,但非常痛苦,而且没有普适性。图像混合颜色带只能按亮度做选择,星点密度大的区域会把背景一起带出来;高反差保留又能保留星点周围的衍射环。StarNet 最核心的优势在于它的模型面对真实拍摄的复杂噪声模式有很强的泛化能力——光圈星芒、镜头内反射、拖线星点、饱和过曝的亮核——都不会造成大面积的误判。当然,它也不是万能的,后面到问题排查部分我会专门列出会翻车的情况。
所以在我的固定工作流里,StarNet 承担的角色是“把星点层从背景层中摘除”,之后两张图各走各的处理路线:背景图尽情拉伸、降噪、增强云气;星点图单独控制大小、柔化、饱和度。最后复合的时候,一个干净的背景板,加一层被精细处理过的星点,出图质量是直接拉伸全图永远达不到的。
3. 安装与集成:三分钟跑起 StarNet++
3.1 核心运行逻辑与两种接入方式
现在主流的 StarNet 接入方式有两条路。第一是下载独立的 StarNet++ 命令行版本或 GUI 版,由程序读取输入图像直接输出无星图;第二是安装为 Photoshop 插件或 Astro Pixel Processor 的模块,在修图软件内部直接一键调用。PixInsight 本身也有第三方权重版本和脚本方案,因为版本迁移频繁,我会以通用逻辑讲。
先提醒一个最大的坑:StarNet++ 基于 PyTorch,依赖较新版本的 CUDA 和 cuDNN,所以依然需要本机装对应的显卡驱动。不要求你懂深度学习的细节,但你需要能跑起来 Python 环境。如果完全不想碰命令行,直接下载 Release 里带 GPU 的版本即可;要是你坚持全 CPU 跑,也可以但速度会非常折磨,后面专门讲。
3.2 结合实操的安装步骤
以我在 Windows 上的经验为例,推荐的安装流程是:
- 找到官方仓库的 Release 页面,我建议选择带
_win编译后的版本,减少环境配置成本; - 先确认显卡驱动版本不低于 470 系(兼容 CUDA 11.x),如果驱动太老,模型会直接报错;
- 下载完解压后,可以先跑一张小尺寸样例,命令行会输出推理进度,你能看到“Patch size”“time”之类的日志;
- 如果是命令行版,输入命令大概长这样:
starnet++ input.tif -o output_nostar.tif“-o”意思是输出路径;实际上参数没那么复杂,默认参数在新版中已经比较均衡。 5. 验证输出:打开 output 文件,此时星点区域应被填充为背景纹理,而不是纯黑色空洞,纯黑或者灰色斑点通常说明模型没有正确区分。
Photoshop 用户注意:插件的目录不要放在带中文或空格的路径下,非常容易报 “Model not found”。这个问题我至少替别人排查过三次。
3.3 显存和性能:低配显卡能不能用
StarNet 对显存的需求跟图像尺寸直接相关。512×512 的 Patch 推理方式理论上不占用太多显存,但实际跑全图的时候,内存交换和图像拼接会产生额外开销。我自己的机器是 8GB 显存的老卡,跑 6000×4000 像素的 16bit TIFF 需要大约 30-60 秒,如果开 4K 显示器用的是核显,那 CPU 推理模式可能要 5-10 分钟。处理超大拼接图如 Mosaic 时,强烈建议先裁剪测试一小块区域调好参数,再整张跑。纯 CPU 推理不是不行,但效率确实感人,如果只是偶尔跑一张倒是可以忍受。
4. 实操全流程:从一张 M42 开始,把无星图玩明白
4.1 什么样的输入图像最适合
输入图像的质量决定了输出质量的一半。StarNet 在完全线性(未拉伸)的图上的表现,与在已拉伸图上完全不同。我的建议是:在你的流程中尽早进行星点分离——严格在线性阶段就执行。原因有两层:
- 线性图上星点亮度梯度还保留原始物理特性,轮廓锐利、不扁平,网络更容易识别“这是星点”;
- 拉伸后的星点会带有非线性色调映射的痕迹,星点周围的衍射环与光晕边界会被夸大,导致分离边缘出现“鬼影”。
我自己的典型流程是先完成叠加校准,保存一张干净的 master 文件,先对它做一次轻微的 DDP 拉伸作为预览,再用原始 master 去跑 StarNet。如果你用的是 Siril,那么“Background extraction”之后出来的图就非常适合直接分离。
4.2 参数选择与理解
StarNet 的交互参数在新版里做了简化,但你可能还是会看到一些与“滤波器尺寸”“降噪强度”“置信度”相关的设定。坦白讲,默认值在大多数场景下已经够用,但你理解参数意味着什么,才能应对特殊场景。
以我经常调整的一个参数“降噪强度”为例,数值越小,网络越倾向于保留背景的细小纹理,星点周围模糊范围也越小;数值调大,输出背景更平滑,但代价是可能会导致云气边缘受损。经验公式是:分辨率越高的图,参数可以偏向保守,因为星点占据的像素相对面积小;分辨率低或者强降噪相机拍摄的图,稍微加大参数,可以把残留的噪点一并圆润掉。
另外一个“星点尺寸”相关的设置——模型内部其实有一个尺度概念:典型星点半高宽(FWHM)大约在 2-5 个像素的图片里识别得最好;但如果你用的是长焦头加赤道仪,FWHM 有可能到 8 像素以上,这时默认模型可能会把一部分亮星周边误判为弥散结构。处理这个问题的常用办法是先把图像使用非线性的“星点缩小”预处理一把(比如先缩星 20%),分离完再对星点图做对应的还原。这话理解起来有点绕,实际操一次就明白了。
4.3 实际操作记录:一个典型的无星流程
我个人常用流程如下:
- 打开 master 图,先复制一份保存为
working_nostar_input.tif; - 跑 StarNet,输出
nostar.tif; - 原图减去无星图,得到星点差分图
star_mask_diff.tif(这一步在 PS 里用“应用图像”即可,图中减法出来的是带背景残留的星点,后续需要进一步清理); - 在 PI 里分别对
nostar.tif做拉伸与降噪——这时候云气随便拉,不会出现星点过曝问题; - 对
star_mask_diff.tif做一次“Minimum Filter”+“星点缩放”(Morphological Transformation),把星点压小; - 将二者用“Screen”混合(或者
Lighten)叠加回来。
当然,如果只是日常出图,更省事的路子是:直接用无星图做全部非线性处理,最后把原始图像的星点层弱化后叠加。步骤 5 的好处是你可以直接控制星点的最终大小和风格:我拍马头星云时会刻意把星点缩小 50%,让视线集中在云气上;拍星系时反而保留满星效果作为环境。
提示:任何减法运算都会在星点位置上产生暗圈,原因是星点的能量原本集中在几个像素内,扣除背景重建后星点被膨胀成大圆盘,减去原图,圆盘边缘产生负值。处理方法是给差分图加一个低通保护蒙版,限制在星点中心半径内操作。
4.4 用脚本融入批量处理
如果你一天要处理好几组目标(比如连续挂机拍了三个晚上),命令行版本的批量模式非常好用。核心命令并不复杂,对每个文件循环调用即可,配合一个简单的 shell 脚本:
for f in master_*.tif; do starnet++ "$f" -o "nostar_${f}" done这个脚本跑完你再回头审视每个输出,就有精力重点检查那些云气暗弱的图,而不是把所有时间耗在执行上。
5. 常见问题与排查技巧实录:我踩过的坑逐一说
5.1 星点分离不干净,残留光晕
情况一,在亮星周围出现残余的半透明“光晕”,很像没有摘干净。多数原因是输入图的星点已经因拉伸产生了非线性光晕,模型在训练时没见过这种“扁平的宽光晕”。解决办法:
- 返回线性阶段,重新分离;
- 如果必须使用已拉伸图,可先用双曲线拉伸或 HDRMT 减弱光晕宽度;
- 对输出残影区域手工橡皮擦配合蒙版修复。
5.2 背景出现规则网格纹理
这个情况通常出现在显存不足时,模型被自动切成小块推理,块与块之间的拼接造成了网格感。解决方式:
- 降低输入尺寸;
- 在命令行中显式指定重叠区域大小;
- 换用内存共享模式(具体参数参考你版本自带的说明)。
网格纹理一出现,后期很难完全消除,所以我现在的习惯是跑之前先做一次“磁盘剩余空间和显存占用”检查,养成预防意识。
5.3 无星背景里星点区域变成“平滑塑料”
你会在暗星云和亮星核区域看到一种奇怪的皮肤质感,那是模型把背景纹理填平了。出现这种情况,一种可能是原图信噪比太低,模型只能“脑补”出背景结构;另一种是模型版本老旧。需要明白,无星图只能用于辅助处理,绝对的“完全干净”在某些场景下并不存在,过度依赖会失去真实感。
| 问题现象 | 可能原因 | 优先排查顺序 |
|---|---|---|
| 星点未分离 | 输入图已拉伸 / 模型版本旧 | 检查输入、换 StarNet++ |
| 光晕残留 | 星点过曝过大 | 预缩星后再分离 |
| 背景网格 | 显存不足 / patch 拼接 | 降尺寸、调重叠 |
| 背景塑料感 | 信噪比太低 | 先做降噪后分离 |
| 全图反相黑边 | 16bit 数据位深变化 | 检查位深和颜色模式 |
5.4 StarNet 到底用在拉伸前还是拉伸后?
从原理上讲,线性图是最佳输入。但有些时候你必须在拉伸后使用,比如后期做完局部反卷积和色彩校准后想检查残留星点。那我的经验是:
- 先以线性 master 跑一次作为主处理;
- 拉伸版本可以再跑一次,专门用于生成蒙版参考;
- 但两张无星图不可直接混合,其纹理有系统性差异。
6. 工具选型解析:StarNet、StarNet++ 与其他方案的取舍
6.1 StarNet 和 StarNet++:到底选哪个
经典 StarNet 是为灰度图设计的,输出单通道无星背景,速度更快,文件也小;StarNet++ 则重新训练了针对彩色图像的网络,增加了一组专门对星点颜色残差判别的 feature。对使用彩色相机或者 DSLR 拍摄的玩家来说,我的结论是直接上 StarNet++,尤其是在处理双窄带、HOO 合成图时,它的通道一致性会比老版本好很多,星点颜色不再变成“灰黑色的洞”。
如果你只用一套流程跑 Ha 单通道(比如拍马头或者类似的高对比目标),经典版完全够用,且推理速度有优势。两个版本可以互相补充,对于同一个目标各跑一遍进行对比往往是更靠谱的。
6.2 传统方法与“去星+合成”的差异
很多老玩家习惯于只用缩星(Star reduction)而不是去星(Star removal)。两条思路的核心分歧在哪?缩星流程,是在一张完整图上把星点的直径缩小、削弱亮度,好处是保留了原始星点的能量分布,缩完依然是一张真实感较强的图;而去星流程则完全移除星点,相当于数据降维,你可以无限提升背景的表现力,但最后必须重新叠回星点层。两者不存在绝对的优劣,我自己的体验是:
- 当目标本身就是以星点背景为主的“星野”类作品时,尽量别去星,缩星就好;
- 当目标是深空云气的细节展示时,去星合成路线的表现力上限更高;
- 当目标图星点密度极高(如银心广域)时,去星后再做星点的重建,能完全摆脱“碰碰车”式的大星压小星的反复调试。
6.3 其他“去星”工具的功能对比
现在市面上也有 Starnet U 系列、Separate Stars、以及 PI 内置的 StarXTerminator,本质上都是同一类技术路线。StarXTerminator 作为商业插件,其网络规模更大、对复杂背景的泛化能力更强,但 StarNet 免费开源,对大多数人来说效果差异并不明显。选择的时候建议按照你的 PI 版本来:如果你的 PI 版本较老跑不了 StarXTerminator,那 StarNet 是唯一不需要额外支出的选择;如果你的图像经多次 bin 后星点像素比例非常小,免费版的识别率足够高。
提示:跨工具跑同一个图时,输出位深可能不一样。我遇到过 StarNet 输出 32bit 而 StarXTerminator 输出 16bit 的情况,合成前务必统一位深,否则混合时色阶会“跳变”。
7. 进阶玩法:星点分离后的充分“压榨”
7.1 无星图用于生成更精细的蒙版
既然无星图去掉了所有点状高光,它天然就是一份优秀的“线性蒙版”素材。比如在 PI 里,你把无星图拉伸后作为 L 通道蒙版,那么云气、暗尘埃、发射星云的边界会分得很精细;比用 RangeSelection 或者 HistogramTransformation 手拉蒙版方便多了。我在处理暗星云时特别喜欢这种手法——无星图天然屏蔽了星点对蒙版范围的干扰,每个卷云结构都清晰可见。
7.2 用分离出的星点图层做星芒增强
有一类玩法比较偏门:把差分星点图单拎出来做星芒增强或颜色提升。做法是:对星点图做一次适度拉伸,然后限制在高光区域做卷积滤波,把星点整成带衍射芒的形态;之后再合成回背景图。这个手法在创作性作品中非常出效果,像一些摄影师会特意给亮星加六芒星,显得更有张力。当然,审美因人而异,我个人只在个别广域题材里使用,追求自然时可以不做。
7.3 消除低信噪比区域的色彩噪声
双窄带处理后背景经常出现红绿噪点,这些噪声在无星图里会被一体平滑。处理思路是:跑完无星图后,用原始彩色图做一个明度蒙版,在背景区域以无星图为“重构源”,做一次 20%-40% 不透明度的高斯模糊融合,这样背景色的纯净度会有肉眼可见的提升,且不会损伤星点周边的细节。
7.4 跨幅拼接时的星点统一
拍摄马赛克拼接时,每块面板的星点由于视场边缘场曲和合并畸变,FWHM 不一致。传统的拼接算法对星点很头疼。假设你先跑 StarNet,在每块无星图上拼接,整体背景是完全自洽的;之后再对原始星点图统一做缩星和全局色校准,最后把全幅星点层一次叠入,拼接痕迹会大大减少。这个思路拯救了我整整一个冬天的银河拼接项目。
8. 写在最后的几点体会
StarNet 这类工具的出现,确实改变了很多人对天体后期的工作方式,但它不是“一键大片”的魔法药水。一个比较准确的定位是:它替代了传统流程里“手挑星点”和“反复调整蒙版”的脏活累活,但并不会替你做美学判断。你对一张图的理解——哪里该干净、哪里该保留星点密度、背景的颗粒度要到什么程度,依然只能靠自己的眼睛和经验来把握。
我自己现在的流程基本固定了:线性阶段先分离出无星背景,拉伸时尽情压榨云气,星点层单独控形,最后用明度混合把自然感找回来。第一次跑出干净背景的那一刻,真的会有一种“以前的时间都花去哪里了”的感慨。但我也劝你,别把 StarNet 当唯一标准,随手用传统缩星流程互相对比,你会慢慢找到最适合自己风格的那条路。如果你在实操中跑出了奇怪的鬼影或者网格,回头看看这个清单,大部分问题都逃不出这几个原因。