Activiz 使用筆記 (6) 圖像數據及其處理

http://image.szpt.edu.cn/UploadFiles/%E5%9B%BE%E5%83%8F%E6%95%B0%E6%8D%AE%E5%8F%8A%E5%85%B6%E5%A4%84%E7%90%86.swf
c++

圖像數據集用類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();



        }
    }
}

效果圖:美美的阿江與夫人

相關文章
相關標籤/搜索