ボリュームデータから骨のモデル化を行う方法.
8 ビュー (過去 30 日間)
古いコメントを表示
matlab環境内で,100枚のdicom画像 二次元の骨のスライス画像(グレースケール画像)512*512を使用して,以下のモデルを作成しようとしています
自分が行ったことは,二次元スライス画像のスタックを行い,ボリュームデータを作成し,等値面を生成した後、三次元表示を行いました。しかし,望んでいるモデルとはかけ離れたものが出力され,手も足もでない状況です.どうすれば上図のように出力が可能になるのでしょうか?ご教授していただけると幸いです.宜しくお願いします.
以下に,作成したプログラムと,出力結果を以下に示します.
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,100)%任意の輝度の値で等値面を作成
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 件のコメント
採用された回答
Hiroyuki Hishida
2020 年 2 月 16 日
こんにちは
良い方向に向かわれているように見えますし、間違えてもいないと思います。ただ、画像に対して閾値処理(等値面生成も基本はこれ)することについて、少し確認されれば良いようには思います。
医療用のCTの場合、測定データは、空気の輝度値が-1000、水の輝度値が0になるよう、校正されてから画像になるのが基本です。これをハンスフィールドユニットと言います。こうすることのご利益の一つに、部位ごとにおよその輝度値(CT値)が定まることがあります。
画像を加工する人からすると面倒なこととして、画素のビット数がケースバイケースだということがあります。これについては、読みこんだdicomでご確認ください。今回の画素は何ビットになってるでしょうか?だとすると、ハンスフィールドユニットの考えはそのまま使えるのか、何か処理をしないといけないかがわかると思います。
骨の輝度値については、ハンスフィールドユニットについて調べていただくとして、実はそんなことを知らなくても、ヒストグラムからわかったりもします。 グレースケール画像の場合、ほとんどの場合、黒い部分の輝度値(画素値)は低く、白い部分の画素値は高いです。CT画素において骨は白いことを考えると、閾値はどうすれば良いでしょうか?
そもそも、画像の閾値処理って?という場合は、MATLAB 画像 閾値処理でググってみてください。ヒントが見つかると思います。
CTについての文書はたくさんありますが、例えば以下などをもとに、CT画像はそもそもなんなのかということを確認されると、良いかもしれません。 http://www.fujita-hu.ac.jp/~tsujioka/education/ct-study.pdf
なお、CTと混同されることの多いMRIは、また別の物理現象をみていますのので、ご注意ください。
頑張ってみてくださいませ。 菱田
その他の回答 (1 件)
Hiroyuki Hishida
2020 年 2 月 14 日
こんにちは。
どういうデータを読み込んでいるかわかりませんが、閾値の選び方の問題のように感じます。
簡単のために、骨が写っているスライス画像を1枚読み込んでみて、その画像データを histogram で輝度値の分布をみてみるのはいかがでしょうか?真っ白になっている部分≒骨の部分 とみなせると思いますので、その輝度値を確認して、isosurface を作られると良いかと思います。
もしくはですが、お使いのMATLAB のバージョンは不明ですが、volumeViewer で3次元画像を読み込み、表示方法を工夫してみるのも一つの手かと思われます。
いかがでしょうか?
菱田
参考
カテゴリ
Help Center および File Exchange で 3 次元ボリューム イメージの処理 についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!