Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

obliqueslice

3 次元ボリューム データからの斜体スライスの抽出

説明

B = obliqueslice(V,point,normal) は、2 次元斜体スライスを 3 次元ボリューム データ V から抽出します。スライスは、ボリューム上の指定された点への参照と法線ベクトルと共に抽出されます。スライス平面は法線ベクトルに対して垂直であり、指定された点を通過しています。

指定された点と法線に対してスライスがどのように抽出されるかは、斜体スライスを参照してください。抽出されたスライスのイメージ平面における向きは、3 次元座標空間における位置に依存します。詳細は、イメージ平面におけるスライスの向き を参照してください。

B = obliqueslice(___,Name,Value) では、前の構文の入力引数に加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。

[B,x,y,z] = obliqueslice(___) は、抽出されたスライスの入力ボリュームにおける 3 次元直交座標も返します。

すべて折りたたむ

3 次元ボリューム データをワークスペースに読み込みます。

load mri

関数 squeeze を使用して、大きさが 1 の次元を削除します。

V = squeeze(D);

関数 montage を使用して、データの水平スライスを表示します。

figure
montage(V,map,'Size',[3 9]);

スライスが通過するボリューム内の点を指定します。

point = [73 50 15.5];

3 次元座標空間における平面に法線ベクトルを指定します。

normal = [0 15 20];

ボリューム データからスライスを抽出します。スライスは法線ベクトルに対して垂直であり、指定された点を通過しています。

[B,x,y,z] = obliqueslice(V,point,normal);

抽出されたスライスを 3 次元座標空間に表示します。

fig = figure;
axes1 = axes('Parent',fig,'Position',[0.13 0.4 0.37 0.5]);
surf(x,y,z,B,'EdgeColor','None','HandleVisibility','off','Parent',axes1);
grid on
view([-62.6 13.8])
colormap(gray)
xlabel('x-axis')
ylabel('y-axis');
zlabel('z-axis');
title('Position of Slice in 3-D Coordinate Space')

点と法線ベクトルをプロットします。

hold on
plot3(point(1),point(2),point(3),'or','MarkerFaceColor','r');
plot3(normal(1),normal(2),normal(3),'ob','MarkerFaceColor','b');
hold off
legend('Point in the volume','Normal vector','Position',[0.15 0.2 0.3 0.08])

抽出されたスライスをイメージ平面に表示します。

axes2 = axes('Parent',fig,'Position',[0.59 0.52 0.33 0.6]);
imshow(B,[],'Parent',axes2)
title('Output Slice in Image Plane')

3 次元ボリューム データをワークスペースに読み込みます。

s = load(fullfile(toolboxdir('images'),'imdata','BrainMRILabeled','images','vol_001.mat'));
V = s.vol;

関数 montage を使用して、データの水平スライスを表示します。

figure
montage(V,'Indices',12:118,'Size',[8 12],'DisplayRange',[]);

3 次元座標空間における平面に法線ベクトルを指定します。

normal = [10 0 5];

for ループを使用して、法線ベクトルの方向に沿って複数スライスを抽出します。反復ごとに、スライスが通過する点を指定します。出力サイズを 'Full' に設定し、パディングするピクセルの塗りつぶしの値を 255 に設定します。

cnt = 1;
for xslice = 10:5:180
    point{cnt} = [xslice 150 80];
    [B(:,:,cnt),x(:,:,cnt),y(:,:,cnt),z(:,:,cnt)] = obliqueslice(V,point{cnt},normal,...
                                                    'OutputSize','Full','FillValues',255);
    cnt = cnt+1;
end    

抽出されたスライスを表示します。抽出されたスライスは法線ベクトルに対して垂直であり、指定された点を通過しています。

figure
for slice = 1:size(B,3)
    subplot('Position',[0.11 0.36 0.38 0.5])
    surf(x(:,:,slice),y(:,:,slice),z(:,:,slice),B(:,:,slice), ...
        'EdgeColor','None','HandleVisibility','off');
    grid on
    view([-24 12])
    colormap(gray)
    xlabel('x-axis')
    ylabel('y-axis');
    zlabel('z-axis');
    zlim([0 155]);
    ylim([0 250]);
    xlim([0 250]);
    title('Position of Slice in 3-D Coordinate Space') 
    % Plot the point and the normal vector.
    hold on
    plot3(point{slice}(1),point{slice}(2),point{slice}(3),'or','MarkerFaceColor','r');
    plot3(normal(1),normal(2),normal(3),'ob','MarkerFaceColor','b');
    legend('Point in the volume','Normal vector','Position',[0.1 0.12 0.3 0.08])
    hold off   
    % Display the extracted slice.
    subplot('Position',[0.6 0.37 0.34 0.49])
    imshow(B(:,:,slice),[])
    title('Output Slice in Image Plane')
    pause(0.5);   
