圖像數據集用類vtkImageData表示。其結構與結構化點數據集是同樣的,由像素(vtkPixel)或體素(vtkVoxel)構成。圖像數據一般只有標量屬性。後面提到的圖像的灰度、顏色值,通常都是指標量數據。編程
當初,VTK是用vtkStructuredPoints來表達圖像的。可是隨着愈來愈多的圖像處理功能要添加進VTK中,便要求共有一個更靈活的類,要能支持數據的並行處理和流處理等,因而vtkImageData就產生了。以後又通過了幾個VTK發行版本,圖像數據集開始能夠和通常數據集放進同一條流水線中,這樣vtkImageData和 vtkStructuredPoints就很是相似了。如今vtkStructuredPoints 幾乎是vtkImageData的一個空子集。c#
以上摘自周振環老師的《醫學圖像編程技術》數組
手動建立圖像數據集app
手動建立圖像數據集的結構和結構化點集同樣,只要設置起點、尺寸和間隔,對於標量數據,除了能夠可使用SetScalars()指定一個數據數組之外,vtkImageData還有一些本身的方法。dom
代碼以下:spa
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void renderWindowControl1_Load(object sender, EventArgs e) { vtkImageData id = new vtkImageData(); id.SetDimensions(10,25,100); //id.SetScalarTypeToUnsignedShort(); id.SetScalarTypeToUnsignedChar(); id.SetNumberOfScalarComponents(1); id.AllocateScalars();//vtkImageData特有的方法,用於分配存儲標量數據的內存空間 //AllocateScalars使用以前必須設置好相關參數,包括點的個數(經過尺寸設置),標量數據類型和標量份量個數 IntPtr ptr = id.GetScalarPointer();//vtkImageData特有的方法,用於獲取標量數據存儲地址的首地址 //這裏和C++中的代碼是不同的。 Random random = new Random(); unsafe { byte* src = (byte*)ptr.ToPointer(); for (ushort i = 0; i < 10 * 25 * 100;i++ ) { *src++ = (byte)(random.Next(0,256)); } } vtkImageActor actor = new vtkImageActor(); //vtkImageActor是一個複合類,其中包含一個actor和一個mapper actor.SetInput(id); vtkRenderWindow _renwin = renderWindowControl1.RenderWindow; vtkRenderer _render = _renwin.GetRenderers().GetFirstRenderer(); _render.AddActor(actor); _renwin.Render(); _render.ResetCamera(); } }
程序化生成圖像數據集code
VTK提供一些源對象來程序化生成圖像數據。程序化生成多變性數據集,主要建立的是數據集的結構,而這裏主要建立的是標量數據。orm
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void renderWindowControl1_Load(object sender, EventArgs e) { vtkImageCanvasSource2D imCan = new vtkImageCanvasSource2D(); //vtkImageCanvasSource2D能夠按照指定大小和類型建立一個空白的2D圖像畫布(這裏的空白指的是沒有標量數據) //而後能夠在這個畫布上畫各類圖形元素,包括方塊、線和圓等 imCan.SetScalarTypeToUnsignedChar();//設置標量值類型 imCan.SetExtent(0,511,0,511,0,0);//設置圖像畫布的大小 imCan.SetDrawColor(86); imCan.FillBox(0,511,0,511);//背景方塊 imCan.SetDrawColor(0.0); imCan.FillTube(500,20,30,400,5);//有寬度的線段 imCan.SetDrawColor(255); imCan.DrawSegment(10,20,500,510);//線段 imCan.SetDrawColor(0.0); imCan.DrawCircle(400,350,80.0);//圓周 imCan.SetDrawColor(255); imCan.FillPixel(450,350);//填充 imCan.SetDrawColor(170); imCan.FillTriangle(100,100,300,150,150,300);//三角形 vtkImageActor actor = new vtkImageActor(); actor.SetInput(imCan.GetOutput()); vtkRenderWindow _renwin = renderWindowControl1.RenderWindow; vtkRenderer _render = _renwin.GetRenderers().GetFirstRenderer(); _render.AddActor(actor); _renwin.Render(); _render.ResetCamera(); } }
效果圖以下:對象
vtkImageEllipsoidSource和vtkImageGaussionSource的的介紹這裏省略了,之後有機會再找一下例子補上。
vtkImageGridSource 產生一個網格圖像。整個圖像分爲網格線和網格內兩部分,分別設置不一樣的顏色值。vtkImageGridSource 一般與vtkImageBlend混合使用,是如今一幅圖像上面顯示網格的效果。
namespace vtkImageGridSourcetest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void renderWindowControl1_Load(object sender, EventArgs e) { vtkPNGReader reader = new vtkPNGReader(); reader.SetFileName(@"E:\beauty.png"); reader.SetDataByteOrderToLittleEndian(); reader.Update(); int width = reader.GetOutput().GetDimensions()[0]; int height = reader.GetOutput().GetDimensions()[1]; vtkImageGridSource imageGrid = new vtkImageGridSource(); imageGrid.SetGridSpacing(100,100,0); imageGrid.SetGridOrigin(0,0,0); imageGrid.SetDataExtent(0,width,0,height, 0,0); imageGrid.SetLineValue(4095); imageGrid.SetFillValue(0); imageGrid.SetDataScalarType(reader.GetDataScalarType()); vtkImageBlend blend = new vtkImageBlend(); blend.SetOpacity(0,0.5); blend.SetOpacity(1,0.5); blend.AddInputConnection(reader.GetOutputPort()); blend.AddInputConnection(imageGrid.GetOutputPort()); vtkImageActor actor = new vtkImageActor(); actor.SetInput(blend.GetOutput()); vtkRenderWindow _renwin = renderWindowControl1.RenderWindow; vtkRenderer _render = _renwin.GetRenderers().GetFirstRenderer(); _render.AddActor(actor); _renwin.Render(); _render.ResetCamera(); } } }
效果圖:美美的阿江與夫人