使用 ActiViz.Net (商业版)实现读三维地震数据可视化

一、背景

在地震勘探中,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 range
    double[] 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 transform
    vtkTransform 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 文件、设置色卡、进行三维渲染、添加坐标轴和色标,以及如何启用用户交互。通过这些步骤,我们能够更清晰、直观地展示地震数据的空间分布和变化,帮助用户更好地理解地下结构。

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

posted @   骑着蚂蚁快跑  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示