[vtkusers] new post

Pia Langoth Pia.Langoth at cads.at
Fri Jan 29 06:47:06 EST 2016


vtk dicom reslice axial, coronal and sagittal view<http://stackoverflow.com/questions/35083162/vtk-dicom-reslice-axial-coronal-and-sagittal-view>

I have a problem with calculating the correct axial, coronal and sagittal images from a given DICOM series. I use the vtk-example in: VTK\Examples\ImageProcessing\Cxx\ImageSlicing.cxx :

     vtkSmartPointer<vtkDICOMReader> dicomReader =
vtkSmartPointer<vtkDICOMReader>::New();

dicomReader->SetFileNames(sortedFileNames);
dicomReader->SetDataScalarTypeToUnsignedChar();
dicomReader->AutoRescaleOn();

dicomReader->SetGlobalWarningDisplay(1);
dicomReader->Update();

int* dicomExtent = new int[6];
dicomReader->GetDataExtent(dicomExtent);

double* dicomOrigin = new double[3];
dicomReader->GetDataOrigin(dicomOrigin);

double* dicomSpacing = new double[3];
dicomReader->GetDataSpacing(dicomSpacing);

double dicomCenter[3];
dicomCenter[0] = dicomOrigin[0] + dicomSpacing[0] * 0.5 * (dicomExtent[0] + dicomExtent[1]);
dicomCenter[1] = dicomOrigin[1] + dicomSpacing[1] * 0.5 * (dicomExtent[2] + dicomExtent[3]);
dicomCenter[2] = dicomOrigin[2] + dicomSpacing[2] * 0.5 * (dicomExtent[4] + dicomExtent[5]);

// Matrices for axial, coronal, sagittal, oblique view orientations
static double axialElements[16] = {
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1 };

static double coronalElements[16] = {
    1, 0, 0, 0,
    0, 0, 1, 0,
    0, -1, 0, 0,
    0, 0, 0, 1 };

    static double sagittalElements[16] = {
    0, 0, -1, 0,
    1, 0, 0, 0,
    0, -1, 0, 0,
    0, 0, 0, 1 };

//static double obliqueElements[16] = {
//         1, 0, 0, 0,
//         0, 0.866025, -0.5, 0,
//         0, 0.5, 0.866025, 0,
//         0, 0, 0, 1 };

// Set the slice orientation
vtkSmartPointer<vtkMatrix4x4> resliceAxes =
    vtkSmartPointer<vtkMatrix4x4>::New();

resliceAxes->DeepCopy(axialElements);

// Set the point through which to slice
resliceAxes->SetElement(0, 3, dicomCenter[0]);
resliceAxes->SetElement(1, 3, dicomCenter[1]);
resliceAxes->SetElement(2, 3, dicomCenter[2]);

// Extract a slice in the desired orientation
vtkSmartPointer<vtkImageReslice> reslice =
    vtkSmartPointer<vtkImageReslice>::New();
reslice->SetInputConnection(dicomReader->GetOutputPort());
reslice->SetOutputDimensionality(2);
reslice->SetResliceAxes(resliceAxes);
reslice->SetInterpolationModeToLinear();
reslice->Update();


The problem is, that the matrices for the axial, coronal and sagittal orientation only work if the direction cosines form an identity matrix. But I have lots of DICOM series with arbitrary direction cosines, like: 0.758921/ 0.498738/ 0.418688/ -0.00570692/ 0.648034/ -0.76159 So I thought that I should use the direction cosines in the axial, coronal and sagittal matrix; this is my code:

    vtkSmartPointer<vtkDICOMReader> dicomReader = vtkSmartPointer<vtkDICOMReader>::New();

dicomReader->SetFileNames(sortedFileNames);
dicomReader->SetDataScalarTypeToUnsignedChar();
dicomReader->AutoRescaleOn();

dicomReader->SetGlobalWarningDisplay(1);
dicomReader->Update();

int* dicomExtent = new int[6];
dicomReader->GetDataExtent(dicomExtent);

double* dicomOrigin = new double[3];
dicomReader->GetDataOrigin(dicomOrigin);

double* dicomSpacing = new double[3];
dicomReader->GetDataSpacing(dicomSpacing);

double dicomCenter[3];
dicomCenter[0] = dicomOrigin[0] + dicomSpacing[0] * 0.5 * (dicomExtent[0] + dicomExtent[1]);
dicomCenter[1] = dicomOrigin[1] + dicomSpacing[1] * 0.5 * (dicomExtent[2] + dicomExtent[3]);
dicomCenter[2] = dicomOrigin[2] + dicomSpacing[2] * 0.5 * (dicomExtent[4] + dicomExtent[5]);

double* directionCosine = new double[6];
dicomReader->GetMedicalImageProperties()->GetDirectionCosine(directionCosine);
double* xAxis = new double[3];
xAxis[0] = directionCosine[0];
xAxis[1] = directionCosine[1];
xAxis[2] = directionCosine[2];

double* yAxis = new double[3];
yAxis[0] = directionCosine[3];
yAxis[1] = directionCosine[4];
yAxis[2] = directionCosine[5];

vtkSmartPointer<vtkMath> math = vtkSmartPointer<vtkMath>::New();

double* zAxis = new double[3];
math->Cross(xAxis, yAxis, zAxis);

// Matrices for axial, coronal, sagittal, oblique view orientations
//xy
static double axialElements[16] = {
    xAxis[0], yAxis[0], zAxis[0], 0,
    xAxis[1], yAxis[1], zAxis[1], 0,
    xAxis[2], yAxis[2], zAxis[2], 0,
    0, 0, 0, 1 };


double* yCross = new double[3];
math->Cross(xAxis, zAxis, yCross);
//xz
static double coronalElements[16] = {
    xAxis[0], zAxis[0], yCross[0], 0,
    xAxis[1], zAxis[1], yCross[1], 0,
    xAxis[2], zAxis[2], yCross[2], 0,
    0, 0, 0, 1 };

double* xCross = new double[3];
math->Cross(yAxis, zAxis, xCross);
//yz
static double sagittalElements[16] = {
    yAxis[0], zAxis[0], xCross[0], 0,
    yAxis[1], zAxis[1], xCross[1], 0,
    yAxis[2], zAxis[2], xCross[2], 0,
    0, 0, 0, 1 };

//static double obliqueElements[16] = {
//         1, 0, 0, 0,
//         0, 0.866025, -0.5, 0,
//         0, 0.5, 0.866025, 0,
//         0, 0, 0, 1 };

// Set the slice orientation
vtkSmartPointer<vtkMatrix4x4> resliceAxes =
    vtkSmartPointer<vtkMatrix4x4>::New();

resliceAxes->DeepCopy(axialElements);

// Set the point through which to slice
resliceAxes->SetElement(0, 3, dicomCenter[0]);
resliceAxes->SetElement(1, 3, dicomCenter[1]);
resliceAxes->SetElement(2, 3, dicomCenter[2]);

// Extract a slice in the desired orientation
vtkSmartPointer<vtkImageReslice> reslice =
    vtkSmartPointer<vtkImageReslice>::New();
reslice->SetInputConnection(dicomReader->GetOutputPort());
reslice->SetOutputDimensionality(2);
reslice->SetResliceAxes(resliceAxes);
reslice->SetInterpolationModeToLinear();
reslice->Update();

But it does not work. I also tried to use the inverse of the direction cosines, but the result is not correct. Can someone help me with my problem? Thank you in advance!

Kind regards, Pia




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160129/548cf886/attachment-0001.html>


More information about the vtkusers mailing list