ボリュームデータから骨のモデル化を行う方法.

8 ビュー (過去 30 日間)
virgo kk
virgo kk 2020 年 2 月 14 日
コメント済み: virgo kk 2020 年 2 月 17 日
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; % 等値断面の表示

採用された回答

Hiroyuki Hishida
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 件のコメント
virgo kk
virgo kk 2020 年 2 月 17 日
有難うございます。勉強してみます。

サインインしてコメントする。

その他の回答 (1 件)

Hiroyuki Hishida
Hiroyuki Hishida 2020 年 2 月 14 日
こんにちは。
どういうデータを読み込んでいるかわかりませんが、閾値の選び方の問題のように感じます。
簡単のために、骨が写っているスライス画像を1枚読み込んでみて、その画像データを histogram で輝度値の分布をみてみるのはいかがでしょうか?真っ白になっている部分≒骨の部分 とみなせると思いますので、その輝度値を確認して、isosurface を作られると良いかと思います。
もしくはですが、お使いのMATLAB のバージョンは不明ですが、volumeViewer で3次元画像を読み込み、表示方法を工夫してみるのも一つの手かと思われます。
いかがでしょうか?
菱田  
  2 件のコメント
virgo kk
virgo kk 2020 年 2 月 15 日
回答有難うございます.
一枚の画像に対して,ヒストグラムで輝度値の確認
作成した三次元画像をVolumeViewerで表示をさせてみます
ver2017bですので可能だと思います.取り掛かってみます。
virgo kk
virgo kk 2020 年 2 月 15 日
まず読み込んだスライス画像を添付します。
一枚の画像に対してヒストグラムを表示しました。
この場合適切な輝度値というのは,3*10^4でよろしいでしょうか?
また,画像の読み込み時のデータの扱いが適切でないでしょうか?
下にワークスペースの画像を示します
宜しくお願いします

サインインしてコメントする。

カテゴリ

Help Center および File Exchange3 次元ボリューム イメージの処理 についてさらに検索

Community Treasure Hunt

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

Start Hunting!