当前位置: 首页 > news >正文

可视化swc文件

https://blog.csdn.net/bigdudu/article/details/143231801

这个文章很好,说下补充.

什么是 Soma

在神经科学和 SWC 格式中,Soma(胞体 / 细胞体) 是神经元的核心部分,也是整个神经元结构的 “根节点”—— 它是神经元的代谢和信号整合中心,包含细胞核和大部分细胞器,所有轴突、树突都从胞体延伸而出。

Soma 在 SWC 文件中的具体体现

SWC 文件通过节点类型(Type)字段 明确标识 Soma,同时有固定的格式规则:

  1. 类型编码
    SWC 标准中,Type 字段的数值 1 专门代表 Soma(胞体),其他类型对应神经元的不同分支:
    Type 值 含义
    1 Soma(胞体)
    2 Axon(轴突)
    3 Dendrite(主树突)
    4 Apical dendrite(顶树突)
    5+ 自定义 / 未知类型
  2. 结构规则
    Soma 是神经元的根节点,其 父节点ID(Parent ID) 固定为 -1(表示无父节点);
    一个完整的神经元 SWC 文件中,有且仅有一个 Soma 根节点(ID 通常为 1),所有其他节点(轴突、树突)的父节点最终都会追溯到这个 Soma 节点;
    Soma 节点的 x/y/z 坐标是神经元的空间中心位置,radius(半径)通常大于其他节点(代表胞体的物理尺寸)。

特殊情况:多节点描述的 Soma

部分 SWC 文件会用多个 Type=1 的节点 拟合 Soma 的球形 / 椭球形轮廓(而非单个点):
plaintext
1 1 10.0 15.0 8.0 5.0 -1 # 核心Soma节点
2 1 10.5 15.0 8.0 5.0 1 # Soma轮廓节点1
3 1 9.5 15.0 8.0 5.0 1 # Soma轮廓节点2
4 1 10.0 15.5 8.0 5.0 1 # Soma轮廓节点3
这类文件中,所有 Type=1 的节点都属于 Soma 结构,且第一个 Type=1 节点仍是根节点(Parent=-1)。

要注意这个特殊情况. 有的情况下会认为多个soma是非法的导致报错.

More than one node found that is tagged “soma” in skeleton xxxx
导出时出现了这个问题,所以选择了mark root nodes as soma

可视化的代码, 用的plotly, 但效率并不高.5000个连线的情况下转动视角都费劲,很奇怪它的散点图大数据量效率很高. 结论不如用游戏引擎

