IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 大日本印刷株式会社の特許一覧

<>
  • 特許-ボリュームレンダリング装置 図1
  • 特許-ボリュームレンダリング装置 図2
  • 特許-ボリュームレンダリング装置 図3
  • 特許-ボリュームレンダリング装置 図4
  • 特許-ボリュームレンダリング装置 図5
  • 特許-ボリュームレンダリング装置 図6
  • 特許-ボリュームレンダリング装置 図7
  • 特許-ボリュームレンダリング装置 図8
  • 特許-ボリュームレンダリング装置 図9
  • 特許-ボリュームレンダリング装置 図10
  • 特許-ボリュームレンダリング装置 図11
  • 特許-ボリュームレンダリング装置 図12
  • 特許-ボリュームレンダリング装置 図13
  • 特許-ボリュームレンダリング装置 図14
  • 特許-ボリュームレンダリング装置 図15
  • 特許-ボリュームレンダリング装置 図16
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-10-31
(45)【発行日】2022-11-09
(54)【発明の名称】ボリュームレンダリング装置
(51)【国際特許分類】
   G06T 15/08 20110101AFI20221101BHJP
【FI】
G06T15/08
【請求項の数】 16
(21)【出願番号】P 2018239791
(22)【出願日】2018-12-21
(65)【公開番号】P2020102004
(43)【公開日】2020-07-02
【審査請求日】2021-10-25
(73)【特許権者】
【識別番号】000002897
【氏名又は名称】大日本印刷株式会社
(74)【代理人】
【識別番号】100122529
【弁理士】
【氏名又は名称】藤枡 裕実
(74)【代理人】
【識別番号】100135954
【弁理士】
【氏名又は名称】深町 圭子
(74)【代理人】
【識別番号】100119057
【弁理士】
【氏名又は名称】伊藤 英生
(74)【代理人】
【識別番号】100131369
【弁理士】
【氏名又は名称】後藤 直樹
(74)【代理人】
【識別番号】100171859
【弁理士】
【氏名又は名称】立石 英之
(72)【発明者】
【氏名】茂出木 敏雄
【審査官】村松 貴士
(56)【参考文献】
【文献】特開2006-107093(JP,A)
【文献】特開2009-160306(JP,A)
【文献】特開平11-175743(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06T 15/08
(57)【特許請求の範囲】
【請求項1】
所定の対象物について所定の間隔で撮影された複数の2次元の断層画像で構成されるボクセル画像に基づいて、信号値に対して色成分の値と不透明度を対応付けて定義されたカラーマップを参照してレンダリング画像を生成するためのボリュームレンダリング装置であって、
前記ボクセル画像と前記カラーマップを用いてレンダリング画像を生成するレンダリング手段を備え、
前記レンダリング手段は、前記レンダリング画像の各画素において、前記ボクセル画像に対して所定の座標変換を行いながら前記ボクセル画像の複数のボクセルを参照し、参照する各ボクセルに対して、前記カラーマップを参照しながら当該ボクセルの色成分および不透明度を取得するとともに、当該ボクセルの複数の近傍のボクセルの不透明度を取得するレイキャスティング手段と、
前記レイキャスティング手段により取得された当該ボクセルの複数の近傍のボクセルの不透明度を基に当該ボクセルにおける勾配ベクトルを算出するとともに、算出された勾配ベクトルに対する所定の光源ベクトルの正反射ベクトルを算出し、前記勾配ベクトルと前記光源ベクトルとの内積値を基に当該ボクセルの拡散反射光を算出し、前記正反射ベクトルと所定の視線ベクトルとの内積値を基に当該ボクセルの鏡面反射光を算出し、算出された拡散反射光と鏡面反射光を基に算出した陰影値を前記レイキャスティング手段により取得された当該ボクセルの色成分に乗算し、当該ボクセルの色成分を更新する陰影付加手段と、を有するボリュームレンダリング装置。
【請求項2】
前記所定の光源ベクトルは、あらかじめ定義された光源ベクトルに対して前記所定の座標変換における回転処理を行ったものであり、前記所定の視線ベクトルは、あらかじめ定義された視線ベクトルに対して前記所定の座標変換における回転処理を行ったものである請求項1に記載のボリュームレンダリング装置。
【請求項3】
前記回転処理は、
所定の3次元座標系における回転を定義した3×3行列を用いて、前記あらかじめ定義された光源ベクトルまたは前記あらかじめ定義された視線ベクトルに対して回転処理を行う請求項2に記載のボリュームレンダリング装置。
【請求項4】
前記ボクセル画像のxy軸方向の解像度をRxy、z軸方向の解像度をRzとすると、
前記陰影付加手段は、
当該ボクセルに対してx軸方向に+1ボクセルおよび-1ボクセルずれたボクセルの不透明度の差分を前記勾配ベクトルのx軸方向成分とし、
当該ボクセルに対してy軸方向に+1ボクセルおよび-1ボクセルずれたボクセルの不透明度の差分を前記勾配ベクトルのy軸方向成分とし、
当該ボクセルに対してz軸方向に+1ボクセルおよび-1ボクセルずれたボクセルの不透明度の差分にRz/Rxyを乗じた値をを前記勾配ベクトルのz軸方向成分としている請求項1から請求項3のいずれか一項に記載のボリュームレンダリング装置。
【請求項5】
前記ボクセル画像のxy軸方向の解像度をRxy、z軸方向の解像度をRzとすると、
前記陰影付加手段は、
当該ボクセルに対してx軸方向に+1ボクセルおよび-1ボクセルずれたボクセルの不透明度の差分を前記勾配ベクトルのx軸方向成分とし、
当該ボクセルに対してy軸方向に+1ボクセルおよび-1ボクセルずれたボクセルの不透明度の差分を前記勾配ベクトルのy軸方向成分とし、
当該ボクセルに対して、z軸方向に+Rz/Rxyずれた座標の近傍の2つのボクセルの不透明度に所定の重みをかけて加算した不透明度と、z軸方向に-Rz/Rxyずれた座標の近傍の2つのボクセルの不透明度に所定の重みをかけて加算した不透明度との差分を前記勾配ベクトルのz軸方向成分としている請求項1から請求項3のいずれか一項に記載のボリュームレンダリング装置。
【請求項6】
前記陰影付加手段は、
あらかじめ所定の拡散反射係数,鏡面反射係数,鏡面光沢度,環境光を各々定義し、
前記正反射ベクトルは、前記勾配ベクトルとのなす角が前記光源ベクトルと前記勾配ベクトルとのなす角と同一になるように定義し、
前記勾配ベクトル、前記正反射ベクトル、前記光源ベクトル、前記視線ベクトルのいずれも単位ベクトルとするとき、
前記拡散反射光として、前記勾配ベクトルと前記光源ベクトルとの内積値に前記拡散反射係数を乗算した値とし、
前記鏡面反射光として、前記正反射ベクトルと前記視線ベクトルとの内積値に対して、前記鏡面光沢度で累乗した値に前記鏡面反射係数を乗算した値とし、
前記陰影値として、前記拡散反射光と前記鏡面反射光に前記環境光を加算した値としている請求項1から請求項5のいずれか一項に記載のボリュームレンダリング装置。
【請求項7】
前記レンダリング画像の生成領域をx軸方向にNB(NB>1)個の分割生成領域に分割し、
前記レンダリング手段は、NB個の互いに異なる分割生成領域に対して、NB個の互いに異なるプロセッサで同時に実行させることにより、NB個の分割画像で構成されるレンダリング画像を生成するようにしている請求項1から請求項6のいずれか一項に記載のボリュームレンダリング装置。
【請求項8】
前記各断層画像の各画素のうち、前記カラ-マップを参照して得られた不透明度が0でない画素が存在する領域に3次元の各軸方向において外接する領域である不透明外接領域を算出する不透明外接領域算出手段と、を更に有し、
前記レンダリング手段は、前記各断層画像のうち、前記不透明外接領域に対応する領域を有効領域として定義し、
前記レイキャスティング手段は、前記レンダリング画像の各画素において、前記有効領域と、視点に最も近い視線方向のベクトルとの交点を算出し、前記レンダリング画像の各画素において、前記算出される交点より前記ボクセル画像に対して視線方向に仮想光線を照射し、レイキャスティング法に基づいて所定の座標変換を行いながら前記ボクセル画像の複数のボクセルを参照する請求項1から請求項7のいずれか一項に記載のボリュームレンダリング装置。
【請求項9】
前記断層画像に対応して、0(表示しない)または1(表示する)の値をもつマスクデータが定義されている場合、
前記不透明外接領域算出手段は、更に前記マスクデータを参照して、前記マスクデータの値が1で、かつ前記不透明度が0でない画素を特定するようにしている請求項8に記載のボリュームレンダリング装置。
【請求項10】
前記不透明外接領域算出手段は、所定の分割数をNA(NA>1)として、各前記断層画像をNA個の断層画像群に分割し、NA個の各断層画像群に対して、前記不透明外接領域の一部を作成する処理を並行して実行する請求項8または請求項9に記載のボリュームレンダリング装置。
【請求項11】
2次元の前記各断層画像の1つ目の次元の最小の座標をXso、1つ目の次元の最大の座標をXeo、2つ目の次元の最小の座標をYso、2つ目の次元の最大の座標をYeo、第1番目の断層画像が配置されるz座標をZso、第M番目の断層画像が配置されるz座標をZeoとすると、Xso≦Xs<Xe≦Xeo、Yso≦Ys<Ye≦Yeo、Zso≦Zs<Ze≦Zeoを満たす、6つの座標Xs,Xe,Ys,Ye,Zs,Zeが定義されている場合、
前記不透明外接領域算出手段は、Xs以上Xe以下、Ys以上Ye以下、Zs以上Zeの範囲において前記不透明外接領域を算出する請求項8から請求項10のいずれか一項に記載のボリュームレンダリング装置。
【請求項12】
前記レイキャスティング手段は、前記ボクセル画像を前記レンダリング画像に投影変換した座標系を視点座標系とすると、視点座標系において視線方向であるz軸の上限値を、前記レンダリング画像の画素(x,y)ごとに前記算出された交点に対応するZcに設定し、
視点座標系のz軸上のZcから所定の下限値の範囲で仮想光線の照射を開始する起点座標Zoを探索する起点座標探索手段を備えている請求項8から請求項11のいずれか一項に記載のボリュームレンダリング装置。
【請求項13】
前記起点座標探索手段は、
前記視点座標系において、前記レンダリング画像の各画素(x,y)におけるz座標を探索開始座標Zstより前記下限値まで所定数ずつ変化させながら、前記視点座標系の3次元座標(x,y,z)ごとに前記所定の座標変換を行って対応する前記ボクセル画像のボクセルのボクセル値を順次取得し、最初に見つかった不透明なボクセルの視点座標系におけるz座標を、起点座標Zoとして探索するようにしている請求項12に記載のボリュームレンダリング装置。
【請求項14】
前記レイキャスティング手段は、
前記レンダリング画像の各画素(x,y)に対して、前記起点座標探索手段より探索された起点座標よりz軸に沿って下限値に向けて、所定の光強度をもつ仮想光線を照射する際、前記視点座標系の3次元座標(x,y,z)ごとに前記所定の座標変換を行って、対応する前記ボクセル画像のボクセルのボクセル値として前記カラーマップを参照しながら不透明度を取得し、取得された不透明度が0でない場合、ボクセル値として前記カラーマップを参照しながら色成分(RGB)を更に取得し、
前記陰影付加手段は、当該ボクセルの複数の近傍のボクセルの不透明度を基に算出した陰影値を取得した色成分に乗算することにより前記色成分を更新し、
前記レンダリング手段は、
当該ボクセルの不透明度を基に前記光強度を減衰させるとともに、当該ボクセルの不透明度及び前記更新された色成分および前記減衰させた光強度に基づいて累積輝度値を算出する処理を行い、算出された累積輝度値を基に、前記レンダリング画像の当該画素(x,y)に対応する画素値(RGB)として与えるようにしている請求項12に記載のボリュームレンダリング装置。
【請求項15】
所定の3次元座標系における回転を定義した3×3行列、xyz各軸方向のオフセット値および微小オフセット値、xyz各軸方向の拡大又は縮小倍率、z軸方向の変倍率を含む前記所定の座標変換のパラメータを取得し、
前記視点座標系の整数値の3次元座標(x,y,z)を、前記パラメータに基づいて前記ボクセル画像の座標系に変換を行って、前記ボクセル画像の実数値のボクセル座標を算出し、
算出した実数値のボクセル座標の近傍の複数の整数値のボクセル座標に対応する前記ボクセル画像の複数のボクセルを特定し、
特定した複数のボクセルの整数値のボクセル座標が前記有効領域に含まれる場合は、前記複数のボクセルの信号値を前記カラーマップを参照して色成分または不透明度に変換し、変換された色成分または不透明度の各々に所定の重みを掛けながら加算した値を、ボクセル値として色成分または不透明度を算出するようにしている請求項12から請求項14のいずれか一項に記載のボリュームレンダリング装置。
【請求項16】
請求項1から請求項15のいずれか一項に記載のボリュームレンダリング装置として、コンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、2次元の断層画像を複数枚用いて、3次元的に可視化するためのボリュームレンダリング技術に関する。
【背景技術】
【0002】
従来、CT、MRI、PETなど医療画像診断機器(モダリティ)により所定のスライス間隔で連続的に撮像され、DICOM形式等でPACS(Picture Archiving and Communication Systems)等の医療情報システムに保管されている複数の断層画像を基に、臓器等を3次元的に可視化することが行われている。
【0003】
一方、3Dコンピュータグラフィックス分野においては、所定の方向に仮想的な光源を設定し、陰影を付加して、より立体的に表現することが行われている(特許文献1~3参照)。特許文献1では、リアルな陰影を付与するため、ボクセルの不透明度の勾配を基に臓器領域の境界面を抽出し、境界面における法線ベクトルに基づいて境界面に陰影を付加する手法が提案されている。
【0004】
また、特許文献2では、各ボクセルの信号値の勾配からグラディエントを算出し、各ボクセルに直接陰影を付与する手法が提案されている。また、特許文献3では、各ボクセルの信号値の勾配からグラディエントを算出し、各ボクセルに直接陰影を付与する手法が提案されている。
【先行技術文献】
【特許文献】
【0005】
【文献】特許第5065740号公報
【文献】特許第3542799号公報
【文献】特許第2627607号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかしながら、特許文献1に記載の技術では、各ボクセルに直接陰影を付与する方法に比べ、陰影が境界面に限定して付与されるため、読影しやすい画像が得られるという利点があるが、計算負荷が大きく、鏡面反射をサポートできないという問題がある。また、特許文献2、3に記載の技術では、グラディエントの算出を不透明度で行わず、信号値で直接行っているため、カラーマップで陰影を制御できず、鏡面反射をサポートできないという問題がある。
【0007】
そこで、本開示は、複数の断層画像に対してカラーマップを適用して、レンダリング画像を生成する際、計算負荷を抑えつつ陰影を付与することが可能なボリュームレンダリング装置を提供することを課題とする。
【課題を解決するための手段】
【0008】
本開示は、上記課題を解決する手段を複数含んでいるが、その一例を挙げるならば、
所定の対象物について所定の間隔で撮影された複数の2次元の断層画像で構成されるボクセル画像に基づいて、信号値に対して色成分の値と不透明度を対応付けて定義されたカラーマップを参照してレンダリング画像を生成するためのボリュームレンダリング装置であって、
前記ボクセル画像と前記カラーマップを用いてレンダリング画像を生成するレンダリング手段と、を備え、
前記レンダリング手段は、前記レンダリング画像の各画素において、前記ボクセル画像に対して所定の座標変換を行いながら前記ボクセル画像の複数のボクセルを参照し、参照する各ボクセルに対して、前記カラーマップを参照しながら当該ボクセルの色成分および不透明度を取得するとともに、当該ボクセルの複数の近傍のボクセルの不透明度を取得するレイキャスティング手段と、
前記レイキャスティング手段により取得された当該ボクセルの複数の近傍のボクセルの不透明度を基に当該ボクセルにおける勾配ベクトルを算出するとともに、算出された勾配ベクトルに対する所定の光源ベクトルの正反射ベクトルを算出し、前記勾配ベクトルと前記光源ベクトルとの内積値を基に当該ボクセルの拡散反射光を算出し、前記正反射ベクトルと所定の視線ベクトルとの内積値を基に当該ボクセルの鏡面反射光を算出し、算出された拡散反射光と鏡面反射光を基に算出した陰影値を前記レイキャスティング手段により取得された当該ボクセルの色成分に乗算し、当該ボクセルの色成分を更新する陰影付加手段と、を有する。
【発明の効果】
【0009】
本開示によれば、複数の断層画像に対してカラーマップを適用して、レンダリング画像を生成する際、計算負荷を抑えつつ陰影を付与することが可能となる。
【図面の簡単な説明】
【0010】
図1】複数の断層画像と、ボリュームレンダリング像として生成されるカラーのレンダリング画像を示す図である。
図2】本開示の一実施形態に係るボリュームレンダリング装置100のハードウェア構成図である。
図3】本実施形態に係るボリュームレンダリング装置の構成を示す機能ブロック図である。
図4】本実施形態に係るボリュームレンダリング装置の処理動作を示すフローチャートである。
図5】本実施形態で用いるカラーマップを示す図である。
図6図4に示したステップS30における不透明外接領域算出処理を複数のCPUコアで並行して行う場合を示すフローチャートである。
図7図6のステップS330における断層画像群に対する不透明外接領域の算出処理を示すフローチャートである。
図8図6のステップS360における断層画像群全体の不透明外接領域の算出処理を示すフローチャートである。
図9】ROIと不透明外接領域を比較した図である。
図10図4に示したステップS40におけるレンダリング処理を各CPUコアで並行して行う処理を示すフローチャートである。
図11】座標変換の概念図である。
図12図10に示したステップS440の分割画像生成処理の詳細を示すフローチャートである。
図13図12に示したステップS640のボクセルの参照処理の詳細を示すフローチャートである。
図14図13に示したステップS642の起点座標の探索処理の詳細を示すフローチャートである。
図15】コンピュータによりボリュームレンダリング装置100を実現する場合の並列化処理を示す図である。
図16】コンピュータによりボリュームレンダリング装置100を実現する場合の並列化処理のソフトウェアによる流れを示す図である。
【発明を実施するための形態】
【0011】
以下、本開示の好適な実施形態について図面を参照して詳細に説明する。
本開示は、複数の断層画像に基づいて、信号値に対して色成分の値と不透明度を対応付けて定義されたカラ-マップを参照してレンダリング画像を生成するものである。図1は、複数の断層画像と、レンダリング画像を示す図である。図1(a)は複数の断層画像、図1(b)は1枚の断層画像、図1(c)はレンダリング画像である。図1(a)(b)に示す断層画像は、DICOM形式のものを示している。図1(a)は、370枚の断層画像群であり、図1(b)は、そのうちの1枚を拡大したものである。後述する実施形態のボリュームレンダリング装置では、図1(a)に示したような複数の断層画像に対してレンダリング処理を実行して、図1(c)に示したような1枚のレンダリング画像を生成する。図1(c)に示したレンダリング画像は、512×512画素であって、1画素についてRGB各色8ビットの計24ビットで表現したものである。本実施形態では、2次元の断層画像を、もう1つの別の次元となる方向に積層した状態を3次元のボクセル画像として扱う。3次元のボクセル画像における各ボクセルは、複数の2次元の断層画像における各画素に1対1で対応している。
【0012】
<1.装置構成>
図2は、本開示の一実施形態に係るボリュームレンダリング装置100のハードウェア構成図である。本実施形態に係るボリュームレンダリング装置100は、汎用のコンピュータで実現することができ、図2に示すように、CPU(Central Processing Unit)1と、コンピュータのメインメモリであるRAM(Random Access Memory)2と、CPU1が実行するプログラムやデータを記憶するためのハードディスク、SSD(Solid State Drive),フラッシュメモリ等の大容量の記憶装置3と、キーボード、マウス等の指示入力I/F(インターフェース)4と、データ記憶媒体等の外部装置とデータ通信するためのデータ入出力I/F(インターフェース)5と、液晶ディスプレイ等の表示デバイスである表示部6と、グラフィックスに特化した演算処理部であるGPU(Graphics Processing Unit)7と、表示部6に表示する画像を保持するフレームメモリ8と、を備え、互いにバスを介して接続されている。GPU7による演算結果はフレームメモリ8に書き込まれるため、GPU7とフレームメモリ8は、表示部6へのインタフェースを備えたビデオカードに搭載されて汎用のコンピュータにバス経由で装着されていることが多い。
【0013】
本実施形態において、CPU1は、マルチコアCPUであり、複数のCPUコアを有し、並列処理が可能となっている。図2の例では、RAM2が1つだけ示されているが、CPU1の各CPUコアが、1つのRAM2にアクセスするように構成されている。なお、CPU1は複数であってもよい。またマルチコアCPUは、各々のCPUコアが論理的に複数の実行スレッドを受け入れるCPUであってもよい。すなわち、CPU1は、複数の実行スレッドそれぞれを受け入れるプロセッサを有している。
【0014】
図3は、本実施形態に係るボリュームレンダリング装置の構成を示す機能ブロック図である。図3において、10は断層画像読込手段、20はカラーマップ読込手段、30はROIクリッピング設定手段、40はマスク設定手段、50は不透明外接領域算出手段、60はレンダリング手段、61はレイキャスティング手段、62は起点座標探索手段、63は陰影付加手段、70はレンダリング画像出力手段である。
【0015】
断層画像読込手段10は、CT、MRI、PETなどの医用画像診断機器により収集および蓄積されたPACSから、記憶媒体や入力部を経由して、複数の断層画像を読み込む手段である。断層画像は、対象物に対して所定の間隔で撮影されて得られたものであり、各画素に信号値が付与された2次元の断層画像である。カラーマップ読込手段20は、図示されていないカラーマップ作成手段により、あらかじめ作成されたカラーマップを記憶媒体や入力部から、カラーマップを読み込む手段である。ROIクリッピング設定手段30は、読み込んだ複数の断層画像のうち、レンダリングする対象を、関心領域であるROIとして設定する手段である。マスク設定手段40は、読み込んだ複数の断層画像のうち、表示させないマスク領域を設定する手段である。不透明外接領域算出手段50は、信号値に対して色成分の値と不透明度を対応付けて定義されたカラーマップを参照して、複数の断層画像の各画素に不透明度を対応付けて、その不透明度に基づいて不透明外接領域を算出する手段である。詳しくは後述するが、不透明外接領域とは、不透明度が0でない画素が存在する範囲に3次元の各軸方向において外接する領域である。
【0016】
レンダリング手段60は、レンダリング画像の生成領域を設定し、複数の断層画像で構成されるボクセル画像を投影した画素値を、カラーマップを参照しながら決定して、レンダリング画像を生成する手段である。レンダリング手段60は、さらにレイキャスティング手段61、陰影付加手段63を備えている。レイキャスティング手段61は、レンダリング画像の各画素において、後述する有効領域と、視点に最も近い視線方向のベクトルとの交点を算出し、レンダリング画像の各画素において、算出される交点よりボクセル画像に対して視線方向に仮想光線を照射し、レイキャスティング法に基づいて所定の座標変換を行いながらボクセル画像の複数のボクセルを参照する手段である。陰影付加手段63は、参照されたボクセル画像の信号値を基にカラーマップを参照して変換された各ボクセルの(R,G,B)で構成される色成分に対して、そのボクセルの近傍のボクセルの信号値を基に同様にカラーマップを参照して変換された不透明度αを基に、そのボクセルにおける勾配ベクトルを算出し、算出した勾配ベクトルを用いて、陰影値を算出し、色成分(R,G,B)の各値に陰影値を乗算した値に置き換える手段である。さらに、レイキャスティング手段61は、起点座標探索手段62を備えている。起点座標探索手段62は、レイキャスティング手段61が画素値の演算を行う際、視点座標系において投影の起点となる座標を探索する手段である。
【0017】
断層画像読込手段10およびカラーマップ読込手段20は、CPU1が補助しながら、主にデータ入出力I/F5において実現される。ROIクリッピング設定手段30およびマスク設定手段40は、CPU1が補助しながら、主に指示入力I/F4において実現される。不透明外接領域算出手段50、レイキャスティング手段61、陰影付加手段63、レンダリング手段60、起点座標探索手段62は、CPU1が、記憶装置3に記憶されているプログラムを実行することにより実現される。レンダリング画像出力手段70は、CPU1が補助しながら、主にフレームメモリ8と表示部6において実現される。
【0018】
図3に示した各構成手段は、現実には図2に示したように、コンピュータおよびその周辺機器等のハードウェアに専用のプログラムを搭載することにより実現される。すなわち、コンピュータが、専用のプログラムに従って各手段の内容を実行することになる。なお、本明細書において、コンピュータとは、CPU、GPU等の演算処理部を有し、データ処理が可能な装置を意味し、パーソナルコンピュータなどの汎用コンピュータだけでなく、GPUを搭載するタブレットなどの携帯端末や様々な装置に組み込まれたコンピュータも含む。
【0019】
<2.処理動作>
次に、図2図3に示したボリュームレンダリング装置の処理動作について説明する。図4は、本実施形態に係るボリュームレンダリング装置の処理動作を示すフローチャートである。まず、断層画像読込手段10が、複数の断層画像を読み込む。複数の断層画像は、図1(a)に示したような態様のものである。本実施形態では、DICOM形式の断層画像群Do(x,y,z)(-32768≦Do(x,y,z)≦32767,0≦x≦Sx-1,0≦y≦Sy-1,0≦z≦Sz-1; 解像度:Rxy,Rz)を読み込むものとする。断層画像群Do(x,y,z)は1画素が16ビットで記録されるため、-32768~32767の信号値Do(x,y,z)が記録されている。断層画像群Do(x,y,z)は、x座標のサイズ(画素数)がSx、y座標のサイズ(画素数)がSyの断層画像が、Sz枚積層されたものである。なお、以後の説明では、断層画像の枚数SzをMとも表現する。図1(b)における1枚の断層画像の左右方向がx軸、上下方向がy軸に対応し、図1(a)に示した複数の断層画像を当該断層画像のDICOMヘッダに記録されている所定のスライス間隔(隣接する断層画像のImage Positionタグ情報の差分)で重ねた場合の積層方向がz軸に対応する。
【0020】
DICOM形式の複数の断層画像を読み込んだら、ROIクリッピング設定手段30が、ROIクリッピング設定を行う(ステップS10)。ROIとはRegion of Interestの略であり、本明細書では3次元空間における関心領域を意味する(学術的には、ROIは2次元領域を指し、3次元領域の場合、VOI(Volume of Interest)と称するが、医用画像業界では3次元領域でもROIが多用される)。ここでは、レンダリング画像の作成対象とする範囲を示す。ROIをクリッピング(切り取り)して設定することにより、3次元的に任意の位置で被写体を断裁したボリュームレンダリング像を生成することができ、体表や骨に隠れた臓器や臓器の内部を描出するのに用いられる。ステップS40の処理において、所定の範囲にボクセル画像の参照範囲が限定されるように、ステップS10においてROIを設定する。この設定は、xyz各軸方向のそれぞれの座標範囲を数値で指定することにより行われる。数値の指定は、直接行ってもよいし、マウス等により画面上で位置を指示し、指示入力I/F4を介して数値に変換することにより行ってもよい。
【0021】
読み込んだ各断層画像のx軸方向の最小の座標をXso、x軸方向の最大の座標をXeo、y軸方向の最小の座標をYso、y軸方向の最大の座標をYeo、第1スライス(先頭:第1番目)の断層画像に対応する座標をZso、最終スライス(末尾:第M番目)の断層画像に対応する座標をZeoとすると、Xso≦Xs<Xe≦Xeo、Yso≦Ys<Ye≦Yeo、Zso≦Zs<Ze≦Zeoを満たす[Xs,Xe]、[Ys,Ye]、[Zs,Ze]の直方体で定義される範囲をROIと定義し処理対象として特定する。すなわち、レンダリング画像を生成する対象となるボクセル画像領域を指定する6つの座標Xs,Xe,Ys,Ye,Zs,Zeが定義される。この6つの座標により、xyz各軸に沿った辺をもつ直方体が定義され、その直方体の内部がクリッピングされたROIとなる。本実施形態では、後述のステップS30において不透明外接領域を算出するが、この不透明外接領域もxyz各軸の所定の範囲で定義される直方体形状の領域としている。
【0022】
ステップS10におけるROIクリッピング設定の結果、処理対象の画素数が(Xeo-Xso+1)×(Yeo-Yso+1)×(Zeo-Zso+1)画素から、(Xe-Xs+1)×(Ye-Ys+1)×(Ze-Zs+1)画素に削減されることになる。ROIクリッピング設定手段30によるステップS10のROIクリッピング設定を行うことにより、観察対象の臓器を露出させたボリュームレンダリング像が得られるという効果に加え、処理対象の画素が減って処理負荷を抑え応答性を向上させることができるという二重のメリットがあるため、設定される場合が多いが、必須の処理ではなく省略することも可能である。尚、ステップS10のROIクリッピング設定の段階では、ROIクリッピングを適用する範囲を定義するだけで、具体的なROIのクリッピング処理は、ステップS40の処理で実行される。各々の処理において、ボクセル画像のROI内に限定して演算が行われることにより処理負荷が軽減され、ステップS40のレンダリング処理でクリッピング(断裁)されたボリュームレンダリング像が生成される。
【0023】
ROIクリッピング設定手段30により、ROIクリッピング設定が行われたら、次に、マスク設定手段40が、マスク設定を行う(ステップS20)。マスク設定とは、断層画像の各画素を表示させるか否かの設定である。マスク設定の手法は、特に限定されないが、本実施形態では、ステップS10において読み込んだ断層画像群をMPR画像(アキシャル・コロナル・サジタルの3画面)として画面表示するとともに、本明細書に記載の方法または公知の手法により作成されるボリュームレンダリング像を表示させ、これら2次元投影された複数の画像の中から最も指示がしやすい画像を選択し、選択した画像の2次元領域を指示しながら奥行方向に延長させた3次元領域を、マスクして表示させない範囲とマスクせずに表示させる領域を特定する。このマスク設定により、断層画像群に対応した3次元空間におけるマスクデータが得られる。マスクデータMask(x,y,z)は、断層画像群Do(x,y,z)の各画素に対応して“0”か“1”かのいずれかの値が設定されたものである。このような3次元マスクを作成する処理は必須の処理に近いが、省略することも可能である。観察対象の臓器を描出する方法として、上述のROIクリッピングもあるが、3次元マスクに比べ操作が簡便であり、処理負荷も減少するため、ROIクリッピング処理も併用される頻度が多い。ROIクリッピング設定手段30、マスク設定手段40により表示させるべき特定の領域が設定されることになるが、両手段で設定されている場合は、いずれも表示すべき領域として設定された領域が有効な領域となり、いずれか一方が設定されている場合は、設定された領域が有効な領域となる。ROIクリッピング設定手段30、マスク設定手段40のどちらも用いられない場合は、読み込まれた断層画像群の全領域が有効な領域となる。
【0024】
次に、不透明外接領域算出手段50が、不透明外接領域の算出処理を行う(ステップS30)。不透明外接領域とは、不透明度が0でない画素が存在する範囲に3次元の各軸方向において外接する領域である。外接する領域としているのは、不透明度が0でない画素が存在する範囲に外接する所定の辺(線分)で囲まれる領域とすることにより、レンダリング処理時に、回転演算を行った場合に、視線と交差する範囲を演算で高速に算出できるようにするためである。そのため、不透明外接領域は不透明度が0でない画素が存在する範囲に外接する3次元座標軸に鉛直な直方体領域に限定される。(斜め直方体や曲面形状では外接面の算出に処理負荷がかかり、かつ視線との交点を線形な数式で解析的に算出できず所望の高速化効果を達成できない。)従って、断層画像の2つの座標軸の方向と、断層画像を積層した方向に沿った辺で規定される直方体の内部の領域とすることが好ましい。具体的な処理としては、カラーマップ読込手段20から読み込んだカラーマップを用いて、クリッピング設定後の断層画像のROIに含まれる各画素の信号値に対して対応する不透明度を付与し、付与した不透明度に基づいて不透明外接領域を算出する。
【0025】
図5は、本実施形態で用いるカラーマップを示す図である。図5において、信号値は、断層画像の各画素に記録された信号値であり、R、G、Bは、それぞれ赤、緑、青の色成分であり、αはそのボクセルの不透明度である。図5は、断層画像の信号値が16ビットで記録され、-32768~32767の値をとる場合のカラーマップである。なお、CT画像の場合は、水(water)成分を0として-2048から2048の範囲に正規化される場合が多い。図5に示すように、カラーマップには、断層画像の各画素の信号値に対して、R、G、Bの各色成分と不透明度αが対応付けられている。このカラーマップは、レンダリング手段60によるレンダリング処理においても用いられる(後述:ステップS40)。ステップS30における不透明外接領域の算出処理においては、カラーマップのうち不透明度αのみを用いる。カラーマップを参照して得られた不透明度αを用いることにより、断層画像においてα=0となる不透明な画素が存在する領域を不透明外接領域として算出することができる。この不透明外接領域に対応する領域を有効領域として定義する。「不透明外接領域に対応する領域」として、不透明外接領域をそのまま処理対象として有効な有効領域とすることもできるが、本実施形態では、後述するように、不透明外接領域を1画素分広げた領域を、不透明外接領域に対応する有効領域としている。
【0026】
図5に示したようなカラーマップを用いることにより、断層画像において所定の信号値を有する箇所を、任意の色成分、任意の不透明度で表現することができる。断層画像においては、臓器、器官等の部位に応じて信号値が異なるため、ボリュームレンダリング像において、カラーマップを定義することにより、信号値の相違に基づいて、人為的に、特定の臓器を色分けしたり、特定の器官を透明にして背後に隠れた臓器を露出させたりすることができる。特定の部位の不透明度αを最大値(α=255)に設定すれば、その部位だけが明瞭に表示され、その部位の奥に位置する部位は描出されない。逆に特定の部位の不透明度αを最小値(α=0)に設定すれば、その部位は不可視(透明)になり、その部位の奥に位置する部位が露出される。特定の部位の不透明度αを中間調(0<α<255)に設定すれば、その部位が半透明で表示され、その奥に位置する部位が透かし合成されて表示される。また、色成分R、G、Bとしては、目的とする部位を視認し易くするための任意の値を設定することができる。
【0027】
したがって、カラーマップは、観察対象の部位ごとに設定しておくことができ、同じ断層画像群に対しても、異なるカラーマップを使用することにより、異なるボリュームレンダリング像が得られることになる。すなわち、肺用のカラーマップを用いれば、肺の部分が目立ったボリュームレンダリング像が得られ、心臓用のカラーマップを用いれば、心臓の部分が目立ったボリュームレンダリング像が得られる。ただし、各臓器の信号値分布は互いにオーバーラップしていることもあるため、特定の臓器のみを描出するカラーマップを作成することはできないことが多い。例えば、心臓用のカラーマップでは肋骨・胸骨も同時に描出され、心臓はこれらの骨に隠れてしまうため、ROIクリッピングを設定して肋骨を仮想的に断裁するなどの工夫が必要になる。
【0028】
本実施形態では、指示入力I/F4を介した操作により、使用中のカラーマップに変更を加えたり、異なるカラーマップを読み込んだりすることが可能となっている。そして、ボリュームレンダリング装置は、変更されたカラーマップまたは新たに読み込まれたカラーマップを参照して、ボリュームレンダリング像として提示するためのレンダリング画像を生成する。本実施形態のボリュームレンダリング装置は、断層画像からカラーマップを参照してRGBα形式のボクセル画像を生成せずに、レンダリング画像を生成する過程で複数の断層画像で構成されるボクセル画像から計算に必要とするボクセルに限定してカラーマップを参照しながら色成分および不透明度に変換する方法をとっているため、カラーマップの変更に対してRGBα形式のボクセル構造体を再構築する必要が無く、リアルタイムにボリュームレンダリング像を更新できる。
【0029】
本実施形態では、ステップS30における不透明外接領域の算出処理は、複数のCPUコアにより並行して行われる。ここで、ステップS30における不透明外接領域の算出処理の詳細について説明する。図6は、ステップS30における不透明外接領域の算出処理を並行して行う場合を示すフローチャートである。不透明外接領域算出手段50は、ステップS10で読み込んだ断層画像群をNA個(NA≧2の整数)に分割し、各CPUコアで並列処理を行う。(x,y)座標を備えた各断層画像が積層された方向がz軸方向となるため、z座標の値に応じてNA個に分割する。具体的には、各断層画像群の先頭の断層画像の座標をZ1、末尾の断層画像の座標をZ2とし、先頭座標Z1、末尾座標Z2に、読み込んだ断層画像を割り当てていく。例えば、1番目のCPUコアには、Z1=Zs、Z2=Zs+(Ze-Zs+1)/NA-1が設定される。各断層画像群には、断層画像が順に配置されているが、一端を先頭、他端を末尾としている。
【0030】
次に、処理対象とする断層画像群に対する不透明外接領域を算出する(ステップS330)。ステップS330における処理は、NA個のCPUコアにより並行して処理が行われる。ステップS330における処理の詳細については後述する。
【0031】
ステップS330における断層画像群に対する不透明外接領域の算出を終えたら、NA個の断層画像群からなる断層画像全体に対して、不透明外接領域の算出を行う(ステップS360)。ステップS360における処理の詳細についても後述する。
【0032】
本実施形態では、複数に分割した断層画像群を複数のCPUコアで並行に処理する。なお、本実施形態では、z=Z1を先頭、z=Z2を末尾として説明したが、z=Z1を末尾、z=Z2を先頭としてもよい。結局は、読み込んだ全ての断層画像の積層構成を変更せず、一方から他方に向かって処理することができるように、先頭と末尾を設定すればよい。
【0033】
上述のステップS330の処理の詳細について説明する。図7は、ステップS330における断層画像群に対する不透明外接領域の算出処理を示すフローチャートである。ステップS330の処理は、分割されたNA個の各断層画像群に対して行われる。ステップS330においては、各断層画像群の先頭の断層画像の座標をZ1、末尾の断層画像の座標をZ2とし、先頭座標Z1、末尾座標Z2に、読み込んだ断層画像を割り当てる。例えば、1番目のCPUコアには、Z1=Zs、Z2=Zs+(Ze-Zs+1)/NA-1が設定される。各断層画像群には、断層画像が順に配置されているが、一端を先頭、他端を末尾としている。
【0034】
まず、初期設定を行う(ステップS331)。具体的には、断層画像を特定するzと、断層画像の座標値であるx,yと、xの最小値、最大値をそれぞれ決定するための変数Xmin(tid)、Xmax(tid)と、yの最小値、最大値をそれぞれ決定するための変数Ymin(tid)、Ymax(tid)と、zの最小値、最大値をそれぞれ決定するための変数Zmin(tid)、Zmax(tid)に初期値を与える。(tid)は、断層画像群を特定する識別情報であり、NA個の各断層画像群に対応する値が与えられる。このtidは、処理スレッドを特定する識別情報でもある。
【0035】
x,yとしては、ステップS10においてROIクリッピング設定が行われている場合、その最小値Xs、最小値Ysをそれぞれ与える。また、Xmin(tid)、Xmax(tid)、Ymin(tid)、Ymax(tid)、Zmin(tid)、Zmax(tid)としては、ステップS10においてROIクリッピング設定が行われている場合、最小値を決定するための変数には、ROIクリッピング設定による最大値を与え、最大値を決定するための変数には、ROIクリッピング設定による最小値を与える。したがって、ROIクリッピング設定が行われている場合、以下の〔数式1〕に示すように初期値が設定される。
【0036】
〔数式1〕
Xmin(tid)=Xe
Xmax(tid)=Xs
Ymin(tid)=Ye
Ymax(tid)=Ys
Zmin(tid)=Ze
Zmax(tid)=Zs
【0037】
なお、ステップS10においてROIクリッピング設定が省略されている場合には、[Xs,Xe]、[Ys,Ye]、[Zs,Ze]に代えて断層画像群の最小値、最大値である[Xso,Xeo]、[Yso,Yeo]、[Zso,Zeo]が初期値として設定される。
【0038】
初期設定が行われたら、断層画像の対象画素の信号値により図5に示したカラーマップを参照し、不透明度αを取得する(ステップS332)。次に、取得した不透明度α、マスクデータMask(x,y,z)の少なくとも一方が“0”であるか否かを判定する(ステップS333)。なお、ステップS20におけるマスク設定が省略されている場合には、マスクデータMask(x,y,z)が“0”であるか否かの判定は行わず、不透明度αのみが“0”であるか否かの判定を行う。
【0039】
ステップS333において、“No”すなわち不透明度α、マスクデータMask(x,y,z)の両方が“0”でない場合には、不透明とすべき画素であると考えられるため、最小値を決定するための変数Xmin(tid)、Ymin(tid)、Zmin(tid)、最大値を決定するための変数Xmax(tid)、Ymax(tid)、Zmax(tid)を変更する(ステップS334)。具体的には、以下の〔数式2〕に従った処理を実行することにより、変数の値を変更する。
【0040】
〔数式2〕
x<Xmin(tid)の場合、Xmin(tid)=x
x>Xmax(tid)の場合、Xmax(tid)=x
y<Ymin(tid)の場合、Ymin(tid)=y
y>Ymax(tid)の場合、Ymax(tid)=y
z<Zmin(tid)の場合、Zmin(tid)=z
z>Zmax(tid)の場合、Zmax(tid)=z
【0041】
〔数式2〕により、対象とする断層画像群(tid)における不透明外接領域を定義するxyz各軸方向の最小値または最大値の各値が、前述の不透明度α、マスクデータMask(x,y,z)の両方が“0”でないという条件を満足する断層画像(z)における画素(x,y)の3次元座標値(x,y,z)により更新される。
【0042】
ステップS333において、すなわち不透明度α等が“0”であると判定された場合、“0”でないと判定されてステップS334により変数を変更された場合のいずれにおいても、対象とする画素に対する処理を終えたことになるので、次に、対象画素をx軸方向において変更する(ステップS335)。具体的には、x座標の値をインクリメントする。x座標の変更の結果、x≦Xeである場合は、ステップS333に戻って、次の画素に対する処理を行う。一方、ステップS335において、x>Xeとなった場合は、対象画素をy軸方向において変更する(ステップS336)。具体的には、y座標の値をインクリメントする。x座標の変更の結果、y≦Yeである場合は、ステップS333に戻って、次の画素に対する処理を行う。このようにして、あるzで特定される断層画像の全ての画素(x,y)に対して処理を終えたら、対象画素をz軸方向において変更する(ステップS337)。すなわち、対象とする断層画像を変更する。ステップS337において、Z>z2となった場合は、1つの断層画像群における(Z2-Z1+1)個の断層画像に対して処理を終えたことになるので、図7に示したステップS330の処理を終了する。
【0043】
1つの断層画像群における全ての断層画像、画素について処理を行うことにより、不透明度α、マスクデータMask(x,y,z)の両方が“0”でない全ての断層画像、画素について、ステップS334における〔数式2〕に従った処理が実行されることになる。これにより、途中に不透明度α、マスクデータMask(x,y,z)いずれかが“0”の画素があったとしても不透明度α、マスクデータMask(x,y,z)の両方が“0”でない最も外側の断層画像、画素の位置を取得することができる。
【0044】
図7に示したステップS330の処理をz=Z1~z=Z2まで行うことにより、分割された1つの断層画像群における不透明外接領域が算出される。そして、ステップS360において、NA個の全ての断層画像群を集めた断層画像群全体の不透明外接領域を算出する。ステップS360の処理の詳細について説明する。図8は、ステップS360における断層画像群全体の不透明外接領域の算出処理を示すフローチャートである。まず、初期設定を行う(ステップS361)。具体的には、断層画像群を特定する識別情報であるtidと、処理スレッド数を示す固定値NAと、xの最小値、最大値をそれぞれ決定するための変数Xmin、Xmaxと、yの最小値、最大値をそれぞれ決定するための変数Ymin、Ymaxと、zの最小値、最大値をそれぞれ決定するための変数Zmin、Zmaxに初期値を与える。
【0045】
次に、各分割画像群において算出された最小値Xmin(tid)、Ymin(tid)、Zmin(tid)、最大値Xmax(tid)、Ymax(tid)、Zmax(tid)を用いて、最小値を決定するための変数Xmin、Ymin、Zmin、最大値を決定するための変数Xmax、Ymax、Zmaxを変更する(ステップS362)。具体的には、以下の〔数式3〕に従った処理を実行することにより、変数の値を変更する。
【0046】
〔数式3〕
Xmin(tid)<Xminの場合、Xmin=Xmin(tid)
Xmax(tid)>Xmaxの場合、Xmax=Xmax(tid)
Ymin(tid)<Yminの場合、Ymin=Ymin(tid)
Ymax(tid)>Ymaxの場合、Ymax=Ymax(tid)
Zmin(tid)<Zminの場合、Zmin=Zmin(tid)
Zmax(tid)>Zmaxの場合、Zmax=Zmax(tid)
【0047】
〔数式3〕により、対象とする断層画像群(tid)における不透明外接領域のxyz各軸方向の最小値または最大値の各値が、全体の不透明外接領域を定義する範囲を超える場合、当該断層画像群(tid)における不透明外接領域のxyz各軸方向の最小値または最大値の値により、全体の不透明外接領域を定義する範囲が拡大更新される。
【0048】
次に、対象とする断層画像群を変更する(ステップS363)。具体的には、tidの値をインクリメントする。tidの値をインクリメントした結果、tidがNAより小さい場合は、全ての断層画像群に対して処理を終えていないことを意味するので、ステップS362に戻って、次の断層画像群に対して最小値、最大値を決定するための変数を変更する処理を行う。tidの値をインクリメントした結果、tidがNA以上である場合は、全ての断層画像群に対して処理を終えたことを意味するので、不透明外接領域の境界処理を行う(ステップS364)。ステップS364では、モアレ対策として、不透明度αが0の透明な画素で構成される境界面(x=Xisまたはx=Xieまたはy=Yisまたはy=Yieまたはz=Zisまたはz=Zie)を不透明外接領域の最外周となる外接直方体のエッジに1画素幅だけ付加する。具体的には、ステップS362を繰り返すことにより算出された領域をxyz各軸方向に1画素ずつ拡張する処理を行う。より具体的には、以下の〔数式4〕に従った処理を実行することにより、変数の値を変更する。
【0049】
〔数式4〕
Xis=Xmin-1とし、Xis<Xsの場合、Xis=Xs
Xie=Xmax+1とし、Xie>Xeの場合、Xie=Xe
Yis=Ymin-1とし、Yis<Ysの場合、Yis=Ys
Yie=Ymax+1とし、Yie>Yeの場合、Yie=Ye
Zis=Zmin-1とし、Zis<Zsの場合、Zis=Zs
Zie=Zmax+1とし、Zie>Zeの場合、Zie=Ze
【0050】
ステップS364においては、境界となる画素を1画素分だけ外側に移動させている。このようにして外側に1画素分広げた領域を処理対象として有効な有効領域とする。有効領域の最外側の画素は、不透明度αが“0”であるはずなので、有効領域の最外周の画素、いわゆる有効領域の境界面に位置する画素は、全て透明な画素となる。したがって、不透明外接領域算出手段50は、各軸方向における最外周となる画素に対応する不透明度が0となるように有効領域を算出することになる。ただし、有効領域の境界面に位置する画素の色成分(RGB値)は、マスクデータMask(x,y,z)が0またはROIの範囲外であるか否かにかかわらず、断層画像の信号値を基にカラーマップで定義されるRGB値をそのまま付与する。これにより、有効領域の内部と外部で、不透明度は不連続になるがRGB値は連続性が維持され、この有効領域に対応するボクセル画像に対してレンダリング処理を行った場合、有効領域の境界面に発生するモアレを抑制することが可能となる。
【0051】
ステップS364における処理の結果得られる[Xis,Xie]、[Yis,Yie]、[Zis,Zie]の直方体で定義される範囲を有効領域と定義し処理対象として特定する。なお、図8のステップS364においては、不透明外接領域の外側に1画素分広げた領域を有効領域とすることにより、有効領域の各軸方向における最外周となるボクセル(画素)に対応する不透明度が0となるようにした。しかし、これに限定されず、不透明外接領域で規定される領域をそのまま有効領域とし、最外周となるボクセルの不透明度が0でない場合であっても、最外周となるボクセルの不透明度を強制的に0に置き換えることにより、最外周となるボクセルに対応する不透明度が0となるようにしてもよい。
【0052】
上記のようにして、ステップS30の処理により不透明外接領域が算出される。ここで、ステップS10のROIクリッピング処理により得られるROIと、ステップS30の処理により得られる不透明外接領域を比較してみる。図9は、ROIと不透明外接領域を比較した図である。このうち、図9(a)は、ROI、図9(b)は、不透明外接領域を示している。図9(a)(b)において、楕円状の実線は、複数の断層画像による空間内における不透明画素(α>0)の分布範囲を示している。ここで、不透明画素とは、カラーマップを参照した結果、不透明度αが0より大きい値をもつ画素であり、不透明画素の分布範囲とは、不透明画素が存在している最大範囲を示している。すなわち、不透明画素の分布範囲内には、不透明度αが0である透明画素も存在している。ここでは、図9(a)(b)に示す不透明画素の分布範囲は同一のものを示している。
【0053】
図9(a)においては、実線の直方体がROIを示し、破線の直方体が不透明外接領域を示している。図9(b)においては、実線の直方体が不透明外接領域を示している。上述のように、ROIは、ステップS10におけるROIクリッピング設定において、xyz各軸方向のそれぞれの座標範囲を数値で指定することにより行われる。また、不透明外接領域は、ステップS30における不透明外接領域の算出において、不透明画素の分布範囲に外接する不透明外接領域を算出することにより行われる。通常、ステップS10におけるROIクリッピング設定においては、不透明画素の分布範囲を含むように利用者が設定し、ステップS30における不透明外接領域の算出においては、不透明画素の分布範囲を含む最小の不透明外接領域が算出される。そのため、図9(a)に実線の直方体と破線の直方体で示したように、不透明外接領域がROIに完全に包含され、不透明外接領域の方がROIよりも小さくなる。
【0054】
しかし、ROIは、ステップS10におけるROIクリッピング設定において任意に設定できるため、必ずしも不透明画素の分布範囲全体を含むように設定されるとは限らない。その場合、有効領域は、ROIと不透明外接領域の両方に含まれる範囲内で定義される。また、マスク設定処理(S20)においてマスクが定義されている場合、図9のα>0の範囲として示されている楕円体のような任意の3次元形状で囲まれる範囲の外側がマスクされα=0となるが、不透明画素の分布範囲とは独立して定義される。即ち、図9のα>0の範囲として示されている楕円体のような分布が2種類存在し、これらの2種類の分布が重なったα>0の分布範囲に外接するように不透明外接領域が設定されることになり、不透明外接領域は更に小さくなる。
【0055】
ここで、不透明外接領域の内部における画素の分布について説明する。図9(c)は、図9(b)に対し、ドーナツ型のマスクデータMask(x,y,z)を追加したもので、図9(c)の三重の楕円で挟まれた白色の領域がMask(x,y,z)=0となるマスク領域である。図9(c)においては、不透明度α、マスクデータMask(x,y,z)の両方が“0”でない画素を網掛けで示しており、不透明度α、マスクデータMask(x,y,z)のいずれかが“0”の画素を網掛けせずに示している。図9(c)に示すように、不透明度α、マスクデータMask(x,y,z)の両方が“0”でない画素の分布が内側と外側の二重になっていたとしても、不透明度α、マスクデータMask(x,y,z)の両方が“0”でない画素の分布の最も外側を含むように、不透明外接領域は設定される。内側のマスクデータMask(x,y,z)の両方が“0”でない画素の分布に対しては、不透明外接領域は設定されない。
【0056】
このようにして、不透明外接領域に対応する範囲に縮小した有効領域を定義してボリュームレンダリングを行っても、得られるレンダリング画像は、従来の断層画像全体(ボクセル画像)を有効領域としてボリュームレンダリングを行う場合と差異は無い。しかし、後述するレンダリング画像の各画素に対応して探索される仮想光線上の有効領域における起点座標を迅速に求めることが可能になる。
【0057】
ステップS30における不透明外接領域算出処理を終了したら、レンダリング手段60が、レンダリング処理を行う(ステップS40)。図10は、ステップS40におけるレンダリング処理を各CPUコアで並行して行う処理を示すフローチャートである。
【0058】
レンダリング画像の生成は、設定されたサイズにより定まる生成領域を複数に分割し、得られた各分割生成領域について並行して処理を行って分割画像を生成することにより行う。レンダリング画像のサイズは、x軸方向y軸方向ともに同一であり、画素数Size×Sizeに設定される。まず、レンダリング手段60は、並列処理を行うための分割する分割生成領域を初期設定する(ステップS410)。本実施形態では、y座標については分割せず、x座標についてNB個に分割する。具体的には、各分割生成領域のx座標の先頭座標をX1、末尾座標をX2とし、先頭座標X1、末尾座標X2に、設定されたサイズSize×Sizeで特定される全体のレンダリング画像の分割生成領域を割り当てていく。初期値として、X1=0、X2=Size/NB-1が設定される。
【0059】
次に、生成する座標変換パラメータの設定を行う(ステップS420)。レンダリング手段60は、以後のステップにおいて座標変換を実施する際に共通に用いるパラメータである座標変換パラメータを設定する。座標変換パラメータの設定は、ボクセルに対して仮想光線を照射する際、ボクセル単位に逐次座標変換処理を円滑に行うことができるようにするために、視点を基準とする視点座標系における3次元座標を基にボクセル画像が定義されているボクセル座標系の3次元座標に変換し、ボクセル座標系において対応するボクセルの信号値を取得するための処理である。
【0060】
ここで、座標変換の概念図と座標変換パラメータの具体例については説明する。図11は、座標変換の概念図である。レンダリングにより得られるレンダリング画像は視点から見た画像であるので、レンダリング画像の各画素(x,y)の基準となる視点座標系は必ずしもボクセル座標系とは一致していない。そこでレンダリング手段60は、ボクセル座標系に定義されているボクセル画像を視点座標系に変換する必要がある。すなわち、本来は、図11(a)に示すように、投影面の各点からボクセル画像に対して任意の方向に仮想光線(レイ)を発射し、仮想光線が交差するボクセル画像内の指定範囲における信号値を複数抽出し、抽出された複数のボクセルの信号値を基にレンダリング画像の画素値を算出する。しかし、計算を簡単にするため、ボクセル画像に座標変換を施し、図11(b)に示すように、投影面の各点よりz軸負方向に指定範囲における画素値を算出する。ただし、図11(b)に示すような座標変換されたボクセル画像は実際には別途作成されるものではなく、各ボクセルごとに逆方向に座標変換を行いながらボクセル画像の画素値を都度取得するようにしている。
【0061】
座標変換を実施する際には、様々な座標変換パラメータを用いる。視点座標系とボクセル座標系の位置関係が同じであれば、座標変換パラメータも同じであると考えられる。即ち、レンダリング手段60において、視点座標系で参照される全てのボクセルに対して、ボクセル座標系に座標変換を実施するための座標変換パラメータは同一である。そこでレンダリング手段60は、ステップS420において座標変換パラメータをあらかじめ算出し、以後のステップにおいてはその座標変換パラメータを共通の座標変換パラメータとして流用する。座標変換パラメータとしては例えば以下のようなものが挙げられる。
【0062】
・所定の3次元座標系における回転を定義した3×3行列(逆方向に投影変換が行われるため、指示入力I/F4により指示され定義された3×3行列の逆行列)
・xyz軸方向のオフセット値:Xoff、Yoff、Zoff(単位:ボクセル)
・ROIクリッピングで設定された領域:x軸方向:Xs~Xe,y軸方向:Ys~Ye,z軸方向:Zs~Ze
・不透明外接領域:x軸方向:Xis~Xie,y軸方向:Yis~Yie,z軸方向:Zis~Zie
・拡大又は縮小倍率:Scale(xyz各軸について同じ値を用いる。)
・z軸方向変倍率:Scz=Rxy/Rz(xy軸方向の解像度Rxyとz軸方向の解像度Rzの間の比率)
・座標変換サブサンプル・微小オフセット値:x軸方向dx,y軸方向dy,z軸方向dz
・仮想光線のサブサンプリング倍率:Sray(通常は1、値が大きいと粗くなる、1未満だと高精細になる)
【0063】
座標変換パラメータが設定されたら、座標変換サブサンプルのオフセットを行う(ステップS430)。具体的には、dx=dy=dz=0に設定する。また、l=0に設定する。次に、分割生成領域について分割画像の生成処理を行う(ステップS440)。上述のように、レンダリング画像の生成領域は、x座標においてのみNB個に分割されているため、分割画像のy座標の画素数はSizeであり、分割画像のx座標の画素数は(X2-X1+1)となる。したがって、ステップS440においては、Size×(X2-X1+1)画素の分割画像を生成することになる。このステップS440の処理については後述する。
【0064】
続いて、座標変換サブサンプルの更新を行う(ステップS450)。具体的には、l←l+1, dx←dx+1/L, dy←dy+1/L, dz←dz+1/L を実行する。座標変換サブサンプルを更新しながら、ステップS440の処理はL回実行されることになる。
【0065】
ステップS440の処理は、複数のCPUコアにより並行して行われる。このため、最初の分割範囲について分割画像の生成処理を1つのCPUコアに割り当てて実行処理を起動したら、処理終了を待たずに次の分割生成領域を設定および生成処理の起動を進める(ステップS460)。具体的には、X1、X2の値をそれぞれSize/NBだけ増加し、次の分割生成領域におけるx座標の先頭座標X1、末尾座標X2を新たに設定する。
【0066】
ステップS460において新たな分割生成領域を設定した後、新たな分割生成領域がレンダリング画像全体のサイズを超えている場合、すなわち、ここでは、X2>Size-1を満たす場合は、全ての分割生成領域について設定および分割画像生成の処理の起動を終えたとして、図10に示すステップS40の処理を終了する。X2≦Size-1を満たす場合は、全ての分割生成領域について処理を終えていないため、ステップS420に戻って、他のCPUコアに割り当て、分割画像の生成を起動する処理を繰り替えす。
【0067】
図10のステップS440の分割画像生成処理について説明する。図12は、ステップS440の分割画像生成処理の詳細を示すフローチャートである。ここで、生成するレンダリング画像の分割画像を定義しておく。レンダリング画像は、各2次元座標(x,y) (X1≦x≦X2, 0≦y≦Size-1)で特定される画素においてRGB各色8ビット計24ビットの画素値を有する画像である。そして、このレンダリング画像に対して、まず背景色を設定する(ステップS610)。具体的には、8ビットで0~255の値をとる背景色bg(c)、c=0(R),1(G),2(B)を定義する。そして、対象とするレンダリング画像の画素をx=X1、y=0とする。
【0068】
次に、仮想光線強度と累積輝度値を初期化する(ステップS620)。具体的には、仮想光線強度Trans=1.0、累積輝度値Energy(c)=0.0に初期化する。累積輝度値Energy(c)は、R,G,Bにそれぞれ対応するc=0,1,2ごとに設定される。
【0069】
次に、有効領域と仮想光線との交点z座標を算出する(ステップS630)。具体的には、レイキャスティング処理の対象とするレンダリング画像上の対象画素(x,y)に対して、視点座標系におけるz=Zo(=Size/Sray-1)からz=0の範囲で、視点z=Zoに最も近い有効領域([Xis,Xie]、[Yis,Yie]、[Zis,Zie])との交点Zcを算出する。
【0070】
交点Zcの算出にあたり、まず、仮想光線ベクトルを算出する。具体的には、視点座標系の(x,y,Zo)および(x,y,0)に対して上記座標変換パラメータを用いて各々座標変換を行い、実数値のボクセル座標を各々(x1,y1,z1)、(x2,y2,z2)とし、仮想光線ベクトルの各要素vx=x2-x1、vy=y2-y1、vz=z2-z1を算出する。
【0071】
次に、仮想光線ベクトルと有効領域の6面との交点を算出する。具体的には、以下の〔数式6〕に従った処理を実行する。
【0072】
〔数式6〕
tx=ty=tz=10に初期化
|vx|≧1の場合、tx1=(Xis-x1)/vx,tx2=(Xie-x1)/vxを算出し、tx1、tx2のうち小さい方をtxに設定する。
|vy|≧1の場合、ty1=(Yis-y1)/vy,ty2=(Yie-y1)/vyを算出し、ty1、ty2のうち小さい方をtyに設定する。
|vz|≧1の場合、tz1=(Zis-z1)/vz,tz2=(Zie-z1)/vzを算出し、tz1、tz2のうち小さい方をtzに設定する。
【0073】
〔数式6〕に従った処理により、tx、ty、tzが得られる。続いて、視点(z=Zo)に最も近い交点Zcを決定する。具体的には、以下の〔数式7〕に従った処理を実行する。
【0074】
〔数式7〕
Zc=-1に初期化し、以下の1)~3)を実行
1)tx≦1の場合、Y=vy・tx+y1,Z=vz・tx+z1を算出、Yis≦Y≦YieかつZis≦Z≦Zieならば、Zはボクセル座標系における交点のz座標であるから視点座標系における交点のz座標をZvとしてZv=Zo・(1-tx)を算出、Zv>ZcならばZc=Zvに置換
2)ty≦1の場合、X=vx・ty+x1,Z=vz・ty+z1を算出、Xis≦X≦XieかつZis≦Z≦Zieならば、Zv=Zo・(1-ty)を算出、Zv>ZcならばZc=Zvに置換
3)tz≦1の場合、X=vx・tz+x1,Y=vy・tz+y1算出、Xis≦X≦XieかつYis≦Y≦Yieならば、Zv=Zo・(1-tz)を算出、Zv>ZcならばZc=Zvに置換
【0075】
〔数式7〕において、1)~3)は、複数実行される場合もあれば、1つも実行されない場合もある。〔数式7〕に従った処理を実行することにより交点Zcが得られる。ただし、得られた結果が視点(z=Zo)より手前(Zc>Zo)となった場合、Zc=Zoと補正し、視点の位置が交点となる。ステップS630においては、レイキャスティング手段61は、レンダリング画像の各画素において、有効領域と、視点に最も近い視線方向のベクトルとの交点Zcを算出している。
【0076】
このようにしてステップS630の処理により、有効領域と仮想光線との交点z座標Zcが算出されたら、次にボクセルの参照処理を実行する(ステップS640)。ボクセルの参照処理においては、参照したボクセルの信号値に対してカラーマップを参照しながら不透明度に変換して不透明なボクセルを探索し探索された不透明なボクセルの信号値に対して更にカラーマップを参照しながらRGB値に変換して、仮想光線強度Trans、RGB各色(c=0,1,2)の累積輝度値Energy(c)を算出する。ステップS640の処理については後述する。
【0077】
仮想光線強度Trans、RGB各色(c=0,1,2)の累積輝度値Energy(c)が算出されたら、レンダリング画像の画素(x,y)における画素値を決定する(ステップS650)。具体的には、以下の〔数式8〕に従った処理を実行する。
【0078】
〔数式8〕
Image(x,y,c)←Image(x,y,c)+K・{Energy(c)+Trans・bg(c)}/L
【0079】
〔数式8〕において、Kは強度倍率であり、本実施形態では、K=1.0である。このようにして、画素(x,y)における画素値が決定したら、レンダリング画像の対象画素をx軸方向に1つだけ移動させた(ステップS660)後、ステップS620~ステップS650の処理を繰り返して実行し、次の画素(x,y)を対象として画素値を算出する。x軸方向の上限X2に達したら、レンダリング画像の対象画素をx軸方向の初期値に移動させる(ステップS670)。この際、x=X1とする。そして、ステップS620~ステップS650の処理を繰り返して実行し、次の画素(x,y)を対象として画素値を算出する。このようにして、X1≦x≦X2、0≦y≦Size-1の範囲の全ての画素について画素値を算出したら、図12に示すステップS440のレイキャスティング処理を終了する。
【0080】
ここで、ステップS640のボクセルの参照処理について説明する。図13は、ステップS640のボクセルの参照処理の詳細を示すフローチャートである。まず、探索開始座標を設定する(ステップS641)。具体的には、探索開始のz座標Zst=Zcに設定する。次に、探索開始座標Zstから先頭の不透明ボクセルのz座標を起点座標として探索する(ステップS642)。
【0081】
ステップS642の起点座標探索処理については、図14を用いて説明する。図14は、起点座標探索手段62が各レンダリング画像の画素において起点座標を探索する処理を示すフローチャートである。起点座標探索手段62は、各対象画素(x,y)について図14に示したフローチャートに従った処理を実行する。
【0082】
起点座標探索手段62は、起点座標を探索する対象画素(x,y)、視点座標系の3次元座標(x,y,z)をセットする(ステップS901)。探索開始座標であるz座標の初期値はz=Zst(上限値)とする。z座標の下限値は0、上限値はZstである。上限値であるZstは視点のz座標である。
【0083】
起点座標探索手段62は、3次元座標(x,y,z)について、座標変換を実施して対応するボクセル画像のボクセルが、透明か否かを判定する(ステップS902)。座標変換は、視点座標系をボクセル座標系に変換する操作であり、GUI側の変換操作とは逆になる。GUI側ではROIによるクリッピング、スケーリング、z軸方向変倍処理、回転、オフセット(xyz軸方向同時)の順に行うものと仮定し、与えられた視点座標系の3次元座標(x,y,z)(整数値)に対応するDICOM形式の複数の断層画像Do(x,y,z)で構成されるボクセル画像のボクセルに対応する実数の座標(xr,yr,zr)を算出する。
【0084】
具体的には、まず、整数値である視点座標系の3次元座標(x,y,z)を実数値(xx,yy,zz)に変換する。視点座標系は、Size×Size×Size/Srayの直方体であり、Sx×Sy×Szのボクセル画像とは独立して定義される。DICOM形式の断層画像のサイズSx×Syは、通常Sx=Sy=512であるため、Size=512とすることが多い。
【0085】
視点座標系のz軸方向は仮想光線サブサンプル(1/Sray)倍(Sray≦1)に拡大されていることを考慮して、最初に、以下の〔数式9〕に従った処理を実行してxyz軸方向同時にオフセット処理を行う。
【0086】
〔数式9〕
xx=x-Size/2+dx+Xoff
yy=y-Size/2+dy+Yoff
zz=z・Sray-Size/2+dz+Zoff
【0087】
続いて、生成された3×3回転逆行列を用いて、以下の〔数式10〕に従った処理を実行して回転処理を行う。
【0088】
〔数式10〕
xx←R11・xx+R12・yy+R13・zz
yy←R21・xx+R22・yy+R23・zz
zz←R31・xx+R32・yy+R33・zz
【0089】
回転処理後の座標として(xx,yy,zz)が得られる。続いて、以下の〔数式11〕に従った処理を実行して、スケーリング、z軸方向変倍処理を同時に行う。
【0090】
〔数式11〕
xr=xx/Scale+Sx/2
yr=yy/Scale+Sy/2
zr=zz/(Scale・Scz)+Sz/2
【0091】
このようにしてボクセル座標系の座標(xr,yr,zr)が算出される。この座標(xr,yr,zr)は実数値である。次に、起点座標探索手段62は、算出されたボクセル座標系の座標(xr,yr,zr)を整数値化する。具体的には、以下の〔数式12〕に従った処理を実行して、整数値化を行う。
【0092】
〔数式12〕
xi=INT[xr+0.5]
yi=INT[yr+0.5]
zi=INT[zr+0.5]
【0093】
〔数式12〕において、INTは[]内の数値の小数点以下を切り捨てて整数化することを意味する。したがって、〔数式12〕に従った処理により、実数値の座標(xr,yr,zr)の各値は、四捨五入されて、整数値の座標(xi,yi,zi)が得られる。
【0094】
このようにして、視点座標系の座標(x,y,z)に対応するボクセル座標系の座標(xi,yi,zi)が得られたら、有効領域、マスクデータMaskおよび不透明度補正テーブルSαを用いて、以下の〔数式13〕に従った処理を実行して、ボクセル座標系の座標(xi,yi,zi)に対応するボクセルが、透明か、不透明か、有効領域外であるかを求める。不透明度補正テーブルSα(x,y,z)は、あらかじめ3次元空間に不透明度に対する補正倍率が定義された多次元伝達関数である。同関数は、内臓が存在する中心部の領域の補正倍率を最大に設定し、周辺に向けて補正倍率を所定の関数で減衰させ、骨領域より外側(体表面:脂肪・筋肉・皮膚層、体外:寝台、ヘッドレスト・固定治具)において補正倍率が0になるように定義される。これを用いて、ボリュームレンダリングを実行すると、骨領域より外側が透明になり、内臓領域のみが露出したボリュームレンダリング像を得ることができる。マスクデータMaskおよび不透明度補正テーブルSαが定義されていない場合、Mask(x,y,z)=Sα(x,y,z)=1とする。
【0095】
〔数式13〕
xi<Xisまたはxi>Xieまたはyi<Yisまたはyi>Yieまたはzi<Zisまたはzi>Zieの場合(すなわち有効領域の外の場合):Vα=-1(無効値)
上記以外の場合(すなわち有効領域の場合):Vα=Vo(xi,yi,zi)
ただし、Vo(x,y,z)=Cmap(Do(x,y,z),3)・Mask(x,y,z)・Sα(x,y,z)と定義する。Cmap(d,c)はカラーマップで、dは断層画像の信号値、cは色および不透明度の成分でc=0(R),1(G),2(B),3(α)である。
【0096】
〔数式13〕において、有効領域の外である場合は、Vαに-1を設定しているが、信号値が有効領域の外であって無効であることを示すことができる値であれば、どのような値であってもよい。
【0097】
Vα=0であればステップS903へ進み、Vα<0であればステップS904へ進み、Vα>0であればステップS905へ進む。すなわち、ボクセルが透明であればステップS903へ進み、ボクセルが有効領域外であればステップS904へ進み、ボクセルが不透明であればステップS905へ進む。
【0098】
ステップS903において、起点座標探索手段62は、z軸方向に所定数のボクセルをスキップする。具体的には現在のz座標から所定数m2(例えばm2=4)を減算する。なお、ステップS740、S760で用いられる所定数m1と比較すると、m2>m1である。本実施形態ではm1=1である。減算した結果、z座標が0以上である場合はステップS902へ戻って同様の処理を繰り返す。z座標が0未満になった場合は、ステップS904へ進む。
【0099】
ステップS904において、起点座標探索手段62は、現在の対象画素(x,y)に対応するz座標に対して、起点座標が見つからなかった旨を示す値(zの本来の下限値が0である場合、例えば-1などの負値)をセットして起点座標の探索処理を終了する。
【0100】
ステップS905に進んだ場合、起点座標探索手段62は、変数iを初期化した後(ステップS905)、m1だけ加算する(ステップS906)。iがm2まで到達した場合、または現在のz座標にiを加算すると視点z座標である上限値Zstに達する場合は、ステップS908に進み、z座標に対して、現在のz座標にm1を加算する前のiを加算した値をセットする。iがm2まで到達しておらず、かつ現在のz座標にiを加算しても視点z座標である上限値Zstまで達しない場合は、ステップS907へ進む。
【0101】
ステップS907において、起点座標探索手段62は、3次元座標(x,y,z+i)について、座標変換を実施して対応するボクセルが透明か否かを判定する。判定手順はステップS902と同じである。ただし、有効領域外であるか否かの判定は行わない。Vα>0であればステップS906へ戻ってiにm1を加算して同様の処理を繰り返す。Vα=0であればステップS908へ進む。
【0102】
ステップS908において、起点座標探索手段62は、現在の対象画素(x,y)に対応して、ステップS907の1つ手前のz座標(z+i-m1)をセットして起点座標の探索を終了する。
【0103】
結局、起点座標探索手段62は、図14に示した処理に従い、視点座標系において、レンダリング画像の各画素(x,y)におけるz座標を探索開始座標Zstより下限値0まで所定数m2ずつ変化させながら、視点座標系の3次元座標(x,y,z)ごとに所定の座標変換を行って対応するボクセル画像のボクセルのボクセル値を順次取得し、最初に見つかった不透明なボクセルの視点座標系におけるz座標を、起点座標として探索している。より具体的には、z座標を所定の上限値より所定の下限値の範囲で前記所定数m1より大きい所定数m2(m2>m1)で減算させて、各3次元座標に対して、座標変換を行ってボクセルが不透明か否かを判定し(S902)、所定数m2の減算後のz座標におけるボクセルの信号値が不透明である場合(S905)は、減算後のz座標より所定数m1を増加させて(S906)各3次元座標(x,y,z)に対して、座標変換を行ってボクセルが不透明か否かを判定している(S907)。
【0104】
図14に示した処理を実行して、起点座標zが探索されたら、図13に示すステップS642の処理を終えたことになる。得られた起点座標zがz<0である場合は、不透明なボクセルが存在しなかったことを意味するので、図13に示したステップS640の処理を終了する。得られた起点座標zがz≧0である場合は、3次元座標(x,y,z)を座標変換してボクセルの不透明度を取得する(ステップS643)。
【0105】
具体的には、ステップS902、S907と同様に〔数式9〕~〔数式11〕に従った処理を実行して、与えられた視点座標系の3次元座標(x,y,z)(整数値)に対応するDICOM形式の複数の断層画像Do(x,y,z)の各画素に1対1で対応するボクセル画像のボクセルに対応する実数の座標(xr,yr,zr)を算出する。
【0106】
次に、算出されたボクセル座標系の座標(xr,yr,zr)を整数値化する。ステップS902、S907の処理とは異なり、まず、小数点以下を切り捨て整数化した座標を(xia,yia,zia)とし、切り捨てた小数点以下の端数を(wx,wy,wz)とする。すなわち、xr=xia+wx,yr=yia+wy,zr=zia+wzとなる。
【0107】
次に、有効領域およびマスクデータMaskを用いて、以下の〔数式14〕に従った処理を実行して、ボクセル座標系の座標(xia,yia,zia)に対応するボクセルの不透明度Vαを求める。以下の〔数式14〕においては、3通りに分けて処理が行われる。〔数式14〕において、Vo(x,y,z)=Cmap(Do(x,y,z),3)・Mask(x,y,z)・Sα(x,y,z)と定義する。
【0108】
〔数式14〕
1)、xia<Xisまたはxia>Xieまたはyia<Yisまたはyia>Yieまたはzia<Zisまたはzia>Zie(有効領域外)の場合:Vα=-1
2)上記1)を満たさず、xia+1>Xieまたはyia+1>Yieまたはzia+1>Zieの場合、補間処理を実行せずにVα=Vo(xia,yia,zia)
3)上記1)2)を満たさない場合、以下の補間処理を実行
Vα=(1-wz)(1-wy)(1-wx)・Vo(xia,yia,zia)
+(1-wz)(1-wy)・wx・Vo(xia+1,yia,zia)
+(1-wz)・wy・(1-wx)・Vo(xia,yia+1,zia)
+(1-wz)・wy・wx・Vo(xia+1,yia+1,zia)
+wz・(1-wy)(1-wx)・Vo(xia,yia,zia+1)
+wz・(1-wy)・wx・Vo(xia+1,yia,zia+1)
+wz・wy・(1-wx)・Vo(xia,yia+1,zia+1)
+wz・wy・wx・Vo(xia+1,yia+1,zia+1)
【0109】
〔数式14〕の3)においては、補間処理を行う際に、実数値のボクセル座標(xr,yr,zr)の近傍に位置する整数値のボクセル座標(xia,yia,zia)等を8個取得し、これら8個の座標値に対応する断層画像、マスクデータ、不透明度補正テーブルの各値を取得し、カラーマップを参照しながら断層画像より取得した各信号値を不透明度に変換した値に所定の重みwx、wy、wz、(1-wx)、(1-wy)、(1-wz)を掛けながら加算した値を、3次元座標に対応するボクセルの不透明度Vαとして与えている。〔数式14〕において、有効領域の外である場合、すなわち有効な領域の外である場合は、Vαに-1を設定しているが、無効であることを示すことができる値であれば、どのような値であってもよい。さらに、ステップS643においては、不透明度Vαを8ビットで取り得る最大値である255で除算して、最大値が1以下となるAlpha(=Vα/255)を算出する。
【0110】
ステップS643における処理の結果、Alpha=0かつz>0であれば、有効領域内で透明な画素を意味するので、ステップS647へ進む。Alpha>0であれば、不透明な画素であることを意味するので、ステップS644へ進む。Alpha<0、またはAlpha=0かつz=0であれば、有効領域外であるか、探索範囲の下限に達したことを意味するので、図13に示したステップS640の処理を終了する。
【0111】
ステップS647において、レイキャスティング手段61は、視点の座標を所定数m1だけ減じる。この所定数m1は整数である。上述のように、本実施形態では、m1=1であり、m1<m2である。そして、ステップS642へ戻って同様の処理を繰り返す。
【0112】
上述のように、Alpha>0であれば、不透明な画素であることを意味するので、レイキャスティング手段61は、RGB値V(c)を取得する(ステップS644)。
【0113】
具体的には、ステップS643と同様、〔数式9〕~〔数式11〕に従った処理を実行して、与えられた視点座標系の3次元座標(x,y,z)(整数値)に対応するDICOM形式の複数の断層画像Do(x,y,z)で構成されるボクセル画像のボクセルに対応する実数の座標(xr,yr,zr)を算出し、小数点以下を切り捨て整数化した座標を(xia,yia,zia)とし、切り捨てた小数点以下の端数を(wx,wy,wz)とする。すなわち、xr=xia+wx,yr=yia+wy,zr=zia+wzとなる。
【0114】
次に、有効領域を用いて、以下の〔数式15〕に従った処理を実行して、ボクセル座標系の座標(xia,yia,zia)に対応するボクセルRGB値V(c)を求める。以下の〔数式15〕においては、3通りに分けて処理が行われる。〔数式15〕において、Vc(x,y,z,c)=Cmap(Do(x,y,z),c)(c=0(R),1(G),2(B))と定義する。尚、RGB値V(c)を算出する際。〔数式14〕と異なり、マスクデータMaskおよび不透明度補正テーブルSαは参照しない。
【0115】
〔数式15〕
1)xia<Xisまたはxia>Xieまたはyia<Yisまたはyia>Yieまたはzia<Zisまたはzia>Zie(有効領域外)の場合:V(c)=0(c=0,1,2)
2)上記1)を満たさず、xia+1>Xieまたはyia+1>Yieまたはzia+1>Zieの場合、補間処理を実行せずにV(c)=Vc(xia,yia,zia,c)
3)上記1)2)を満たさない場合、以下の補間処理を実行
V(c)=(1-wz)(1-wy)(1-wx)・Vc(xia,yia,zia,c)+(1-wz)(1-wy)・wx・Vc(xia+1,yia,zia,c)
+(1-wz)・wy・(1-wx)・Vc(xia,yia+1,zia,c)
+(1-wz)・wy・wx・Vc(xia+1,yia+1,zia,c)
+wz・(1-wy)(1-wx)・Vc(xia,yia,zia+1,c)
+wz・(1-wy)・wx・Vc(xia+1,yia,zia+1,c)
+wz・wy・(1-wx)・Vc(xia,yia+1,zia+1,c)
+wz・wy・wx・Vc(xia+1,yia+1,zia+1,c)
【0116】
〔数式15〕の3)においては、補間処理を行う際に、実数値のボクセル座標(xr,yr,zr)の近傍に位置する整数値のボクセル座標(xia,yia,zia)等を8個取得し、これら8個の座標値に対応する断層画像の各信号値を取得し、カラーマップを参照しながら断層画像より取得した各信号値をRGB値に変換した値に所定の重みwx、wy、wz、(1-wx)、(1-wy)、(1-wz)を掛けながら加算した値を、3次元座標に対応するボクセルのRGB値V(c)として与えている。〔数式15〕の1)において、有効領域の外である場合は、V(c)に0を設定している。
【0117】
本実施形態では、ステップS644においてRGB値V(c)を取得する際、さらに陰影付加処理を行っている。ステップS644においては、陰影付加手段63が、陰影付加処理を行う。これは、所定の照明環境に対応した陰影をボクセル画像に付加する処理であり、具体的にはXs≦x≦XeかつYs≦y≦YeかつZs≦z≦Zeの範囲のボクセルの不透明度αを参照しながら、Xs<x<XeかつYs<y<YeかつZs<z<Zeの範囲のボクセルの色成分を更新する処理である。このために、ある平行光源と環境光成分を設定し、付加すべき陰影の計算を行う。具体的には、視線の向きを示す単位ベクトルとして視線ベクトル(Ex,Ey,Ez)、平行光源の向きを示す単位ベクトルとして光源ベクトル(Lx,Ly,Lz)、環境光成分Ab、拡散反射係数Df(0以上の実数)、鏡面反射係数Sp(0以上の実数)および鏡面光沢度Sh(1以上の整数)を設定する。
【0118】
視線ベクトル(Ex,Ey,Ez)は通常z軸負方向で(Ex,Ey,Ez)=(0,0,-1)の固定値で、光源ベクトル(Lx,Ly,Lz)、拡散反射係数Df、鏡面反射係数Sp、鏡面光沢度Sh、環境光成分Abの数値は、表現したい像の状況に応じて適宜設定することができるが、例えば、(Lx,Ly,Lz)=(0.57735,0.57735,-0.57735)、Df=1.2、Sp=1.7、Sh=8、Ab=0.2と設定する。Lx,Ly,Lzは絶対値が1未満の実数値(負値を含む)、Dfは0以上の実数値、Spは0以上の実数値、Shは1以上の整数値、Abは0以上1以下の実数値である。
【0119】
まず、変換パラメータとして生成された3×3回転逆行列を用いて、以下の〔数式16〕に従った処理を実行して、光源ベクトル(Lx,Ly,Lz)、視線ベクトル(Ex,Ey,Ez)の回転処理を行い、ボクセル座標系におけるベクトルに変換する。
【0120】
〔数式16〕
Lx←R11・Lx+R12・Ly+R13・Lz
Ly←R21・Lx+R22・Ly+R23・Lz
Lz←R31・Lx+R32・Ly+R33・Lz
Ex←R11・Ex+R12・Ey+R13・Ez
Ey←R21・Ex+R22・Ey+R23・Ez
Ez←R31・Ex+R32・Ey+R33・Ez
【0121】
回転処理後の座標としてボクセル座標系における光源ベクトル(Lx,Ly,Lz)、視線ベクトル(Ex,Ey,Ez)が得られる。次に、陰影付加の対象とするボクセル(xia,yia,zia)に対して、ボクセル画像のxy軸方向の解像度をRxy(画素間隔の逆数でmmあたりの画素数で、x軸方向とy軸方向は同一)、ボクセル画像のz軸方向の解像度をRz(断層画像のスライス間隔の逆数で、mmあたりの断層画像のスライス数)として、Rz/Rxy<1の場合、以下の〔数式17〕に従った処理を実行して、実数値z座標zr1、zr2を算出する。これは、z軸方向の解像度がxy軸方向の解像度に比べて低い場合、算出される勾配ベクトルおよび陰影値にz軸方向に沿って段差が発生するため、勾配ベクトルに対してz軸方向に平滑化を施すためである。
【0122】
〔数式17〕
zr1=(zia+1)・Rz/Rxy
zr2=(zia-1)・Rz/Rxy
【0123】
次に、算出された実数値z座標zr1、zr2を整数値化する。まず、小数点以下を切り捨て整数化した実数値z座標をzi1、zi2とし、切り捨てた小数点以下の端数成分をwz1、wz2とする。すなわち、zr1=zi1+wz1,zr2=zi2+wz2となる。
【0124】
続いて、ボクセル(x,y,z)における不透明度をVα(x,y,z)=Cmap(Do(x,y,z),3)として、ボクセル(xia,yia,zia)に対して、xy軸方向に各々正負2近傍、z軸正負方向に各々2近傍からなる全8近傍ボクセルの不透明度であるVα(xia+1,yia,zia)、Vα(xia-1,yia,zia)、Vα(xia,yia+1,zia)、Vα(xia,yia-1,zia)、Vα(xia,yia,zi1)、Vα(xia,yia,zi1+1)、Vα(xia,yia,zi2)、Vα(xia,yia,zi2+1)を取得する。
【0125】
Rz/Rxy≧1の場合、〔数式17〕は実行されないため、Vα(xia,yia,zi1)、Vα(xia,yia,zi1+1)、Vα(xia,yia,zi2)、Vα(xia,yia,zi2+1)の代わりに、z軸方向に正負2近傍のボクセルの不透明度Vα(xia,yia,zia+1)とVα(xia,yia,zia-1)を取得する。
【0126】
ただし、
xia+1>XieのときVα(xia+1,yia,zia)=0、
xia-1<XisのときVα(xia-1,yia,zia)=0、
yia+1>YieのときVα(xia,yia+1,zia)=0、
yia-1<YisのときVα(xia,yia-1,zia)=0、
Rz/Rxy<1の場合、
zi1>ZieのときVα(xia,yia,zi1)=0、
zi1+1<ZieのときVα(xia,yia,zi1+1)=0、
zi2<ZisのときVα(xia,yia,zi2)=0、
zi2+1>ZisのときVα(xia,yia,zi2+1)=0、
Rz/Rxy≧1の場合、
zia+1>ZieのときVα(xia,yia+1,zia+1)=0、
zia-1<ZisのときVα(xia,yia-1,zia-1)=0、
とする。
【0127】
続いて、Rz/Rxy<1の場合、Vα(xia,yia,zi1)、Vα(xia,yia,zi1+1)、Vα(xia,yia,zi2)、Vα(xia,yia,zi2+1)の4近傍ボクセルに対して、端数成分wz1、wz2を用いて、以下の〔数式18〕に従った処理を実行して、z方向に補間し、z軸方向補間成分V´a、V´bを算出する。
【0128】
〔数式18〕
V´a=(1-wz1)・Vα(xia,yia,zi1)+wz1・Vα(xia,yia,zi1+1)
V´b=(1-wz2)・Vα(xia,yia,zi2)+wz2・Vα(xia,yia,zi2+1)
【0129】
そして、ボクセル画像のボクセル(xia,yia,zia)における勾配ベクトル(Gx,Gy,Gz)を以下の〔数式19〕に従った処理を実行することにより算出する。
【0130】
〔数式19〕
Gx=Vα(xia+1,yia,zia)-Vα(xia-1,yia,zia)
Gy=Vα(xia,yia+1,zia)-Vα(xia,yia-1,zia)
Rz/Rxy<1の場合、Gz=V´a-V´b
Rz/Rxy≧1の場合、
Gz=Vα(xia,yia,zia+1)-Vα(xia,yia,zia-1)
G=(Gx2+Gy2+Gz21/2
【0131】
〔数式19〕において、勾配ベクトルのz軸方向成分Gzは、当該ボクセルに対して、z軸方向に+Rz/Rxyずれた座標の近傍の2つのボクセルの不透明度に所定の重みをかけて加算した不透明度と、z軸方向に-Rz/Rxyずれた座標の近傍の2つのボクセルの不透明度に所定の重みをかけて加算した不透明度との差分としている。〔数式19〕において、Gは勾配ベクトル(Gx,Gy,Gz)の大きさである。〔数式19〕に示すように、陰影付加手段63は、ボクセル画像の当該ボクセルのx軸方向、y軸方向、z軸方向の各々2近傍(Rz/Rxy<1の場合、z軸方向は4近傍)のボクセルの不透明度の差分値を勾配ベクトルのx軸方向成分、y軸方向成分、z軸方向成分として算出し、あらかじめ定義されたz軸方向変倍率に基づいてx軸方向・y軸方向成分またはz軸方向成分に補正を施した単位ベクトルを、当該ボクセルにおける勾配ベクトルとして算出する。さらに、G≧1の場合、勾配ベクトル(Gx,Gy,Gz)をGで除算し、勾配ベクトル(Gx,Gy,Gz)を単位ベクトルに置き換える。G<1の場合、ボクセル(xia,yia,zia)において不透明度の勾配が無いため陰影値を算出できず、(Gx,Gy,Gz)=(0,0,0)とし陰影係数Sとして環境光成分Abを与える。
【0132】
勾配ベクトルが算出されたら、公知のPhongシェーディングモデルにより陰影係数Sを算出する。具体的には、まず、鏡面反射係数Sp>0の場合、単位ベクトルである勾配ベクトル(Gx,Gy,Gz)、光源ベクトル(Lx,Ly,Lz)を用いて、以下の〔数式20〕に従った処理を実行することにより、正反射ベクトル(Fx,Fy,Fz)を算出する。鏡面反射係数Sp=0の場合、(Fx,Fy,Fz)=(0,0,0)とする。
【0133】
〔数式20〕
Fx=2・Gx・(Gx・Lx+Gy・Ly+Gz・Lz)-Lx
Fy=2・Gy・(Gx・Lx+Gy・Ly+Gz・Lz)-Ly
Fz=2・Gz・(Gx・Lx+Gy・Ly+Gz・Lz)-Lz
【0134】
〔数式20〕においては、正反射ベクトルは、勾配ベクトルとのなす角が光源ベクトルと勾配ベクトルとのなす角と同一で、かつ光源ベクトルとのなす角が光源ベクトルと勾配ベクトルとのなす角の2倍になるように定義している。次に、勾配ベクトル(Gx,Gy,Gz)、光源ベクトル(Lx,Ly,Lz)、正反射ベクトル(Fx,Fy,Fz)、視線ベクトル(Ex,Ey,Ez)を全て単位ベクトルとして用い、反射係数Df(0以上の実数)、鏡面反射係数Sp(0以上の実数)、鏡面光沢度Sh(1以上の整数)、環境光成分Abの各係数を用いて、以下の〔数式21〕に従った処理を実行することにより、ボクセル(xia,yia,zia)における陰影係数S(xia,yia,zia)を算出する。
【0135】
〔数式21〕
S(xia,yia,zia)=Df・(Gx・Lx+Gy・Ly+Gz・Lz)+Sp・(Fx・Ex+Fy・Ey+Fz・Ez)Sh+Ab
【0136】
〔数式21〕における“Df・(Gx・Lx+Gy・Ly+Gz・Lz)”は拡散反射光であり、 “Sp・(Fx・Ex+Fy・Ey+Fz・Ez)Sh” は鏡面反射光である。〔数式21〕においては、算出された勾配ベクトル(Gx,Gy,Gz)と光源ベクトル(Lx,Ly,Lz)との内積値を基にボクセルの拡散反射光を算出し、鏡面反射係数Spに正の値が設定されている場合、更に勾配ベクトル(Gx,Gy,Gz)に対する所定の光源ベクトル(Lx,Ly,Lz)の正反射ベクトル(Fx,Fy,Fz)を算出し、正反射ベクトル(Fx,Fy,Fz)と所定の視線ベクトル(Ex,Ey,Ez)との内積値を基にボクセルの鏡面反射光を算出し、算出された拡散反射光と鏡面反射光を基に算出した陰影値をレイキャスティング手段により取得された当該ボクセルの色成分に乗算し、当該ボクセルの色成分を下記のように更新する。また、鏡面反射光として、正反射ベクトル(Fx,Fy,Fz)と視線ベクトル(Ex,Ey,Ez)との内積値に対して、鏡面光沢度Shで累乗した値に鏡面反射係数Spを乗算した値としている。陰影係数S(xia,yia,zia)が算出されたら、陰影係数S(xia,yia,zia)を用いて、〔数式15〕により算出されたボクセル(xia,yia,zia)におけるRGB値V(c)=0(c=0,1,2)を、以下の〔数式22〕に従った処理を実行することにより、補正する。すなわち、陰影を付加する。
【0137】
〔数式22〕
V(c)←S(xia,yia,zia)・V(c)
【0138】
〔数式22〕において、c=0,1,2であり、それぞれR,G,Bの色成分に対応する。すなわち、〔数式22〕においては、色成分のみを補正する。結局、陰影付加手段63は、〔数式16〕~〔数式22〕に従った処理を実行することにより、各ボクセルを含むxyz軸方向の近傍に位置する画素の不透明度αを参照して、各ボクセルの色成分の値を補正し、陰影付加を行っている。本実施形態では、好ましい例として、不透明度αを参照する画素として隣接する画素を用いたが、隣接する画素に限定されず、近傍の他の画素を参照するようにしてもよい。
【0139】
ステップS645において、陰影付加されたボクセルのRGB値V(c)が得られたら、累積輝度値Energy(c)と透過光強度Transの更新を行う(ステップS646)。具体的には、以下の〔数式23〕に従った処理を実行して、α値を補正した後、累積輝度値Energy(c)と透過光強度Transを更新する。
【0140】
〔数式23〕
Alpha←1-(1-Alpha)1/Sray
Energy(c)←Energy(c)+Trans・Alpha・V(c)/255
Trans←Trans・(1.0-Alpha)
【0141】
累積輝度Energy(c)、透過光強度Transが更新されたら、Trans<0.001である場合は、図13に示したステップS640の処理を終了する。Trans≧0.001である場合は、zを所定数m1だけ減じる(ステップS646)。本実施形態では、m1=1であり、m1<m2である。そして、zが0以上であれば、ステップS643へ戻って同様の処理を繰り返す。zが0未満であれば、対象とするボクセルがなくなるので、図13に示したステップS640の処理を終了する。
【0142】
〔数式9〕の第3式に示したように、ステップS902におけるオフセット処理の際、zは仮想光線のサブサンプリング倍率Srayと乗じられる。そのため、実質的には、z軸方向においては、所定の参照間隔(m1・Sray)ごとにボクセルが参照されてボクセル画素値V(c)が取得されることになる。したがって、(m1・Sray)>1であれば、z軸方向に対しては、全てのボクセルを参照して処理するのではなく、間引いたボクセルを参照して処理を行うことになる。そのため、z軸方向に対して処理するボクセル数が少なくなり効率化が図られるが、ボリュームレンダリングの場合は画質劣化が目立ってくる(信号値でレンダリング像を生成する3D-MIPの場合は処理負荷がボリュームレンダリングより大きいため、(m1・Sray)>1に設定し、通常はm1=1、Sray=2に設定する)。本実施形態では、m1=1およびSray≦1であることが好ましく、通常はSray=1に設定する。
【0143】
図12に示したステップS630、S640においては、レイキャスティング手段61は、ボクセル画像をレンダリング画像に投影変換した座標系を視点座標系とすると、視点座標系において視線方向であるz軸の上限値を、レンダリング画像の画素(x,y)ごとに算出された視線方向のベクトルと直方体との交点に対応するZcに設定し、視線方向であるz軸の下限値を、視点座標系のz軸方向の下限値である0に設定し、起点座標探索手段62が、探索開始座標をZcとして視点座標系のz軸上のZcから0の範囲で仮想光線の照射を開始する起点座標Zstを探索している。
【0144】
以上のようにして各画素の色成分を得る、図10に示したステップS440の処理を、NB個の各CPUコアが、NB個に分割された各分割画像に対して実行する。そして、得られた分割画像を統合することにより、設定されたSize×SizeのRGBのカラー2次元投影画像であるレンダリング画像が生成される。なお、必ずしも設定されたSize×Sizeの2次元投影画像に一度に統合する必要はなく、各分割画像を処理が完了次第、順次表示させながら、最終的に全ての分割画像を統合させるようにしてもよい。
【0145】
有効領域の境界面、すなわち有効領域の最外周のボクセルの不透明度αの値を0に設定するとともに色成分のRGB値には画素の信号値を基にカラーマップで定義される自然なRGB値を与えることにより、処理負荷を抑制しながら境界面に発生するモアレを抑制することができる。
【0146】
上述のように、本実施形態に係るボリュームレンダリング装置100では、マルチコアCPUであるCPU1がプログラムを実行することにより、不透明外接領域算出手段50、レンダリング手段60が実現される。このプログラムは、読み込んだ断層画像を複数(例えばNAまたはNB個)の断層画像群に分割し、各CPUスレッドに各断層画像群を割り当てて、各CPUスレッドが不透明外接領域の一部を算出する処理、分割生成領域に画素値を割り当てる処理を並行して行う。ボリュームレンダリング装置100を、汎用的なコンピュータであるパソコンで実現した場合について説明する。図15は、コンピュータによりボリュームレンダリング装置100を実現する場合の並列化処理を示す図である。図15は不透明外接領域算出手段50をNA=4個の断層画像群に分割して実行させる例を示しているが、レンダリング手段60をNB=4個の分割生成領域に分割して実行させる場合も同様な構成になる。図15に示すように、不透明外接領域算出手段50、レンダリング手段60が、アプリケーションプログラムにより実現される。例えばNA=4個の断層画像群に分割する場合、アプリケーションプログラムは、4個の各断層画像群に対する処理を4つの処理スレッド♯n1~処理スレッド♯n4に分割する。例えばNB=4個の分割生成領域に分割する場合、アプリケーションプログラムは、4個の各分割生成領域に対する処理を4つの処理スレッド♯n1~処理スレッド♯n4に分割する。そして、不透明外接領域算出手段50、レンダリング手段60(アプリケーションプログラム)が稼働するマルチタスク・オペレーティングシステムのジョブスケジューラが、複数のCPUコアが有するCPUスレッド#1~CPUスレッド#8に割り当てる。
【0147】
図16は、コンピュータによりボリュームレンダリング装置100を実現する場合の並列化処理のソフトウェアによる流れを示す図である。図16は不透明外接領域算出手段50をNA=4個の断層画像群に分割して実行させる例を示しているが、レンダリング手段60をNB=4個の分割生成領域に分割して実行させる場合も同様な構成になる。図16に示すように、不透明外接領域算出手段50、レンダリング手段60を実現するアプリケーションプログラムは、4個の各断層画像群に対する処理、4個の各分割生成領域に対する処理を4つの処理スレッド♯n1~処理スレッド♯n4に分割した後、それぞれ並列処理関数を起動する。そうすると、マルチタスク・オペレーティングシステムのジョブスケジューラが、4つのスレッド♯n1~スレッド♯n4を複数のCPUコアが有するCPUスレッド#3、CPUスレッド#5、CPUスレッド#7、CPUスレッド#2、にそれぞれ割り当てる。このようにして、オペレーティングシステムにより空いているCPUコアのCPUスレッドに、処理すべき処理スレッドが割り当てられるため、並列処理が可能となる。図16の例では、アプリケーションプログラムが各CPUスレッドからの終了メッセージを待ち、全てのCPUスレッドから終了メッセージが得られたら、次の処理に移行する。
【0148】
4コア構成のCPU(Intel CORE-i7)が実装されているWindows10/64bitsのパーソナルコンピュータで実測した結果、図16の構成で512×512×370のボクセル画像を用いてレンダリング手段60をNB=8個の分割生成領域に分割して陰影計算なし実行させる場合にはシングルスレッド実行時(512×512のフル解像度レンダリング画像のCPUによる生成時間:約1.05秒)の3.5倍弱程度の処理速度が得られた (同生成時間:約0.3秒)。しかし、一部のCPUスレッドに処理待ちが生じた。そこで、本願提案の鏡面反射を含む陰影を付加し、8処理スレッドで並列処理を行ったところ、シングルスレッド実行時(同生成時間:約1.8秒)のほぼ4倍の処理性能が得られた(同生成時間:約0.45sec)。さらに、NA>8に上げて実験した結果、処理性能は殆ど変化せず4倍で頭打ちであり、陰影計算を加えると絶対的な処理時間は増大するが、4コア構成による並列化効果は得られやすかった。尚、上記処理時間には不透明外接領域算出手段50による処理時間も含まれており、レンダリング手段60に比べ桁違いに処理時間が短いため、不透明外接領域算出手段50による単独のマルチスレッド化による並列処理の効果は実測困難であった。
【0149】
<3.断層画像の階調落とし>
上記実施形態では、各画素が16ビットの信号値を記録した断層画像をそのまま用いてレンダリング画像を作成するようにしたが、断層画像を8ビットに階調変換して階調低下画像を作成した後、レンダリング画像を作成するようにしてもよい。断層画像を8ビットに階調変換することにより、各画素の処理における負荷を削減することができ、ボリュームレンダリング像の高速な生成に寄与する。実測の結果、2割程度の削減効果が得られ、4コアCPU構成で8スレッドで陰影付きレンダリングを実行した場合、16ビット信号値の断層画像を用いた場合、約0.45secであったのに対し、8ビット信号値の階調低下断層画像を用いた場合、約0.36secに短縮され、生成されるレンダリング画像の差異は殆ど認められなかった。
【0150】
この場合、断層画像階調変換手段を更に設け、断層画像読込手段10が単一の断層画像を読み込むごとに、階調変換を行う。具体的には、一連のDICOM形式の断層画像Do(x,y,z)(-32768≦Do(x,y,z)≦32767,0≦x≦Sx-1,0≦y≦Sy-1,0≦z≦Sz-1; 解像度:Rxy,Rz)の中で、Sz/2番目の中間の断層画像Do(x,y,z/2)を最初に読み込み、同断層画像における全ての画素の最小値をDmin、最大値をDmaxとする。DminとDmaxは全ての断層画像より最小値と最大値を求める方法をとっても良いが、中間の断層画像だけで決定する方法をとると、大容量の16ビットの原断層画像の全てのスライス分を読み込んでメモリ上に保持することなく、階調低下画像である階調圧縮断層画像D8(x,y,z)だけをメモリ上に直接構築できる。続いて、以下の〔数式24〕に従った処理を実行して、下限値Lmin および上限値Lmaxを算出する。
【0151】
〔数式24〕
下限値Lmin=(Dmax-Dmin)・γ+Dmin
上限値Lmax=(Dmax-Dmin)・(1-γ)+Dmin
【0152】
〔数式24〕において、γは階調圧縮画像のコントラスト調整幅で、0に近いほどコントラストが増大するが輝度が小さくなる。γは0.3未満の実数値であるが、通常はγ=0.1に設定する。レンダリング画像の輝度コントラストはカラーマップなど種々の設定で調整できるので、γは固定で良い。そして、下限値Lminおよび上限値Lmaxの範囲を256段階に圧縮して階調圧縮断層画像D8(x,y,z)を得る。具体的には、階調圧縮断層画像D8(x,y,z)(0≦D8(x,y,z)≦255,0≦x≦Sx-1,0≦y≦Sy-1,0≦z≦Sz-1; 解像度:Rxy,Rz)としたとき、以下の〔数式25〕に従った処理を実行して、階調圧縮断層画像D8(x,y,z) を算出する。
【0153】
〔数式25〕
D8(x,y,z)=(Do(x,y,z)-Lmin)・255/(Lmax-Lmin)
D8(x,y,z)>255の場合:D8(x,y,z)=255、D8(x,y,z)<0の場合:D8(x,y,z)=0
【0154】
〔数式25〕の第2式に示すように、信号値が上限値Lmaxを超える場合は255、下限値Lminを下回る場合は0として、下限値Lminから上限値Lmaxの範囲を0から255に線形変換する。なお、階調圧縮断層画像を用いてボクセル画像を作成する場合、図5のカラーマップに代えて、階調低下画像用のカラーマップとして、8ビットの信号値用のカラーマップを用意しておく。具体的には、信号値0~255に対応付けてR,G,B、αが記録されたカラーマップを用いる。
【0155】
以上、本開示の好適な実施形態について説明したが、本開示は上記実施形態に限定されず、種々の変形が可能である。例えば、上記実施形態では、CPU1として、複数のCPUコアを有し、並列処理が可能なマルチコアCPUを用いるようにしたが、1つのCPUコアが1つの処理スレッドの処理のみを行うシングルコアCPUを用いるようにしてもよい。
【0156】
また、上記実施形態では、モアレ対策を行うため、有効領域の最外周のボクセルの不透明度を0とするようにしたが、モアレが目立たない場合は、必ずしも有効領域の最外周のボクセルの不透明度を0とする必要はない。
【符号の説明】
【0157】
1・・・CPU(Central Processing Unit)
2・・・RAM(Random Access Memory)
3・・・記憶装置
4・・・指示入力I/F
5・・・データ入出力I/F
6・・・表示部
7・・・GPU
8・・・フレームメモリ
10・・・断層画像読込手段
20・・・カラーマップ読込手段
30・・・ROIクリッピング設定手段
40・・・マスク設定手段
50・・・不透明外接領域算出手段
60・・・レンダリング手段
61・・・レイキャスティング手段
62・・・起点座標探索手段
63・・・陰影付加手段
70・・・レンダリング画像出力手段
100・・・ボリュームレンダリング装置
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16