MATLAB Answers

複数のスライ​ス画像​を三次元表示した際の​細かい側面の形状を表​示したい

19 views (last 30 days)
初めまして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; % 等値断面の表示
宜しくお願いします。

Accepted Answer

Hiroyuki Hishida
Hiroyuki Hishida on 17 Dec 2019
こんにちは。
CT画像からの等値面作成してSTLが欲しいのであれば、isosurfaceである程度のものは作れると思います。一般に、骨は他の場所よりも輝度値は高いので、isovalueを10などではなく、もっとあげていただければそこそこの結果は得られると思います。
もう少しきれいなのが作りたい場合は、例えば元のDicom画像に対して画像処理を行い、位置的に明らかに背骨ではない部分を予め消去してしまうことでしょうか。CT画像の場合、直径500ピクセルくらいの円みたいなのがうつりこみ、isosurfaceしてもこれが残ることはしばしばあります。なので、例えば各スライス画像に対して、画像中心を中心とする直径500ピクセルの円の内側だけを残すようなマスク処理を行ったうえで、isosurfaceで等値面を生成する、というアプローチです。
一方、骨が折れる作業ではありますが、さきほどのラベラーなどを使って気合で乗り切るのも良いと思います。
なお、添付いただきましたペーパーでは光学式形状測定器を使っているようで、計測データは点群で得られます。そして点群面貼りのテクニックはCT画像からのそれとは若干異なり、陽的な手法および陰的な手法が提唱されております。弊社外ですがこのあたりをごらんください。
菱田
  2 Comments
Hiroyuki Hishida
Hiroyuki Hishida on 18 Dec 2019
はい、がんばってみてくださいませ。

Sign in to comment.

More Answers (2)

Hiroyuki Hishida
Hiroyuki Hishida on 16 Dec 2019
こんにちは。
例えば人間の腹部の三次元CT画像があって、そこから背骨の表面だけを取り出したいということですか?
だとしてですがお困りなのは、そんなナイスな等値面が生成できないということでしょうか?そうではなくvisualization の話であって、等値面の外側を消したいということでしょうか?
菱田
  1 Comment
virgo kk
virgo kk on 17 Dec 2019
有難うございます。
今直面している問題は、おっしゃった2点なのですが、
ここでは、Visualizationの話です。

Sign in to comment.


Hiroyuki Hishida
Hiroyuki Hishida on 17 Dec 2019
こんにちは。
私の書き方がまずく誤解を与えたようですが、おおよその状況がつかめました。
何かしら関数を使うと3次元CT画像の任意の領域だけを抽出でき、、、というものは、世の中的に存在しません。したがって、処理を考えて頂く必要があります。確実な方法はイメージラベラーなどを使って手動でセグメンテーションすることです。ピン角保存を諦めてよいのであれば、個人的にはグラフカットを使うとそれなりに良い結果が得られたように思います。が、この論文の方法を使いたい、この教科書の方法を使いたい、あるいは、こうしたいというのを提示いただけませんか?
なお、「等値面からボリュームデータを作りました」と書かれておりますが、「ボリュームデータから等値面生成した」ように見えます。「等値面からボリュームデータを作る」とは、STLなどの表面だけの情報からラスタライズするなどして3次元画像に変換する操作になります。
菱田
  1 Comment
virgo kk
virgo kk on 17 Dec 2019
回答有難うございます。
イメージラベル、グラフカットについては知識がないため調べてみます。
下のpdfの評価の考え方を参考にしています。
ここでは顔面について行っていますが、自分は背骨に対して行おうと考えています。そのために背骨の形状を示したいというバックボーンがあります。
もし差支えなければ別件ではありますが、等値面の作成について助言頂けると幸いです。

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!