You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查FITS文件头部是否包含有效WCS数据?

如何检查FITS文件头部是否包含有效WCS数据

我需要一种方法来判断FITS文件头部是否存在有效WCS数据——目前从无WCS的文件(比如ds9识别不出任何WCS)创建WCS对象时,既没警告也没报错,得到的是一套默认值。

使用的代码:

from astropy import wcs, fits

hdu = fits.open(path_to_fit_file)
header = hdu[0].header
w = wcs.WCS(header)
print(w)

输出结果:

WCS Keywords

Number of WCS axes: 2
CTYPE : ''  ''  
CRVAL : 0.0  0.0  
CRPIX : 0.0  0.0  
PC1_1 PC1_2  : 1.0  0.0  
PC2_1 PC2_2  : 0.0  1.0  
CDELT : 1.0  1.0  
NAXIS : 1920  1200

同时调用wcs.validate()也只返回一些警告,没有明确的有效/无效判定。以下是该文件的完整头部信息:

SIMPLE  =                    T / C# FITS: 07/16/2023 02:02:13                    
BITPIX  =                   16                                                   
NAXIS   =                    2 / Dimensionality                                  
NAXIS1  =                 1920                                                   
NAXIS2  =                 1200                                                                                        
BLKLEVEL=                    0 /                                                                                   
CAMID   = '926f8841ad8ccd139'  /                                                 
OBJCTALT=     34.4417644433851 /                                                 
GPS_EU  =               3868.9 / EndShutterMicroSeconds                          
OBJECT  = 'Sa11    '           /                                                 
EQUINOX =     2023.53719335833 /                                                 
OBJCTAZ =     215.096223700444 /                                                 
EXTEND  =                    T / Extensions are permitted                        
BZERO   =                32768 /                                                 
BSCALE  =                    1 /                                                 
ROWORDER= 'TOP-DOWN'           /                                                 
EXPTIME =                    3 / seconds                                         
XPIXSZ  =                 5.86 / microns, includes binning if any               
YPIXSZ  =                 5.86 / microns, includes binning if any               
XBINNING=                    1 /                                                 
YBINNING=                    1 /                                                 
CCD-TEMP=                -15.1 / C                                               
FRAMETYP= 'Light   '           /                                                 
SWCREATE= 'SharpCap v4.0.9268.0, 64 bit' /                                       
DATE-OBS= '2023-07-15T23:02:10.0038605' / GPS:Start Exposure                     
DATE-END= '2023-07-15T23:02:13.1115415' / System Clock:Frame Received           
DATE-OB2= '2023-07-15T23:02:13.0038689' / GPS:End Exposure                       
DATE-AVG= '2023-07-15T23:02:11.5038647' / GPS:Mid Exposure                                                                     
FOCALLEN=                  300 /                                                 
RA      =     281.387381627622 / Epoch : JNOW                                    
DEC     =    0.507833420011808 / Epoch : JNOW                                    
OBJCTRA = '18 45 32.000'       / Epoch : JNOW                                    
OBJCTDEC= '+00 30 28.000'      / Epoch : JNOW                                                                                
END                                                                                                 

解决方案

1. 检查核心WCS关键字是否存在且有效

标准WCS必须包含CTYPE1/CTYPE2(指定坐标系统,如RA---TAN/DEC--TAN)、CRVAL1/CRVAL2(参考点坐标)、CRPIX1/CRPIX2(参考点像素位置)这些关键字。可以直接遍历头部做检查:

def has_valid_wcs(header):
    required_keys = ['CTYPE1', 'CTYPE2', 'CRVAL1', 'CRVAL2', 'CRPIX1', 'CRPIX2']
    for key in required_keys:
        if key not in header:
            return False
        # 过滤空CTYPE和默认0值的CRVAL/CRPIX(部分合法场景可能例外,可按需调整)
        if key.startswith('CTYPE') and header[key].strip() == '':
            return False
        if key.startswith(('CRVAL', 'CRPIX')) and header[key] == 0.0:
            return False
    return True

# 调用示例
hdu = fits.open(path_to_fit_file)
print(has_valid_wcs(hdu[0].header))

2. 利用Astropy WCS的内置属性判断

Astropy的WCS对象自带is_celestial属性,能直接判断是否包含有效的天球坐标系WCS:

w = wcs.WCS(header)
if w.is_celestial:
    print("存在有效WCS数据")
else:
    print("无有效WCS数据")

针对你的文件,因为CTYPE是空字符串,is_celestial会返回False,正好对应ds9识别不出WCS的情况。

3. 兼容非标准天球位置信息

你的文件头部有RA/DEC、OBJCTRA/OBJCTDEC这类非标准字段,虽然不是标准WCS,但包含天球位置。如果需要识别这种情况,可以额外做检查:

def has_sky_position(header):
    sky_keys = ['RA', 'DEC', 'OBJCTRA', 'OBJCTDEC']
    return any(key in header and header[key] is not None for key in sky_keys)

# 组合判断逻辑
if has_valid_wcs(header):
    print("包含标准WCS")
elif has_sky_position(header):
    print("无标准WCS,但存在天球位置信息")
else:
    print("无任何WCS相关信息")

4. 用wcs.validate()做严格验证

wcs.validate()会返回包含验证细节的字典,通过'status'字段可以判断WCS是否完全有效:

validation = w.validate()
if validation['status'] == 'OK':
    print("WCS完全有效")
else:
    print(f"WCS无效或不完整:{validation['message']}")

注意:少数场景下,缺少部分关键字时validate()可能只返回警告,这时需要结合前面的关键字检查和is_celestial综合判断。

内容的提问来源于stack exchange,提问作者Viktor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:54:52