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

 

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