複数のスライス画像を三次元表示した際の細かい側面の形状を表示したい
7 views (last 30 days)
Show older comments
virgo kk
on 16 Dec 2019
Commented: Hiroyuki Hishida
on 18 Dec 2019
初めましてMatlabを利用している者です。
slice画像複数枚(dicom形式512*512glayscale)から三次元表示を行いました。
方法は3次元行列にした上で、等値面からボリュームデータを作りました。
等値断面を表示させることで全体の形状は知ることが可能になりました。
評価として四角形で囲んだ部分円柱のようになっているのですが、この部分の側面のみの形状のみを表示することは可能でしょうか?
現在のコードを下に示します
clear; clc; close all; % 初期化
fileFolder = fullfile(pwd); % 画像の読込み (指定枚数の断面画像)
dcmFiles = dir(fullfile(fileFolder,'*.dcm'));
numfiles = length(dcmFiles);
dcm = dicomread(dcmFiles(1).name);
grayscale = zeros(size(dcm,1),size(dcm,2),numfiles);
for k = 2:numfiles
grayscale(:,:,k) = dicomread(dcmFiles(k).name);
end
data = cast(grayscale,'uint8');
vol = isosurface(data, 10)
figure;
patch(vol, 'FaceColor','red', 'EdgeColor','none');
view(-40,24) % 視点の位置
daspect([1 1 0.3]) % X,Y,Z方向のアスペクト比の設定
colormap(gray); box on; camlight; lighting gouraud; % 照明等各種設定
sec = isocaps(data, 5); % 等値断面(等値面を作ったときの端の切断面)の頂点・面・輝度を求める
patch(sec, 'FaceColor','interp', 'EdgeColor','none'); shg; % 等値断面の表示
宜しくお願いします。
0 Comments
Accepted Answer
Hiroyuki Hishida
on 17 Dec 2019
こんにちは。
CT画像からの等値面作成してSTLが欲しいのであれば、isosurfaceである程度のものは作れると思います。一般に、骨は他の場所よりも輝度値は高いので、isovalueを10などではなく、もっとあげていただければそこそこの結果は得られると思います。
もう少しきれいなのが作りたい場合は、例えば元のDicom画像に対して画像処理を行い、位置的に明らかに背骨ではない部分を予め消去してしまうことでしょうか。CT画像の場合、直径500ピクセルくらいの円みたいなのがうつりこみ、isosurfaceしてもこれが残ることはしばしばあります。なので、例えば各スライス画像に対して、画像中心を中心とする直径500ピクセルの円の内側だけを残すようなマスク処理を行ったうえで、isosurfaceで等値面を生成する、というアプローチです。
一方、骨が折れる作業ではありますが、さきほどのラベラーなどを使って気合で乗り切るのも良いと思います。
なお、添付いただきましたペーパーでは光学式形状測定器を使っているようで、計測データは点群で得られます。そして点群面貼りのテクニックはCT画像からのそれとは若干異なり、陽的な手法および陰的な手法が提唱されております。弊社外ですがこのあたりをごらんください。
菱田
2 Comments
More Answers (2)
Hiroyuki Hishida
on 16 Dec 2019
こんにちは。
例えば人間の腹部の三次元CT画像があって、そこから背骨の表面だけを取り出したいということですか?
だとしてですがお困りなのは、そんなナイスな等値面が生成できないということでしょうか?そうではなくvisualization の話であって、等値面の外側を消したいということでしょうか?
菱田
Hiroyuki Hishida
on 17 Dec 2019
こんにちは。
私の書き方がまずく誤解を与えたようですが、おおよその状況がつかめました。
何かしら関数を使うと3次元CT画像の任意の領域だけを抽出でき、、、というものは、世の中的に存在しません。したがって、処理を考えて頂く必要があります。確実な方法はイメージラベラーなどを使って手動でセグメンテーションすることです。ピン角保存を諦めてよいのであれば、個人的にはグラフカットを使うとそれなりに良い結果が得られたように思います。が、この論文の方法を使いたい、この教科書の方法を使いたい、あるいは、こうしたいというのを提示いただけませんか?
なお、「等値面からボリュームデータを作りました」と書かれておりますが、「ボリュームデータから等値面生成した」ように見えます。「等値面からボリュームデータを作る」とは、STLなどの表面だけの情報からラスタライズするなどして3次元画像に変換する操作になります。
菱田
See Also
Categories
Find more on ライティング、透明度、およびシェーディング in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!