使用 ActiViz.Net 实现读三维地震数据可视化

news/2025/1/6 7:06:10/文章来源:https://www.cnblogs.com/xu53105656/p/18651787

一、背景

在地震勘探中,SEG-Y 格式(简称 SEGY)是最常用的数据格式之一,用于存储地震波的原始数据。地震数据通常包含了时间序列信息,并通过不同的采样和测量方法来记录地下结构的属性。为了有效地可视化这些数据,尤其是地震波的幅度和传播情况,三维可视化是一个非常有用的手段。

ActiViz.Net 是一个 .NET 环境下的图形库,基于 VTK(Visualization Toolkit)实现,用于科学计算和数据可视化。在本文中,我们将探讨如何使用 ActiViz.Net 9.4 (商业版)来加载多个 SEG-Y 文件,并实现三维地震数据的渲染。

二、环境准备

  • ActiViz.Net 9.4:用于在 .NET 中进行数据可视化。(可通过官网申请试用)ActiViz.NET-9.4.2024.1104-win64-Trial-2025-01-24.exe
  • SEG-Y 文件:存储地震数据的文件,通常包含采样点的振幅值。
  • Visual Studio:开发环境,确保安装了 ActiViz.Net 和相关依赖。

三、步骤解析

1.安装ActiViz.NET程序

首先,您需要运行 ActiViz.NET-9.4.2024.1104-win64-Trial-2025-01-24.exe 安装程序并记录安装位置。安装过程中,确保选择安装路径,这将是您后续引用所需 DLL 文件的目录。

2.引用 Kitware.mummy.Runtime.dll 和 Kitware.VTK.dll

要在项目中使用 ActiViz.NET,您需要引用安装目录中的两个 DLL 文件:

  • Kitware.mummy.Runtime.dll(提供 ActiViz.NET 的运行时支持)
  • Kitware.VTK.dll(包含 VTK 的核心功能)

3.加载 SEG-Y 文件并初始化渲染环境

我们需要加载多个 SEG-Y 文件并准备好相应的渲染环境。在此步骤中,我们会创建 vtkRenderervtkRenderWindowvtkRenderWindowInteractor,这些对象用于显示三维渲染效果并进行交互操作。

// 文件列表,假设包含多个 SEG-Y 文件路径
string[] segyFiles = new string[] 
{"D:\\XLine598.segy","D:\\Inline790.segy",
};
vtkRenderer render = new vtkRenderer();
vtkRenderWindow renWin = new vtkRenderWindow();
vtkRenderWindowInteractor renwinIn = new vtkRenderWindowInteractor();
renwinIn.SetRenderWindow(renWin);
renWin.AddRenderer(render);

4.色卡设置

 为地震数据选择适当的颜色映射(colormap)是可视化的重要一步。通过读取一张色卡图片,将其转化为 vtkLookupTable,从而映射地震数据的振幅到颜色上。我们采用了一个预设的色卡来表示振幅的变化。

// 色卡
Bitmap colorRamp = Properties.Resources.ColorRamp;
int colorRampHeight = colorRamp.Height; // 1023
int colorRampWidth = colorRamp.Width;   // 45// Create lookup table from color ramp
vtkLookupTable colorLut = new vtkLookupTable();
colorLut.SetNumberOfTableValues(colorRampHeight);
colorLut.Build();// 提取颜色
for (int i = 0; i < colorRampHeight; i++)
{Color pixelColor = colorRamp.GetPixel(colorRampWidth / 2, colorRampHeight - 1 - i);colorLut.SetTableValue(i,pixelColor.R / 255.0,pixelColor.G / 255.0,pixelColor.B / 255.0,1.0);
}

5.渲染每个 SEG-Y 文件

对于每个 SEG-Y 文件,我们使用 vtkSegYReader 来读取数据,并将数据转换为 vtkStructuredGrid,然后通过 vtkDataSetMapper 进行映射,最后将映射结果展示在场景中。

// 遍历文件列表,加载并可视化每个 SEG-Y 文件
foreach (string file in segyFiles)
{vtkSegYReader vtkSegYReader = new vtkSegYReader();vtkSegYReader.SetFileName(file);vtkSegYReader.Update();// 获取对应的输出数据vtkStructuredGrid segyGrid = vtkSegYReader.GetStructuredGridOutput();// 设置 scalar rangedouble[] scalarRange = segyGrid.GetScalarRange();colorLut.SetRange(scalarRange[0], scalarRange[1]);// 创建数据集映射器vtkDataSetMapper mapper = new vtkDataSetMapper();mapper.SetInputData(segyGrid);mapper.SetScalarRange(scalarRange[0], scalarRange[1]);mapper.SetLookupTable(colorLut);mapper.ScalarVisibilityOn();vtkActor actor = new vtkActor();actor.SetMapper(mapper);// 设置材质属性以增强光照效果vtkProperty property = actor.GetProperty();property.SetAmbient(0.3);  // 环境光反射系数property.SetDiffuse(0.7);  // 漫反射系数property.SetSpecular(0.2); // 镜面反射系数property.SetSpecularPower(50.0); // 镜面反射强度// Apply scaling transformvtkTransform transform = new vtkTransform();transform.Scale(1, 1, 5); // Z轴缩放
    actor.SetUserTransform(transform);render.AddActor(actor);
}

6.添加坐标轴和色标

为了增强用户的空间感知,我们可以添加坐标轴和色标,帮助用户理解三维空间的比例和振幅变化的范围。

