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

8 views (last 30 days)
virgo kk
virgo kk on 14 Feb 2020
Commented: virgo kk on 17 Feb 2020
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; % 等値断面の表示

Accepted Answer

Hiroyuki Hishida
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は、また別の物理現象をみていますのので、ご注意ください。
頑張ってみてくださいませ。 菱田
  1 Comment
virgo kk
virgo kk on 17 Feb 2020
有難うございます。勉強してみます。

Sign in to comment.

More Answers (1)

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

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!