Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

volshow

    説明

    数値配列

    vol = volshow(V) は、3-D ボリューム V を表示する Volume オブジェクトを作成します。マウスを使用して、表示を対話形式で回転および拡大縮小することもできます。Volume オブジェクトを作成した後は、vol を使用して、このオブジェクトのプロパティをクエリおよび変更します。プロパティの一覧については、Volume Properties を参照してください。

    vol = volshow(V,config) は、config 構造体で指定された Volume オブジェクトのプロパティの値を使用して、3-D ボリューム V を表示します。

    vol = volshow(V,Name=Value) は、1 つ以上の名前と値の引数を使用してボリュームの外観を変更します。たとえば、volshow(V,RenderingStyle="Isosurface") は、3-D ボリューム V を表示して、レンダリング スタイルを "Isosurface" に設定します。

    ブロック化されたイメージ ボリューム

    R2023a 以降

    bVol = volshow(bim) は、ブロック化された 3-D イメージ bim を表示する BlockedVolume オブジェクトを作成します。マウスを使用して、表示を対話形式で回転および拡大縮小することもできます。BlockedVolume オブジェクトを作成した後は、bVol を使用して、このオブジェクトのプロパティをクエリおよび変更します。プロパティの一覧については、BlockedVolume Properties を参照してください。

    bVol = volshow(bim,Name=Value) は、1 つ以上の名前と値の引数を使用してブロック化されたボリュームの外観を変更します。たとえば、ResolutionLevel="coarse" は、表示する解像度レベルを最も粗い解像度レベルに指定します。

    メモ

    Medical Imaging Toolbox™ は関数 volshow (Image Processing Toolbox™) の機能を拡張し、患者座標系の medicalVolume (Medical Imaging Toolbox) オブジェクトを表示します。詳細については、volshow (Medical Imaging Toolbox) を参照してください。

    すべて折りたたむ

    MRI データをワークスペースに読み込み、大きさが 1 の次元を削除します。

    load mri
    V = squeeze(D);

    MRI イメージに適したカラーマップと透明度 (アルファ) マップを生成します。

    intensity = [0 20 40 120 220 1024];
    alpha = [0 0 0.15 0.3 0.38 0.5];
    color = [0 0 0; 43 0 0; 103 37 20; 199 155 97; 216 213 201; 255 255 255]/255;
    queryPoints = linspace(min(intensity),max(intensity),256);
    alphamap = interp1(intensity,alpha,queryPoints)';
    colormap = interp1(intensity,color,queryPoints);

    この MRI スキャンのボクセル サイズは不均一、すなわち異方性のある 1×1×2.5 mm です。適切なボクセル次元にイメージをスケーリングする変換行列を指定します。

    sx = 1;
    sy= 1;
    sz = 2.5;
    A = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1];

    スケーリングを実行する affinetform3d オブジェクトを作成します。

    tform = affinetform3d(A);

    カスタムのカラーマップ、透明度マップ、および変換を使用してボリュームを表示します。マウスをドラッグして、ボリュームを回転させます。スクロール ホイールを使用して、ボリュームを拡大および縮小します。

    vol = volshow(V,Colormap=colormap,Alphamap=alphamap,Transformation=tform);

    この例では、Medical Segmentation Decathlon データ セット [1] のサブセットを使用します。このサブセット データには、2 つの胸部 CT ボリュームとそれに対応するラベル イメージが含まれており、それらのデータは NIfTI ファイル形式で保存されています。

    次のコードを実行し、MathWorks® の Web サイトから MedicalVolumNIfTIData.zip ファイルをダウンロードしてファイルを解凍します。データ ファイルのサイズは約 76 MB です。

    zipFile = matlab.internal.examples.downloadSupportFile("medical", ...
        "MedicalVolumeNIfTIData.zip");
    filepath = fileparts(zipFile);
    unzip(zipFile,filepath)

    dataFolder フォルダーには、ダウンロードして解凍したデータが格納されます。

    dataFolder = fullfile(filepath,"MedicalVolumeNIfTIData");

    この例で使用するボリュームとラベル イメージのファイル名を指定します。

    dataFile = fullfile(dataFolder,"lung_043.nii.gz");
    labelDataFile = fullfile(dataFolder,"LabelData","lung_043.nii.gz");

    イメージ ファイルからイメージ データとメタデータを読み取ります。

    V = niftiread(dataFile);
    info = niftiinfo(dataFile);

    このボリュームの透明度マップとカラーマップを定義します。この例で使用する値は、手作業による試行錯誤で決定されたものです。

    alpha = [0 0 0.7 1.0];
    color = [0 0 0; 200 140 75; 231 208 141; 255 255 255] ./ 255;
    intensity = [-3024 -700 -400 3071];
    queryPoints = linspace(min(intensity),max(intensity),256);
    alphamap = interp1(intensity,alpha,queryPoints)';
    colormap = interp1(intensity,color,queryPoints);

    この MRI スキャンのボクセル サイズは不均一です (つまり、異方性があります)。ファイルのメタデータからボクセルの間隔を抽出し、正しい寸法でボリュームを表示するための変換を定義します。

    voxelSize = info.PixelDimensions;
    sx = voxelSize(2);
    sy= voxelSize(1);
    sz = voxelSize(3);
    A = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1];

    スケーリングを実行する affinetform3d オブジェクトを作成します。

    tform = affinetform3d(A);

    ボリュームを 3 次元オブジェクトとして表示します。レンダリング スタイルを "CinematicRendering" として指定します。シネマティック レンダリング スタイルでは、各ボクセルに指定された色と透明度に基づいてボリュームが表示され、反復的な後処理によってフォトリアリスティックな影とライティングが生成されます。

    viewer = viewer3d;
    vol = volshow(V,Parent=viewer, ...
        RenderingStyle="CinematicRendering", ...
        Colormap=colormap, ...
        Alphamap=alphamap, ...
        Transformation=tform);

    一時停止して反復的な後処理をすべて適用してから、ライブ エディターで表示を更新します。

    pause(3)
    drawnow

    参考文献

    [1] Medical Segmentation Decathlon. "Lung." Tasks. Accessed May 10, 2018. http://medicaldecathlon.com/. Medical Segmentation Decathlon データ セットは、CC-BY-SA 4.0 のライセンスに基づいて提供されています。一切の保証および表明を行いません。詳細については、ライセンスを参照してください。

    グレースケール ボリュームをワークスペースに読み込み、volshow を使用してそのボリュームを表示します。

    load("spiralVol.mat")
    h = volshow(spiralVol);
    viewer = h.Parent;
    hFig = viewer.Parent;
    drawnow

    アニメーションの保存先とする GIF ファイルの名前を指定します。

    filename = "animatedSpiral.gif";

    ボリュームの中心にカメラを向けます。

    sz = size(spiralVol);
    center = sz/2 + 0.5;
    viewer.CameraTarget = center;

    アニメーションのフレーム数を指定してから、ボリュームの中心付近の円内にカメラ位置の配列を作成します。

    numberOfFrames = 12;
    vec = linspace(0,2*pi,numberOfFrames)';
    dist = sqrt(sz(1)^2 + sz(2)^2 + sz(3)^2);
    myPosition = center + ([cos(vec) sin(vec) ones(size(vec))]*dist);

    各カメラ位置で、表示を更新して、フレームを GIF ファイルに書き込みます。ファイルはビデオ ビューアーで再生できます。

    for idx = 1:length(vec)
        % Update the current view
        viewer.CameraPosition = myPosition(idx,:);
        % Capture the image using the getframe function
        I = getframe(hFig);
        [indI,cm] = rgb2ind(I.cdata,256);
        % Write the frame to the GIF file
        if idx==1
            % Do nothing. The first frame displays only the viewer, not the
            % volume.
        elseif idx == 2
            imwrite(indI,cm,filename,"gif",Loopcount=inf,DelayTime=0)
        else
            imwrite(indI,cm,filename,"gif",WriteMode="append",DelayTime=0)
        end
    end

    animatedSpiral.gif

    この例では、500×500×2500 の大きなイメージ ボリュームを作成します。2.5 GB のボリュームを作成して保存するために十分なメモリがマシンにない場合は、この例を実行する前に、imSize を小さくしてください。

    imSize = [500,500,2500];

    バブルの 3-D イメージ シミュレーション V を作成します。これには数分かかることがあります。

    V = rand(imSize,"single");
    BW = false(size(V));
    BW(V < 0.000001) = true;
    V = bwdist(BW);
    V(V <= 20) = 1;
    V(V > 20) = 0;

    V を直接表示しようとすると、volshow はボリュームが大きすぎるというエラーを返します。代わりに、V を指す、ブロック サイズが 500×500×500 ボクセルの blockedImage オブジェクトを作成します。

    bim = blockedImage(V,BlockSize=[500,500,500]);

    volshow を使用して blockedImage を表示します。関数 volshow は一度に 1 つずつブロックをメモリに読み取り、個々のブロック レンダリングを繋ぎ合わせて最終的なボリュームを生成します。

    bVol = volshow(bim);

    入力引数

    すべて折りたたむ

    3-D ボリューム。数値配列として指定します。

    データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical | char

    ボリューム ビューアーによってエクスポートされたレンダリング情報。構造体として指定します。

    データ型: struct

    ブロック化されたイメージ ボリューム。グレースケール データ、RGB データ、または RGBA データの 3-D ブロックを読み取る blockedImage オブジェクトとして指定します。ブロック化されたイメージには単一の解像度レベルまたは複数の解像度レベルを指定できます。

    名前と値の引数

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

    例: volshow(V,RenderingStyle="Isosurface") は、3-D ボリューム V を表示して、レンダリング スタイルを "Isosurface" に設定します。

    メモ

    ここには一部のプロパティのみを示します。インメモリ ボリュームのプロパティの完全なリストについては、Volume Properties を参照してください。ブロック化されたボリュームのプロパティの完全なリストについては、BlockedVolume Properties を参照してください。

    Volume オブジェクトまたは BlockedVolume オブジェクトの親。Viewer3D オブジェクトとして指定します。関数 viewer3d を使用して Viewer3D オブジェクトを作成できます。親を指定せずに volshow を呼び出した場合、この関数は新しい Viewer3D オブジェクトを作成し、そのオブジェクトを親に設定します。Volume オブジェクトまたは BlockedVolume オブジェクトを再び親にすることはできません。

    レンダリング スタイル。次の表のいずれかの値を指定します。

    説明
    "VolumeRendering"各ボクセルに指定された色と透明度に基づいてボリュームを表示します。
    "CinematicRendering"

    各ボクセルに指定された色と透明度に基づいてボリュームを表示し、反復的な後処理によってフォトリアリスティックな影とライティングを生成します。

    このレンダリング スタイルは、不透明なボリュームを表示する場合に役立ちます。

    "LightScattering"

    ボリュームを通過する光の吸収、内部散乱、および外部散乱をシミュレートするボリューム光散乱モデルを使用してボリュームを表示します。

    このレンダリング スタイルは、煙、霧、雲のように強度勾配が緩やかな半透明ボリュームを表示する場合に役立ちます。

    "MaximumIntensityProjection"投射された各光線の強度値がデータ全体で最も大きいボクセルを表示します。RGB ボリュームの場合、CIE 1976 L*a*b* 色空間で最大の輝度をもつボクセルを表示します。
    "MinimumIntensityProjection"投射された各光線の強度値がデータ全体で最も小さいボクセルを表示します。RGB ボリュームの場合、CIE 1976 L*a*b* 色空間で最小の輝度をもつボクセルを表示します。
    "GradientOpacity"

    指定された色と透明度に基づいてボリュームを表示します。ボクセルの強度 (グレースケール ボリュームの場合) または輝度 (RGB ボリュームの場合) が表示用の光線に沿った前のボクセルと似ている場合は、追加の透明度が適用されます。

    "GradientOpacity" を使用して強度が一様なボリュームをレンダリングすると、そのボリュームの内側部分が "VolumeRendering" レンダリング スタイルより高い透明度で表示され、ボリュームの強度または輝度の勾配が見やすくなります。

    "Isosurface"

    IsosurfaceValue プロパティの値で指定されるボリュームの等値面を表示します。

    "SlicePlanes"

    3 つの直交スライス平面を表示します。

    ボリューム コンテンツの透明度マップ。[0, 1] の範囲の値をもつ n 要素の列ベクトルとして指定します。ベクトルの最大長は 256 です。RGB ボリュームを表示する場合、このオブジェクトは CIE 1976 L*a*b* 色空間のボクセルの輝度を使用して、透明度マップから透明度を割り当てます。AlphaData プロパティが空でない場合、Alphamap プロパティは効果がありません。

    グレースケール ボリューム データのカラーマップ。範囲 [0, 1] の値をもつ n 行 3 列の数値行列として指定します。色数 n の最大値は 256 です。RGB ボリュームを表示する場合、このプロパティは効果がありません。

    レンダリング時にオブジェクト データと混合されるオーバーレイ データ。次のいずれかの値を指定します。

    • インメモリ ボリューム配列 V を表示する場合は、OverlayData を数値配列として指定します。

    • ブロック化されたイメージ ボリューム bim を表示する場合は、OverlayData を、3-D グレースケール データのブロックを読み取る blockedImage オブジェクトとして指定します。

    ビューアーは、RenderingStyle プロパティ値が "SlicePlanes""VolumeRendering"、または "GradientOpacity" の場合にのみオーバーレイを表示します。OverlayRenderingStyleOverlayColormap プロパティ、および OverlayAlphamap プロパティを変更すると、オーバーレイの外観を変更できます。

    オーバーレイのレンダリング スタイル。次の表のいずれかの値を指定します。

    説明
    "LabelOverlay"

    各ラベル付き領域の色と透明度に基づいてオーバーレイを表示します。このレンダリング スタイルを使用して、表示するデータの上にバイナリ セグメンテーションやセマンティック セグメンテーションの結果のような順序データを可視化します。

    "VolumeOverlay"

    各ボクセルに指定された色と透明度に基づいてオーバーレイを表示します。

    "GradientOverlay"

    各ボクセルの色と透明度に基づいてオーバーレイを表示します。現在のボクセルと、表示用の光線に沿った前のボクセルとの違いに基づいて、追加の透明度が適用されます。

    出力引数

    すべて折りたたむ

    ボリューム。Volume オブジェクトとして返されます。ボリュームの特性変更の詳細については、Volume Properties を参照してください。

    ブロック化されたボリューム。BlockedVolume オブジェクトとして返されます。ボリュームの特性変更の詳細については、BlockedVolume Properties を参照してください。

    詳細

    すべて折りたたむ

    イベント

    特定のイベントが発生したときに Volume オブジェクトまたは BlockedVolume オブジェクトから通知を受け取るには、これらのイベントに対する "リスナー" を設定します。これらのイベントのいずれかが発生したときに実行するコールバック関数を指定できます。オブジェクトがリスナーを通じてアプリケーションに通知するとき、イベントに固有のデータを返します。特定のイベントのイベント クラスを確認して何が返されたかを調べます。

    イベント名トリガーイベント データイベント属性
    ClippingPlanesChanging

    オブジェクトのクリッピング平面が対話的に移動している。クリッピング平面がプログラムで移動している場合、このイベントは実行されません。

    images.ui.graphics3d.events.ClippingPlanesChangedEventData

    NotifyAccess: private

    ListenAccess: public

    ClippingPlanesChangedオブジェクトのクリッピング平面が対話的な移動を停止している。クリッピング平面がプログラムで移動している場合、このイベントは実行されません。images.ui.graphics3d.events.ClippingPlanesChangedEventData

    NotifyAccess: private

    ListenAccess: public

    SlicePlanesChanging

    オブジェクトのスライス平面が対話的に移動している。スライス平面がプログラムで移動している場合、このイベントは実行されません。

    images.ui.graphics3d.events.SlicePlanesChangedEventData

    NotifyAccess: private

    ListenAccess: public

    SlicePlanesChangedオブジェクトのスライス平面が対話的な移動を停止している。スライス平面がプログラムで移動している場合、このイベントは実行されません。images.ui.graphics3d.events.SlicePlanesChangedEventData

    NotifyAccess: private

    ListenAccess: public

    DataReadStartedBlockedVolume オブジェクトがシーン内でレンダリングされるデータのブロックを送信している。このイベントは、Volume オブジェクトに対しては適用されません。event.EventData

    NotifyAccess: private

    ListenAccess: public

    DataReadFinishedBlockedVolume オブジェクトがシーン内で表示されるデータのすべてのブロックを送信した。このイベントは、Volume オブジェクトに対しては適用されません。event.EventData

    NotifyAccess: private

    ListenAccess: public

    バージョン履歴

    R2018b で導入

    すべて展開する