private static void InitializeAxesWidget(vtkRenderWindowInteractor renwinIn)
{vtkAxesActor axesActor = new vtkAxesActor();vtkOrientationMarkerWidget widget = new vtkOrientationMarkerWidget();widget.SetOutlineColor(0.1, 0.1, 0.1);widget.SetOrientationMarker(axesActor);widget.SetInteractor(renwinIn);widget.SetEnabled(1);widget.InteractiveOn();
}private static void AddColorBarToRenderer(vtkRenderer render, vtkLookupTable colorLut)
{vtkScalarBarActor scalarBar = new vtkScalarBarActor();scalarBar.SetLookupTable(colorLut);scalarBar.SetNumberOfLabels(0);  // 设置标签数量为0,移除数值标识scalarBar.SetPosition(0.9, 0.1);scalarBar.SetWidth(0.1);scalarBar.SetHeight(0.8);scalarBar.SetTextPositionToPrecedeScalarBar();  // 调整文本位置scalarBar.DrawTickLabelsOff();  // 关闭刻度标签scalarBar.DrawAnnotationsOff();  // 关闭注释
    render.AddActor(scalarBar);
}

7.设置渲染背景和启动交互

为了确保渲染效果清晰,我们将渲染背景设置为浅灰色,并启动交互操作,让用户可以旋转、缩放和移动视图。

// 设置背景色为浅灰色以增强对比度
render.SetBackground(0.9, 0.9, 0.9);render.ResetCamera();
renWin.Render();
renwinIn.Start();

四、示例

五、总结

通过 ActiViz.Net 和 VTK,我们可以方便地将 SEG-Y 格式的地震数据转换为三维可视化效果。本文详细介绍了如何加载多个 SEG-Y 文件、设置色卡、进行三维渲染、添加坐标轴和色标,以及如何启用用户交互。通过这些步骤,我们能够更清晰、直观地展示地震数据的空间分布和变化,帮助用户更好地理解地下结构。

这种技术可以广泛应用于地震勘探、石油勘探、地质研究等领域,提供了一个强大的数据可视化工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863819.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过网址或html生成一个简单apk

GitHub - pzx521521/apk-editor 通过网址或html生成一个简单apk 之前发过一个使用apktool版本的,简单来说就是一个对apk反编译和编译的过程相比使用apktool有以下优点:[x] 没有环境依赖,完全不需要 jdk/jre [x] 无需中间调用apktool,容易部署到服务器/docker使用 Online Demo 修…

EXCEL中自动突出显示(自动高亮)行或列

EXCEL中,当选择的单元格距离列首或行首过远时,考验眼睛的时候就到了。解决方法很多,如果想要自动突出显示,就只能上vba代码了。解决的问题 EXCEL中,当选择的单元格距离列首或行首过远时,考验眼睛的时候就到了。解决方法很多,如果想要自动突出显示,就只能上vba代码了。方…

DL00868-基于深度学习的红外船舶检测识别分类完整实现数据8000+

随着遥感技术的快速发展,包括无人机、卫星等,红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像,红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来,深度学习作为一种强大的图像处理技术,在红外船舶检测识别领域取得了显著进展。完整链接:…

基于深度学习的红外船舶检测识别分类完整实现数据集8000+张

随着遥感技术的快速发展,包括无人机、卫星等,红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像,红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来,深度学习作为一种强大的图像处理技术,在红外船舶检测识别领域取得了显著进展。完整链接:…

第三章 MBR -- loader

第三章 MBR --> loader 本文是对《操作系统真象还原》第三章学习的笔记,欢迎大家一起交流。 a 知识介绍 在上一章的代码部分,我们通过 BIOS 中断进行字符输出,但是离开实模式之后,BIOS 中断就没法用了,因为 BIOS 中断向量表只在实模式下存在,因此我们肯定还会有别的方…

正常运行 打包后提示某些属性或者类找不到

lombok 注解未正确加载,注意 idea属性修改

itextpdf 找出PDF中 文字的坐标

目录添加引用添加工具类调用 找到位置,签名的话见:https://www.cnblogs.com/vipsoft/p/18644127 新项目可以尝试一下 iText 7 , 我这边是老项目所以还是继续使用 iText 5,主打够用 iText 5 没有直接提供获取文本精确位置的功能。它只能提取文本内容,而文本位置通常需要通过…

Jmeter 进行websocket接口测试

什么是websocket协议? Websocket是基于tcp的一种全双通信协议,客户端与服务器之间通过websocket建立连接后,客户端和服务器之间会长时间保持连接状态(即长连接)。客户端可以向服务器发送数据,服务器也可以主动向客户端推送数据。与http协议不同的是http是tcp的单向通信协…

vscode下载vetur和vue-helper插件之后删除键(backspace)失效

最近我在学习前端的过程中,使用vscode下载的vue的插件:vetur和vue-helper这两个 但随后在写代码的时候发现删除键(backspace)不能使用,其他键都能正常使用,也可以用鼠标选中右键剪切/删除 最后发现是上面的插件会占用backspace按键作为插件的功能键 解决方法 点击左上角—…

使用 C# WPF 根据 SEGY 数据绘制二维地震图

一、引言 在地震勘探领域,SEGY(Society of Exploration Geophysicists Y-data)文件格式是常见的地震数据存储格式。对于地震数据的可视化,通常会将 SEGY 文件中的振幅数据通过图像进行展示,以便进行分析。本文将介绍如何使用 C# WPF 应用程序绘制基于 SEGY 数据的二维地震…

为什么浏览器打开的网页默认是英文显示?

最近在学习的时候遇到的问题,打开一些软件的官网默认都是英文(即使这些网站是国内做的)。 其中一个原因是浏览器的默认设置语言是英文 修改浏览器默认语言 以Google Chrome浏览器为例: 右上角三个点—>设置 左边找到“语言” 将中文置顶