# worldToSubscript

Convert from patient coordinates to row and column subscripts

Since R2022b

## Description

example

[row,col,slice] = worldToSubscript(R,X,Y,Z) maps points from the patient coordinate system to the nearest subscript indices row, col, and slice, using the spatial referencing information, R.

For a point, n, if the input coordinates (Xn, Yn, Zn) fall outside the image bounds, worldToSubscript extrapolates rown, coln, and slicen outside the image bounds in the intrinsic coordinate system and rounds to the nearest integer values.

## Examples

collapse all

Map 3-D patient coordinates from a chest CT volume, saved as a directory of DICOM files, to image subscripts. The volume is part of a data set containing three CT volumes. The size of the entire data set is approximately 81 MB. Download the data set from the MathWorks® website, then unzip the folder.

filepath = fileparts(zipFile);
unzip(zipFile,filepath)

Specify the directory of the DICOM files for the first CT volume in the data set.

dataFolder = fullfile(filepath,"MedicalVolumeDICOMData","LungCT01");

Create a medical volume object that contains the image and spatial metadata for the CT volume.

medVol = medicalVolume(dataFolder);

The VolumeGeometry property of the medical volume object contains a medicalref3d object that specifies the spatial referencing for the volume. Extract the medicalref3d object for the chest CT.

R = medVol.VolumeGeometry;

Select three sample points, and store their (x,y,z) patient coordinates, in millimeters. For example, the first point has patient coordinates of (100, 101, –200), in mm. The third point is outside the image boundary.

X = [100 100 190];
Y = [101 101.2 -190];
Z = [-200 -100 -300];

Convert the world coordinates to row, column, and slice indices. The worldToSubscript function rounds the transformed world coordinates to integer values. The function extrapolates the subscripts of the point outside the image boundary.

If you receive a warning that an approximate mapping is being used, then the image volume is nearly but not perfectly affine. This might be due to small numeric precision errors in how the data was encoded in the file, or due to the discrete step sizes of motors used to move the patient through the scanner. If an approximate mapping is used, you might expect small errors, on the order of millimeters in patient coordinates.

[row,col,slice] = worldToSubscript(R,X,Y,Z)
Warning: An approximate world to intrinsic mapping is being used.
row = 1×3

394   394   518

col = 1×3

396   396    -4

slice = 1×3

154   343   -34

## Input Arguments

collapse all

Spatial referencing information, specified as a medicalref3d object.

Coordinates along the x-dimension in the patient coordinate system, specified as a numeric array.

X, Y, and Z must be the same size.

Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Coordinates along the y-dimension in the patient coordinate system, specified as a numeric array.

X, Y, and Z must be the same size.

Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Coordinates along the z-dimension in the patient coordinate system, specified as a numeric array.

X, Y, and Z must be the same size.

Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

## Output Arguments

collapse all

Row subscript indices, returned as a positive integer array. row is the same size as X.

Data Types: double

Column subscript indices, returned as a positive integer array. col is the same size as X.

Data Types: double

Slice subscript indices, returned as a positive integer array. slice is the same size as X.

Data Types: double

## Version History

Introduced in R2022b