使用TrackMate宏无法生成轨迹问题求助
刚接触脚本编写,参照在线教程制作了TrackMate宏。我的图像是亮背景上的暗斑点,因此需要反转图像并调整尺寸以避免内存错误。脚本似乎能成功检测到目标斑点,且斑点排列在目标轨迹上,但无法生成轨迹本身。
运行代码时无报错,我已使用GUI手动完成所有跟踪操作,且使用的设置在GUI中有效。
脚本步骤为调取文件、反转并调整尺寸、检测斑点、生成轨迹,看起来除生成轨迹外的所有步骤都已完成。我甚至不确定TrackMate是否已正确初始化,输出结果与GUI生成轨迹时完全不同。打开保存的轨迹文件显示检测到0条轨迹,但视频中明显存在轨迹!
脚本代码如下:
from ij import IJ import os from os.path import join import sys from fiji.plugin.trackmate import Model, Settings, TrackMate, SelectionModel, Logger from fiji.plugin.trackmate.detection import LogDetectorFactory from fiji.plugin.trackmate.tracking.jaqaman import SimpleSparseLAPTrackerFactory from fiji.plugin.trackmate.gui.displaysettings import DisplaySettingsIO from fiji.plugin.trackmate.features.track import TrackIndexAnalyzer from fiji.plugin.trackmate.visualization.hyperstack import HyperStackDisplayer import fiji.plugin.trackmate.features.FeatureFilter as FeatureFilter from fiji.plugin.trackmate.io import TmXmlWriter import fiji.plugin.trackmate.action.ExportTracksToXML as ExportTracksToXML from java.io import File # Ensure the script uses UTF-8 encoding if sys.version_info[0] < 3: reload(sys) sys.setdefaultencoding('utf-8') # Directory for saving results directory = "/Users/SHARMAN1/Library/CloudStorage/OneDrive-TheUniversityofMelbourne/tm_vid/PRE 2024-04-02" # Get currently selected image file_path = "/Users/SHARMAN1/Library/CloudStorage/OneDrive-TheUniversityofMelbourne/tm_vid/PRE 2024-04-02/Well_A1.avi" imp = IJ.openImage(file_path) IJ.run(imp, "8-bit", "") imp = imp.resize(1000, 563, 1, "bilinear") IJ.run(imp, "Invert", "") imp.show() #---------------------------- # Create the model object now #---------------------------- model = Model() # Send all messages to ImageJ log window. model.setLogger(Logger.IJ_LOGGER) #------------------------ # Prepare settings object #------------------------ settings = Settings(imp) # Configure detector settings.detectorFactory = LogDetectorFactory() settings.detectorSettings = { 'DO_SUBPIXEL_LOCALIZATION': True, 'RADIUS': 5.0, 'TARGET_CHANNEL': 1, 'THRESHOLD': 2.0, 'DO_MEDIAN_FILTERING': False, } # Configure tracker settings.trackerFactory = SimpleSparseLAPTrackerFactory() settings.trackerSettings = settings.trackerFactory.getDefaultSettings() settings.trackerSettings['LINKING_MAX_DISTANCE'] = 60.0 settings.trackerSettings['GAP_CLOSING_MAX_DISTANCE'] = 60.0 settings.trackerSettings['MAX_FRAME_GAP'] = 2 settings.trackerSettings['SPLITTING_MAX_DISTANCE'] = 15.0 settings.trackerSettings['ALLOW_GAP_CLOSING'] = True settings.trackerSettings['ALLOW_TRACK_SPLITTING'] = False settings.trackerSettings['ALLOW_TRACK_MERGING'] = False # Add the analyzers for some spot features. settings.addAllAnalyzers() # We configure the initial filtering to discard spots # with a quality lower than 1. settings.initialSpotFilterValue = 5.0 #------------------- # Instantiate plugin #------------------- trackmate = TrackMate(model, settings) #-------- # Process #-------- ok = trackmate.checkInput() if not ok: sys.exit(str(trackmate.getErrorMessage())) ok = trackmate.process() if not ok: sys.exit(str(trackmate.getErrorMessage())) #---------------- # Display results #---------------- model.getLogger().log('Found ' + str(model.getTrackModel().nTracks(True)) + ' tracks.') # A selection. sm = SelectionModel( model ) # Read the default display settings. ds = DisplaySettingsIO.readUserDefault() # The viewer. displayer = HyperStackDisplayer( model, sm, imp, ds ) displayer.render() # The feature model, that stores edge and track features. fm = model.getFeatureModel() # Iterate over all the tracks that are visible. for id in model.getTrackModel().trackIDs(True): # Fetch the track feature from the feature model. v = fm.getTrackFeature(id, 'TRACK_MEAN_SPEED') model.getLogger().log('') model.getLogger().log('Track ' + str(id) + ': mean velocity = ' + str(v) + ' ' + model.getSpaceUnits() + '/' + model.getTimeUnits()) #------------------------ # Save results as XML #------------------------ # Save the tracks only XML tracks_xml_path = join(directory, "exportTracks.xml") tracks_out_file = File(tracks_xml_path) ExportTracksToXML.export(model, settings, tracks_out_file) # Save the full TrackMate model XML model_xml_path = join(directory, "exportModel.xml") model_out_file = File(model_xml_path) writer = TmXmlWriter(model_out_file) writer.appendModel(model) writer.appendSettings(settings) writer.writeToFile() print("Tracks XML saved to: {}".format(tracks_xml_path)) print("Model XML saved to: {}".format(model_xml_path))
你的脚本核心问题出在初始斑点过滤阈值设置过高,以及TrackMate轨迹生成的前置条件上,以下是具体修正点:
降低初始斑点过滤阈值
你设置的settings.initialSpotFilterValue = 5.0远高于GUI中使用的有效阈值,会直接过滤掉大量符合条件的斑点,导致后续没有足够的斑点来连接成轨迹。建议改成和GUI一致的值,比如:settings.initialSpotFilterValue = 1.0若不确定具体数值,可先注释掉这行代码禁用初始过滤,验证轨迹是否能生成后再逐步调整。
对齐Tracker参数与GUI设置
确认LINKING_MAX_DISTANCE、GAP_CLOSING_MAX_DISTANCE等Tracker参数,和你手动操作GUI时输入的数值完全一致,参数偏差会直接导致轨迹无法生成。增加调试日志排查
在trackmate.process()执行后,添加日志查看斑点和轨迹的基础数据,确认问题环节:# 新增调试日志 model.getLogger().log('检测到的有效斑点总数: ' + str(model.getSpots().getNSpots(True))) track_ids = model.getTrackModel().trackIDs(True) model.getLogger().log('可见轨迹数量: ' + str(len(track_ids)))若斑点数量极少或为0,说明过滤环节存在问题;若斑点数量正常但轨迹为0,则需检查Tracker参数。
修正后关键代码片段示例
# 调整初始斑点过滤阈值为GUI有效数值 settings.initialSpotFilterValue = 1.0 # ... 原有代码 ... ok = trackmate.process() if not ok: sys.exit(str(trackmate.getErrorMessage())) # 新增调试日志 model.getLogger().log('检测到的有效斑点总数: ' + str(model.getSpots().getNSpots(True))) track_ids = model.getTrackModel().trackIDs(True) model.getLogger().log('可见轨迹数量: ' + str(len(track_ids)))
内容的提问来源于stack exchange,提问作者Natasha Sharma

