ボリュームデータから骨のモデル化を行う方法.
12 views (last 30 days)
Show older comments
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 Comments
Accepted Answer
Hiroyuki Hishida
on 16 Feb 2020
こんにちは
良い方向に向かわれているように見えますし、間違えてもいないと思います。ただ、画像に対して閾値処理(等値面生成も基本はこれ)することについて、少し確認されれば良いようには思います。
医療用のCTの場合、測定データは、空気の輝度値が-1000、水の輝度値が0になるよう、校正されてから画像になるのが基本です。これをハンスフィールドユニットと言います。こうすることのご利益の一つに、部位ごとにおよその輝度値(CT値)が定まることがあります。
画像を加工する人からすると面倒なこととして、画素のビット数がケースバイケースだということがあります。これについては、読みこんだdicomでご確認ください。今回の画素は何ビットになってるでしょうか?だとすると、ハンスフィールドユニットの考えはそのまま使えるのか、何か処理をしないといけないかがわかると思います。
骨の輝度値については、ハンスフィールドユニットについて調べていただくとして、実はそんなことを知らなくても、ヒストグラムからわかったりもします。 グレースケール画像の場合、ほとんどの場合、黒い部分の輝度値(画素値)は低く、白い部分の画素値は高いです。CT画素において骨は白いことを考えると、閾値はどうすれば良いでしょうか?
そもそも、画像の閾値処理って?という場合は、MATLAB 画像 閾値処理でググってみてください。ヒントが見つかると思います。
CTについての文書はたくさんありますが、例えば以下などをもとに、CT画像はそもそもなんなのかということを確認されると、良いかもしれません。 http://www.fujita-hu.ac.jp/~tsujioka/education/ct-study.pdf
なお、CTと混同されることの多いMRIは、また別の物理現象をみていますのので、ご注意ください。
頑張ってみてくださいませ。 菱田
More Answers (1)
Hiroyuki Hishida
on 14 Feb 2020
こんにちは。
どういうデータを読み込んでいるかわかりませんが、閾値の選び方の問題のように感じます。
簡単のために、骨が写っているスライス画像を1枚読み込んでみて、その画像データを histogram で輝度値の分布をみてみるのはいかがでしょうか?真っ白になっている部分≒骨の部分 とみなせると思いますので、その輝度値を確認して、isosurface を作られると良いかと思います。
もしくはですが、お使いのMATLAB のバージョンは不明ですが、volumeViewer で3次元画像を読み込み、表示方法を工夫してみるのも一つの手かと思われます。
いかがでしょうか?
菱田
See Also
Categories
Find more on Scalar Volume Data 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!