end

関数 montage を使用して、抽出されたイメージ スライスを表示します。

figure
montage(B,'Size',[5 7],'DisplayRange',[]);

入力引数

すべて折りたたむ

入力ボリューム。3 次元の数値配列 または categorical 配列として指定します。

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

ボリューム内の点。[px py pz] 形式の 3 要素行ベクトルとして指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

法線ベクトル。[a b c] 形式の 3 要素行ベクトルとして指定します。

直交スライスを抽出するには、法線ベクトルを次のいずれかの値に設定します。

  • [1 0 0] — yz 平面のスライスを抽出します。

  • [0 1 0] — xz 平面のスライスを抽出します。

  • [0 0 1] — xy 平面のスライスを抽出します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: obliqueslice(V,point,normal,'OutputSize','Full')

内挿法。'Method' と次の値のいずれかで構成されるコンマ区切りのペアとして指定します。

  • 'linear' — 線形内挿

  • 'nearest' — 最近傍内挿

V が数値の場合、内挿法の既定の設定は 'linear' ですが、'nearest' を指定することもできます。V が categorical の場合、内挿法は 'nearest' でなければなりません。

データ型: char | string

出力イメージのサイズ。'OutputSize' と次の値のいずれかで構成されるコンマ区切りのペアとして指定します。

  • 'limit' — 出力イメージのサイズは、入力ボリュームの次元に対する 2 次元スライスの実際のサイズになります。抽出されたスライス領域が正方形または四角形でない場合、この関数は抽出されたスライス領域にピクセルを付加して自動的にパディングし、正方形または長方形のイメージにします。

  • 'full' — 出力イメージのサイズは、2 次元スライスの実際のサイズと等しくならない場合があります。出力イメージのサイズは、法線ベクトル normal において入力ボリュームから取得可能な最大スライス サイズに設定されます。イメージのサイズを変更するため、抽出された 2 次元スライスの境界に行および列が付加されてパディングされます。

    パディングされたピクセルの塗りつぶしの値は、既定では 0 です。名前と値のペアの引数 'FillValues' を使用して、この値を変更できます。

データ型: char | string

パディングされたピクセルの塗りつぶしの値。'FillValues' と、スカラー、文字ベクトル、または missing で構成されるコンマ区切りのペアとして指定します。

V が数値配列の場合は、次のように指定します。

  • ゼロ パディングをする場合、0。

  • 定数パディングをする場合、スカラー。

V が categorical 配列の場合は、次のように指定します。

  • 入力データのカテゴリを示す文字ベクトル。カテゴリを確認するには、関数 categories を使用します。

  • 入力データのカテゴリが <undefined> と等しい場合は、missing

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

出力引数

すべて折りたたむ

出力 2 次元スライス。サイズが m 行 n 列の数値行列 または categorical 行列として返されます。出力スライスのデータ型は、入力ボリュームのデータ型と同じになります。

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

3 次元ボリュームにおける出力スライスの x 座標。出力スライスと同じサイズの m 行 n 列の行列として返されます。

データ型: single

3 次元ボリュームにおける出力スライスの y 座標。出力スライスと同じサイズの m 行 n 列の行列として返されます。

データ型: single

3 次元ボリュームにおける出力スライスの z 座標。出力スライスと同じサイズの m 行 n 列の行列として返されます。

データ型: single

詳細

すべて折りたたむ

斜体スライス

指定された点 (px, py, pz) と法線ベクトル (a, b, c) に従い、この関数は平面の方程式 a(x-px)+b(y-py)+c(z-pz) = 0 を解きます。

(px, py, pz) はボリューム データ内にあります。スライス平面は法線ベクトルに対して垂直であり、指定された点を通過しています。

イメージ平面におけるスライスの向き

抽出されたスライスのイメージ平面における向きは、水平面と垂直面に対する傾斜角に依存します。

ボリューム データにおいて最後のスライスの原点 (0, 0, P) に近いスライスの角が、イメージ平面の左上のピクセルとなります。イメージ平面のピクセル値を埋めるには、スライスの角から開始し、左から右、上から下というスキャン順序で強度値を読み取ります。

参考

関数

オブジェクト

R2020a で導入