importpandasaspdimportnumpyasnpimportplotly.graph_objectsasgodefread_swc_file(file_path):""" 读取并解析 SWC 文件 :param file_path: SWC 文件路径 :return: 包含节点数据的 DataFrame,节点连接列表 """# 定义 SWC 文件列名columns=['id','type','x','y','z','radius','parent_id']# 读取文件(跳过注释行,注释行以#开头)swc_data=[]withopen(file_path,'r',encoding='utf-8')asf:forlineinf:line=line.strip()ifnotlineorline.startswith('#'):continue# 分割每行数据并转换为数值类型parts=line.split()parts=[float(p)ifinotin[1,6]elseint(p)fori,pinenumerate(parts)]swc_data.append(parts)# 转为 DataFramedf=pd.DataFrame(swc_data,columns=columns)# 修正父节点ID(SWC中父节点ID为-1表示根节点)df['parent_id']=df['parent_id'].replace(-1,0)# 构建节点连接关系(子节点ID -> 父节点坐标)connections=[]id_to_coords=df.set_index('id')[['x','y','z']].to_dict('index')for_,rowindf.iterrows():node_id=row['id']parent_id=row['parent_id']ifparent_id==0orparent_idnotinid_to_coords:continue# 根节点无父节点,跳过# 获取子节点和父节点的坐标child_coords=(row['x'],row['y'],row['z'])parent_coords=id_to_coords[parent_id]parent_coords=(parent_coords['x'],parent_coords['y'],parent_coords['z'])connections.append((child_coords,parent_coords))returndf,connectionsdefplot_neuron_3d(df,connections,title="神经元3D结构可视化"):""" 使用 Plotly 绘制神经元的3D结构 :param df: 节点数据 DataFrame :param connections: 节点连接列表 :param title: 图表标题 """# 创建绘图对象fig=go.Figure()# 1. 添加神经元节点(散点)fig.add_trace(go.Scatter3d(x=df['x'],y=df['y'],z=df['z'],mode='markers',marker=dict(size=df['radius']*0.05,# 按半径缩放节点大小color=df['type'],# 按神经元类型着色colorscale='Viridis',opacity=0.8),name='神经元节点',hovertext=df.apply(lambdarow:f"ID:{row['id']}<br>类型:{row['type']}<br>坐标: ({row['x']:.2f},{row['y']:.2f},{row['z']:.2f})",axis=1)))# 2. 添加神经元连接线条forchild,parentinconnections:# 每条连线需要两个点(父节点 -> 子节点)x_line=[parent[0],child[0]]y_line=[parent[1],child[1]]z_line=[parent[2],child[2]]fig.add_trace(go.Scatter3d(x=x_line,y=y_line,z=z_line,mode='lines',line=dict(color='#666666',width=1),name='连接线条',showlegend=False# 线条不显示在图例中))# 设置图表布局fig.update_layout(title=title,scene=dict(xaxis_title='X 坐标 (μm)',yaxis_title='Y 坐标 (μm)',zaxis_title='Z 坐标 (μm)',aspectmode='data'# 按数据比例显示坐标轴),legend=dict(title='神经元类型',orientation='h',yanchor='bottom',y=1.02,xanchor='right',x=1))# 显示图表(也可保存为html文件:fig.write_html("neuron_3d.html"))fig.show()# 主函数:调用示例if__name__=="__main__":swc_file_path="neuron_data.swc"try:# 读取SWC文件neuron_df,neuron_connections=read_swc_file(swc_file_path)print(f"成功解析SWC文件:共{len(neuron_df)}个节点,{len(neuron_connections)}条连接")# 绘制3D可视化图plot_neuron_3d(neuron_df,neuron_connections)exceptFileNotFoundError:print(f"错误:未找到文件{swc_file_path},请检查文件路径是否正确")exceptExceptionase:print(f"解析/绘图出错:{str(e)}")
http://www.jsqmd.com/news/244045/

相关文章:

  • ‌别再逼测试学Python了!2026年,低代码才是主流
  • Matlab 基于迁移学习的滚动轴承故障诊断 1.运行环境Matlab2021b及以上
  • 基于单片机汽车尾灯控制系统设计
  • Python和Java哪个更好就业?
  • 全网最全8个一键生成论文工具,本科生搞定毕业论文!
  • 基于单片机汽车倒车防撞报警电路设计
  • 中国邮政Java面试被问:Kafka的Log Compaction实现和删除策略
  • 基于单片机热敏PT100温度采集系统设计
  • 四大GIS框架坐标系详解
  • 2026 年最值得普通人死磕的3个AI赛道
  • 深入理解 C++ 的 lvalue / xvalue / prvalue 及 decltype 推导规则
  • 安防设备的网络安全实战指南:常见网络攻击手法剖析与防范技术演进
  • 滚球老鼠标编码器识别上下左右移动方向的原理
  • 滚球老鼠标编码器识别上下左右移动方向的原理2
  • 构建企业级安全防御架构:网络安全防范核心技术盘点与实施要点解析
  • 基于单片机无线公交车人数统计装置系统设计
  • 网络安全从入门到精通:核心领域深度剖析与实战技术指南
  • 滚球老鼠标DIY改造成游戏光枪完整方案
  • 基于单片机智能自动加料机控制系统设计
  • 基于单片机智能红外遥控密码锁系统设计
  • 网络安全从入门到精通:核心定义、技术全景与防御体系构建指南
  • 一文搞定网络安全:核心概念、技术分类与实战防范清单(建议收藏)
  • 2026年面试必问的Java面试八股文及答案整理(全面覆盖·精选优质·高效直击)
  • 网络安全检测实战指南:核心方法、工具应用与在渗透测试/安全运维中的实践
  • 6004BZ10300处理器模块
  • 基于Arduino的温湿度pm2.5wifi联网设计
  • 滚珠丝杠厂家排名靠前品牌,产品负载与寿命表现怎么样
  • 网络安全全景解读:从基础概念到防范技术,聚焦安防设备风险与防御(建议收藏)
  • 6002BZ10200内存板
  • 网络安全核心技术与风险防范关键点深度解析:一文厘清主流方案与实践