创建柱状图

Create histogram

本文关键字:创建      更新时间:2023-10-16

我有一个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|%fn", dPixel[0], dPixel[1], dPixel[2]);
        }
    }
}

但我总是得到0.0…

我有两个问题:
  1. 为什么我从GetScalarPointer得到0.0值?
  2. 我是在正确的方式,以创建一个直方图从vtkDICOMImageReader ?我没有看到类似的东西……

谢谢。

注:下面是我加载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();

where p id一个字符串数组的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|%fn", dPixel[0], dPixel[1], dPixel[2]);
        }
    }
}

但是给我一些奇怪的值:

-6277438562204192500000000000000000000000000000000000000000000000000.000000|-6277438562204192500000000000000000000000000000000000000000000000000.000000|-6277438562204192500000000000000000000000000000000000000000000000000.000000

为什么?此外,我尝试了另一种vtk类型:VTK_SHORT,相同的结果…

注:我试过了:

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

使用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|%dn", chPixel[0], chPixel[1], chPixel[2]);
        }
    }
}

嗯,这里我得到了一些值,但是这些循环花费的时间太长了…嗯…很奇怪,但说实话,循环是与前面的代码(double* dPixel = static_cast(m_pDICOMReader…))同时进行的。