MXファイル化と3DAce
Neuromagのデータを他の3Dツールで使いたいと思い、HSP仕様のMXファイルに変換する関数Mファイルを作りました。
hns_MXfiler.m
四角メッシュもしくは三角メッシュに対応しています。4(四角)x3(x,y,z座標)xN(メッシュの個数)という3次元配列にしておきます。
使ってみましょう。
[filename,pathname]=uigetfile('*.mat');% 脳磁図データファイルの指定
load(strcat(pathname,filename));%ファイル読み込み
if size(ChInform,2)>=306;ch=1:3:306;else ch=1:2:203;end;% 脳磁図のチャンネル数
w=0.014;% センサーの幅の半分
P=ChInform(1:3,ch);X=w*ChInform(4:6,ch);Y=w*ChInform(7:9,ch);
V=zeros(4,3,102);V(1,:,:)=P+X+Y;V(2,:,:)=P-X+Y;V(3,:,:)=P-X-Y;V(4,:,:)=P+X-Y;
hns_MXfiler(V);%MXファイルに変換
VectorView.mxというファイル名で保存してみました。
MXファイルは、あまり一般的ではありませんが、
西尾秀規さんが公開しているフリーウェア
3DAceを使って、開いてみます。

拡大しました。

3DAceを使うとXファイル、DXFファイル、など他の3D形式のファイル形式に変換できます。
MQOファイルで保存して、フリーウェア版Metasequoia LEで開きました。

OBJファイルで保存して、e-forntier社製のShadeで開きました。

Dewar面もMXファイルにしてみました。
load
'Dewar.mat' % Dewar.matの読み込み
N=size(VectorView.triangle,2);
V=zeros(3,3,N);
V(:,1,:)=reshape(VectorView.nodes(1,VectorView.triangle),[3,1,N]);
V(:,2,:)=reshape(VectorView.nodes(2,VectorView.triangle),[3,1,N]);
V(:,3,:)=reshape(VectorView.nodes(3,VectorView.triangle),[3,1,N]);
hns_MXfiler(V);
3DAceで開きました。

MESHファイルをMATファイルに変換したファイルもMXファイルに変換してみます。
[filename,pathname]=uigetfile('*mesh.mat');
load(strcat(pathname,filename));
N=size(triangle,2);
V=zeros(3,3,N);
V(:,1,:)=reshape(NodesPts(1,triangle),[3,1,N]);
V(:,2,:)=reshape(NodesPts(2,triangle),[3,1,N]);
V(:,3,:)=reshape(NodesPts(3,triangle),[3,1,N]);
hns_MXfiler(V);
3DAceで開きました。小脳を外して脳底部を見たところです。

256×256×183の立方体voxelからなるint16のAnalyzeフォーマットもMXファイルにしてみます。
[filename,pathname]=uigetfile('*.img');
fid=fopen(strcat(pathname,filename),'rb');
W=fread(fid,inf,'*int16');
fclose(fid);
W=reshape(W,[256,256,183]);
scale=2;% データが大きすぎるので半分にする
W=reducevolume(W,[1,1,1]*scale);
threshold=50;%閾値面の設定
W(W<threshold)=0;W(W>0)=1;
FV=isosurface(W,0.9);%等値面の検出
p=patch(FV);%figureが出ます。
N=10000;% ポリゴンの数を10000個とする
reducepatch(p,N);% ポリゴンメッシュのデー間引き
N=size(get(p,'XData'),2);% 何故かN-1になることあり
V=zeros(3,3,N);
V(:,1,:)=reshape(get(p,'XData'),[3,1,N]);
V(:,2,:)=reshape(get(p,'YData'),[3,1,N]);
V(:,3,:)=reshape(get(p,'ZData'),[3,1,N]);
V=V*scale;
hns_MXfiler(V);

MXファイルはあまり大きなメッシュは使えないようです(1万個くらい?)
MRIcroで脳を切り出したAnalyzeファイルで試してみました。
