1. 程式人生 > >VTK之影象資料結構

VTK之影象資料結構

1.VTK影象資料結構

       數字影象檔案內容由兩個部分組成:影象頭資訊和資料。影象頭資訊定義了影象的基本資訊,主要包括原點位置(Origin)、畫素間隔(Space)和維數(Dimension)。通過這三個引數即可以確定影象空間位置和大小。影象可以看作空間中的一個規則的網格,網格中的每個最小單元稱為畫素(二維)或體素(三維),網格在每個方向上的畫素或體素個數即為影象在該方向的維數。畫素索引表示每個畫素在影象網格中的位置,是影象內部的網格座標(x,y,z)。對於普通的一張影象而言,z方向維數為1。

影象資料即為影象畫素的畫素值,一般採用一維陣列來表示和儲存。VTK中影象資料結構由類vtkImageData來表示。這種資料型別是結構化的,這意味著只要用很少的引數(原點位置、畫素間隔和維數)就能準確定義每個資料點的位置。

virtual void *GetScalarPointer(int coordinates[3]);// 根據給定的畫素索引得到指定的畫素值,注意:此處返回的是第(x,y,z)個畫素值的地址
virtual void *GetScalarPointer(int x, int y, int z);//根據給定的畫素索引得到指定的畫素值,注意:此處返回的是第(x,y,z)個畫素值的地址
virtual void *GetScalarPointer();//返回影象資料陣列的頭指標,然後根據頭指標可以一次訪問並設定索引畫素,影象資料陣列採用一維陣列
vtkSmartPointer<vtkBMPReader> reader =
		vtkSmartPointer<vtkBMPReader>::New();
	reader->SetFileName(argv[1]);
	reader->Update();

	int dims[3];
	reader->GetOutput()->GetDimensions(dims);

	double origin[3]; 
	reader->GetOutput()->GetOrigin(origin);
	//reader->GetOutput()->SetOrigin(10,0,0);

	double space[3];
	reader->GetOutput()->SetSpacing(20, 20, 1);
	reader->GetOutput()->GetSpacing(space);
	



	std::cout << dims[0] << "   " << dims[1] << "   " << dims[2] << endl;
	std::cout << origin[0] << "   " << origin[1] << "   " << origin[2] << endl;
	std::cout << space[0] << "   " << space[1] << "   " << space[2] << endl;
	int nbOfComp;
	nbOfComp = reader->GetOutput()->GetNumberOfScalarComponents();//獲取畫素的元組組分數,確定是灰度圖、梯度圖還是RGB圖

	for(int k=0; k<dims[2]; k++)
	{
		for(int j=0; j<dims[1]; j++)
		{
			for(int i=0; i<dims[0]; i++)
			{
				if(i<100 && j<100)
				{
					unsigned char * pixel = 
						(unsigned char *) ( reader->GetOutput()->GetScalarPointer(i, j, k) );
					*pixel = i;
					*(pixel+1) = j;
					*(pixel+2) = 0;
				}
			}
		}
	}