1、3D 遍历
以下代码功能:两个itkImage元素遍历、对应。可以看出itkBufferedRegion中指针的遍历顺序依次为列、行、切片。GetSize 等[0][1][2]依次为列、行、切片。
TerritoryImageType::RegionType TerritoryRegion = itkTerritoryImg->GetBufferedRegion();
TerritoryImageType::SizeType TerritorySize = TerritoryRegion.GetSize();
TerritoryImageType::IndexType pixelIndex;
TerritoryIteratorType Territoryit(itkTerritoryImg, TerritoryRegion);
Territoryit.GoToBegin();
int i = 0;
int nSliceSize = TerritorySize[0] * TerritorySize[1];
while (!Territoryit.IsAtEnd())
{
if (Territoryit.Get() == 0)
{
pixelIndex[0] = i % nSliceSize % TerritorySize[0];
pixelIndex[1] = i % nSliceSize / TerritorySize[0];
pixelIndex[2] = i / nSliceSize;
itkNonRigImg->SetPixel(pixelIndex,0);
}
++Territoryit;
i++;
}
2、2D遍历
以下代码功能:itkImage 转成Eigen Matrix
InternalImageType::RegionType movingImageRegion = movingImage->GetBufferedRegion();
InternalImageType::SizeType Size = movingImageRegion.GetSize();
using FloatMatrixType = Eigen::Matrix<PixelType, Dynamic, Dynamic>;
int nImgWigth = Size[0];
int nImgHeight = Size[1];
FloatMatrixType MovingRegionMatrix(nImgHeight, nImgWidth);
using Uchar2DIteratorType = itk::ImageRegionConstIterator<InternalImageType>;
Uchar2DIteratorType itmove(movingImage, movingImageRegion);
itmove.GoToBegin();
int ii = 0;
while (!itmove.IsAtEnd())
{
float movingtemp = itmove.Get();
MovingRegionMatrix(ii%nImgWidth, ii / nImgWidth) = movingtemp;
++itmove;
ii++;
}