Interpolation between two images with different pi

2019-01-29 02:27发布

For my application, I want to interpolate between two images(CT to PET). Therefore I map between them like that:

[X,Y,Z] = ndgrid(linspace(1,size(imagedata_ct,1),size_pet(1)),...
                linspace(1,size(imagedata_ct,2),size_pet(2)),...
                linspace(1,size(imagedata_ct,3),size_pet(3)));
new_imageData_CT=interp3(imagedata_ct,X,Y,Z,'nearest',-1024);

The size of my new image new_imageData_CT is similar to PET image. The problem is that data of my new image is not correct scaled. So it is compressed. I think the reason for that is that the pixelsize between the two images is different and not involved to the interpolation. So for example :

  • CT image size : 512x512x1027
  • CT voxel size[mm] : 1.5x1.5x0.6
  • PET image size : 192x126x128
  • PET voxel size[mm] : 2.6x2.6x3.12

So how could I take care about the voxel size regarding to the interpolation?

3条回答
做自己的国王
2楼-- · 2019-01-29 02:54

I'll let to someone else answering the question, but I think that you're asking the wrong one. I lack context of course, but at first glance Matlab isn't the right tool for the job.

After you've done that registration step, you could export the resulting images (now of identical size and spacing), and continue with your interpolation in Matlab if you wish (or with the same tools).

查看更多
贪生不怕死
3楼-- · 2019-01-29 03:00

There is a toolbox in slicer called PETCTFUSION which aligns the PET scan to the CT image. you can install it in slicer new version. In the module's Display panel shown below, options to select a colorizing scheme for the PET dataset are provided: Grey will provide white to black colorization, with black indicating the highest count values. Heat will provide a warm color scale, with Dark red lowest, and white the highest count values. Spectrum will provide a warm color scale that goes cooler (dark blue) on the low-count end to white at the highest. This panel also provides a means to adjust the window and level of both PET and CT volumes.

PETCT SLICER

I normally use the resampleinplace tool after the registration. you can find it in the package: registration and then, resample image.

Look at the screensht here: resampleinplace

If you would like to know more about the PETCTFUSION, there is a link below: https://www.slicer.org/wiki/Modules:PETCTFusion-Documentation-3.6

Since slicer is compatible with python, you can use the python interactor to run your own code too.

And let me know if you face any problem

查看更多
干净又极端
4楼-- · 2019-01-29 03:08

You need to perform a matching in the patient coordinate system, but there is more to consider than just the resolution and the voxel size. You need to synchronize the positions (and maybe the orientations also, but this is unlikely) of the two volumes.

You may find this thread helpful to find out which DICOM Tags describe the volume and how to calculate transformation matrices to use for transforming between the patient (x, y, z in millimeters) and volume (x, y, z in column, row, slice number).

You have to make sure that the volume positions are comparable as the positions of the slices in the CT and PET do not necsesarily refer to the same origin. The easy way to do this is to compare the DICOM attribute Frame Of Reference UID (0020,0052) of the CT and PET slices. For all slices that share the same Frame Of Reference UID, the position of the slice in the DICOM header refers to the same origin. If the datasets do not contain this tag, it is going to be much more difficult, unless you just put it as an assumption. There are methods to deduce the matching slices of two different volumes from the contents of the pixel data referred to as "registration" but this is a science of its own. See the link from Hugues Fontenelle.

BTW: In your example, you are not going to find a matching voxel in both volumes for each position as the volumes have different size. E.g. for the x-direction:

CT: 512 * 1.5 = 768 millimeters

PET: 192 * 2.6 = 499 millimeters

查看更多
登录 后发表回答