英文网站首页优化建设网站与服务器

当前位置: 首页 > news >正文

英文网站首页优化,建设网站与服务器,找别人做网站需要什么信息,江苏新有建设集团有限公司官方网站1、前言 图像处理离不开一些基本的图像数据操作#xff0c;例如获取和修改图像的基本信息、访问和修改图像像素值、图像显示、图像类型转换等。熟练掌握这些基本操作有助于使用 VTK进行图像处理应用程序的快速开发。 2、图像信息的访问与修改 1#xff09;利用vtkIamgeData… 1、前言 图像处理离不开一些基本的图像数据操作例如获取和修改图像的基本信息、访问和修改图像像素值、图像显示、图像类型转换等。熟练掌握这些基本操作有助于使用 VTK进行图像处理应用程序的快速开发。 2、图像信息的访问与修改 1利用vtkIamgeData方法 vtkImageData中提供了多个函数用于访问或者获取图像的基本信息,这些函数通常以 Set或者 Get加上相应的信息名的形式进行命名例如获取图像维数的方法定义为 GetDimensions)。 private void TestGetImageInfo() {vtkBMPReader reader vtkBMPReader.New();reader.SetFileName(F:\code\VTK\TestActiViz\bin\Debug\data\lena.bmp);reader.Update();int[] dims reader.GetOutput().GetDimensions();Console.WriteLine(\(图像维数{dims[0]} {dims[1]} {dims[2]});double[] orgin reader.GetOutput().GetOrigin();Console.WriteLine(\)图像原点{orgin[0]} {orgin[1]} {orgin[2]});double[] spaceing reader.GetOutput().GetSpacing();Console.WriteLine(\(像素间隔{spaceing[0]} {spaceing[1]} {spaceing[2]});vtkImageActor actor vtkImageActor.New();actor.SetInputData(reader.GetOutput());vtkRenderer renderer vtkRenderer.New();renderer.AddActor(actor);renderer.ResetCamera();renderer.SetBackground(1, 1, 1);vtkRenderWindow renderWindow renderWindowControl.RenderWindow;renderWindow.AddRenderer(renderer);renderWindow.Render(); }示例主要获取了图像的三个信息即图像维数、图像原点和像素间隔。 VTK 中无论是二维图像还是三维图像都用 vtkImageData表示因此程序中定义图像维数为 dims[3]然后利用 GetDimensions)函数获取图像的维数;图像的原点和像素间隔都是物理空间数值其数值类型为 double。从显示结果中可以看到图像维数为512x512x1其中Z方向的维数为1说明该图像为二维图像:而图像的原点为(0,0,0)点像素间隔为(1,1,1)。 2利用类vtkChangeImageInformation vtkImageData 中提供了多个 Set 函数用于设置图像的基本信息。在对一个图像 Filter的输出图像信息进行修改后如果 Filter 重新 Update图像信息又会恢复回原来的值。而vtkChangeImageInformation 类可以作为管线中的一个 Filter 来修改图像信息。利用这个Filter 可以修改图像的原点、像素间隔以及范围另外还可以实现图像平移缩放等操作。 private void TestChangeImageInfo() {vtkBMPReader reader vtkBMPReader.New();reader.SetFileName(F:\\code\\VTK\\TestActiViz\\bin\\Debug\\data\\lena.bmp);reader.Update();int[] dims reader.GetOutput().GetDimensions();Console.WriteLine(\)原图像维数{dims[0]} {dims[1]} {dims[2]});double[] orgin reader.GetOutput().GetOrigin();Console.WriteLine(\(原图像原点{orgin[0]} {orgin[1]} {orgin[2]});double[] spaceing reader.GetOutput().GetSpacing();Console.WriteLine(\)原像素间隔{spaceing[0]} {spaceing[1]} {spaceing[2]});vtkImageChangeInformation changer vtkImageChangeInformation.New();changer.SetInputData(reader.GetOutput());changer.SetOutputOrigin(100, 100, 0);changer.SetOutputSpacing(5, 5, 1);changer.SetCenterImage(1);changer.Update();dims changer.GetOutput().GetDimensions();Console.WriteLine(\(修改后图像维数{dims[0]} {dims[1]} {dims[2]});orgin changer.GetOutput().GetOrigin();Console.WriteLine(\)修改后图像原点{orgin[0]} {orgin[1]} {orgin[2]});spaceing changer.GetOutput().GetSpacing();Console.WriteLine($修改后像素间隔{spaceing[0]} {spaceing[1]} {spaceing[2]});vtkImageActor actor vtkImageActor.New();actor.SetInputData(changer.GetOutput());vtkRenderer renderer vtkRenderer.New();renderer.AddActor(actor);renderer.ResetCamera();renderer.SetBackground(1, 1, 1);vtkRenderWindow renderWindow renderWindowControl.RenderWindow;renderWindow.AddRenderer(renderer);renderWindow.Render(); } 示例先读入图像由 vtklmageData提供的函数接口获取图像的维数、图像原点和像素间隔。然后定义 vtkImageChangeInformation 对象并设置输出图像原点为(100,100,0)输出图像像素间隔为(5,5,1)然后调用 CenterImage()函数将图像的原点置于图像的中心。         操作后的结果使得图像的原点位于(-1277.5-1275.50)。 SetOutputOrigin(100,100,0)并没有起作用。查看 CenterImage()函数的注释可以发现该函数的作用是将(0,0,0)点置于图像的中心。当Centerlmage)函数执行时会重新调用 SetOutputOrigin()所以开始的 SetOutputOrigin()函数设置的原点将会被覆盖。 (-1277.5,-1275.5,0)是如何计算出来的呢? 根据图像的维数和像素间隔计算得到新的图像的宽度和高度为(512-1)x5初始图像的原点位于(0,0,0)现在将图像的中心平移至原点平移量为(-(512-1)x5/2,(512-1)x5/2,0)(-1277.5,-1275.5,0)。 3、图像像素值的访问与修改 图像像素值的访问与修改是最常用的一种操作。VTK 中提供了两种访问图像像素值的方法第一种方法是直接访问 vtkImageData 的数据数组这种方法最直接。前面创建图像赋值时也是采用这种方法。vtkImageData中提供了GetScalarPointer()函数获取数据数组指针该函数有三种形式: virtual void *GetScalarPointer(int coordinates[3]); virtual void *GetScalarPointer(int x, int y, int z); virtual void *GetScalarPointer(); 前两种形式根据给定的像素索引得到指定的像素值,注意返回的是第(x,y,z)个像素值的地址。而第三种形式是返回图像数据数组的头指针然后根据头指针可以依次访问索引像素。 1数据数组 一个遍历图像像素的示例 private void TestVisitPixel() {vtkBMPReader reader vtkBMPReader.New();reader.SetFileName(F:\code\VTK\TestActiViz\bin\Debug\data\lena.bmp);reader.Update();//获取图像的大小int[] dims reader.GetOutput().GetDimensions();//将图像的100*100大小的区域设置为黑色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){//VTK彩色及矢量图像的像素存储格式示意 …R G B R G B…byte[] infos new byte[] { 0, 0, 0 };var pixel reader.GetOutput().GetScalarPointer(i, j, k);Marshal.Copy(infos, 0, pixel, 3);}}}}vtkImageActor actor vtkImageActor.New();actor.SetInputData(reader.GetOutput());vtkRenderer renderer vtkRenderer.New();renderer.AddActor(actor);renderer.ResetCamera();renderer.SetBackground(1, 1, 1);vtkRenderWindow renderWindow renderWindowControl.RenderWindow;renderWindow.AddRenderer(renderer);renderWindow.Render(); } 实现了将图像的 100x100大小的区域设置为黑色。先定义一个 reader 读取一幅 BMP 图像通过 vtkImageData的 GetDimensionsO)函数获取图像的大小。然后建立三重循环通过 GetScalarPointer(i,j,k)函数获取访问图像像素值。 需要注意的是GetScalarPointer0函数返回的是 void类型因此需要根据图像的实际类型进行强制转换。如上面代码中将像素值数组的头指针类型转换为unsignedchar。如果对数据类型不确定还可以将图像数据类型强制转换为特定的数据类型再进行遍历。 当然这个使用是指在c中在我们c#中你也看到是使用Marshal对指针进行复制操作了。 VTK 彩色以及矢量图像采用的是类似图 所示的像素存储格式。 因此在修改 RGB 图像以及矢量图像像素时需要根据像素的元组的组分数目来访问。例中需要修改每个像素的 RGB 值时先获得第(i,i,k)个像素的地址也就是R值的地址然后将地址加1来访问后续G值以及B值。如果对于像素的元组组分不确定可以通过函数GetNumberOfScalarComponents()来获取代码如下所示: int nbOfComp reader-GetOutput()-GetNumberOfScalarComponents(); 2迭代器方法访问图像像素 用 vtkImagelterator 类实现迭代器方法访问图像像素。该类是一个模板类使用时需要提供迭代的图像像素类型以及迭代的区域大小。 这个是c的方式c#没有找到对应的实现。 void TestVisitImagePixelIteratively(){vtkSmartPointervtkBMPReader reader vtkSmartPointervtkBMPReader::New();reader-SetFileName(F:\code\VTK\TestActiViz\bin\Debug\data\lena.bmp);reader-Update();int numComponents reader-GetOutput()-GetNumberOfScalarComponents();int subRegion[6] { 0,300, 0, 300, 0, 0 };vtkImageIteratorunsigned char it(reader-GetOutput(), subRegion);while (!it.IsAtEnd()){unsigned char* inSI it.BeginSpan();unsigned char* inSIEnd it.EndSpan();while (inSI!inSIEnd){*inSI 255 - *inSI;inSI;}it.NextSpan();}vtkSmartPointervtkImageViewer2 imageViewer vtkSmartPointervtkImageViewer2::New();imageViewer-SetInputConnection(reader-GetOutputPort());vtkSmartPointervtkRenderWindowInteractor renderWindowInteractor vtkSmartPointervtkRenderWindowInteractor::New();imageViewer-SetupInteractor(renderWindowInteractor);imageViewer-Render();imageViewer-GetRenderer()-ResetCamera();imageViewer-Render();imageViewer-GetRenderer()-SetBackground(1.0, 1.0, 1.0);imageViewer-SetSize(640, 480);imageViewer-GetRenderWindow()-SetWindowName(VisitImagePixelIterativelyExample);renderWindowInteractor-Start();}