创建直方图

时间:2015-06-09 08:31:52

标签: c++ 3d vtk

我有一个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 ...

我有两个问题:

  1. 为什么我从 GetScalarPointer 获得0.0值?
  2. 我正在以正确的方式从vtkDICOMImageReader创建直方图?我没有看到类似的东西......
  3. 谢谢。

    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();
    

    其中p是一个dcm文件的字符串... 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
    
    为什么?另外,我尝试了另一种vtk类型:VTK_SHORT,结果相同......

    P.S。 我试过这样:

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

    结果为0,0,0; ​​

1 个答案:

答案 0 :(得分: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 ...))。