2015-06-09 5 views
0

У меня есть vtkDICOMImageReader, откуда я намереваюсь создать гистограмму для распространения на моем собственном CDialog. Вот моя проба:Создать гистограмму

int* nDim = m_pDICOMReader->GetOutput()->GetDimensions(); 
for(int z = 0;z < nDim[2];++z) 
{ 
    for(int y = 0;y < nDim[1];++y) 
    { 
     for(int x= 0 ;x < nDim[0];++x) 
     { 
      double* dPixel = static_cast<double*>(m_pDICOMReader->GetOutput()->GetScalarPointer(x, y, z)); 
      TRACE("%f|%f|%f\n", dPixel[0], dPixel[1], dPixel[2]); 
     } 
    } 
} 

, но я всегда 0.0 ...

У меня 2 вопроса:

  1. Почему я получаю 0.0 значения от GetScalarPointer?
  2. Я нахожусь на правильном пути, чтобы создать гистограмму из vtkDICOMImageReader? Я не видел ничего подобного ...

спасибо.

P.S. Вот код, где я загружаю vtlDICOMImageReader:

if(NULL == m_pDICOMReader) 
{ 
    m_pDICOMReader = vtkDICOMReader::New(); 
} 
if(! m_pDICOMReader->CanReadFile(lpszPathName)) 
{ 
    AfxMessageBox(_T("Can not read/parse the file."), MB_ICONERROR); 
    return FALSE; 
} 
m_pDICOMReader->SetFileNames(p); 
m_pDICOMReader->Update(); 

где р Идентификатор StringArray ДМК файлов ... m_pDICOMReader работает хорошо, потому что у меня громкость на экране, и он движется хорошо ...

Да, я сделал это:

m_pDICOMReader->GetOutput()->AllocateScalars(VTK_DOUBLE, 1); 
int* nDim = m_pDICOMReader->GetOutput()->GetDimensions(); 
for(int z = 0;z < nDim[2];++z) 
{ 
    for(int y = 0;y < nDim[1];++y) 
    { 
     for(int x= 0 ;x < nDim[0];++x) 
     { 
      double* dPixel = static_cast<double*>(m_pDICOMReader->GetOutput()->GetScalarPointer(x, y, z)); 
      TRACE("%f|%f|%f\n", dPixel[0], dPixel[1], dPixel[2]); 
     } 
    } 
} 

, но поймите меня некоторые странные значения:

-6277438562204192500000000000000000000000000000000000000000000000000.000000|-6277438562204192500000000000000000000000000000000000000000000000000.000000|-6277438562204192500000000000000000000000000000000000000000000000000.000000 

ш hy? Кроме того, я пробовал с другими типами vtk: VTK_SHORT, тот же результат ...

P.S. Я пытался так:

  m_pDICOMReader->SetFileNames(p); 
      m_pDICOMReader->GetOutput()->AllocateScalars(VTK_DOUBLE, 1); 
      m_pDICOMReader->Update(); 

Результат 0, 0, 0;

+0

Не могли бы вы показать полный код загрузки и инициализации 'm_pDICOMReader'. – JohnnyQ

+0

Несомненно. Через минуту ... – flaviu2

+1

Я думаю, вам нужно выделить их с помощью imageData-> AllocateScalars (VTK_DOUBLE, 1); 'перед тем, как вы сможете получить к ним доступ с помощью GetScalarPointer' - см. Также [http://www.vtk.org/ Wiki/VTK/Примеры/Cxx/ImageData/IterateImageData] (http://www.vtk.org/Wiki/VTK/Examples/Cxx/ImageData/IterateImageData) – JohnnyQ

ответ

0

Использование AllocateScalars не принеси мне ничего на зрителя (ни 2D-изображения, ни объем) ... так, я сделал что-то (без использования AllocateScalars):

int* nDim = m_pDICOMReader->GetOutput()->GetDimensions(); 
for(int z = 0;z < nDim[2];++z) 
{ 
    for(int y = 0;y < nDim[1];++y) 
    { 
     for(int x= 0 ;x < nDim[0];++x) 
     { 
      unsigned char* chPixel = reinterpret_cast<unsigned char*>(m_pDICOMReader->GetOutput()->GetScalarPointer(x, y, z)); 
      TRACE("%d|%d|%d\n", chPixel[0], chPixel[1], chPixel[2]); 
     } 
    } 
} 

Ну, здесь я получаю некоторые но проблема в том, что эти петли занимают слишком много времени ... хм ... странно, но, если честно, цикл повторяется с предыдущим кодом (double * dPixel = static_cast (m_pDICOMReader ...)).

Смежные вопросы