ITK Image Pixel 的遍历(2D and 3D)

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++;
		}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章