我有一些体积成像数据,包括在x,y,z的规则网格上采样的值,但具有非立方体素形状(z中相邻点之间的空间大于x,y).我最终希望能够在通过卷的任意2D平面上插值,如下所示:
我知道scipy.ndimage.map_coordinates
,但在我的情况下使用它不那么简单,因为它隐含地假设输入数组中元素的间距在维度上是相等的.我可以首先根据最小的体素尺寸对我的输入数组进行重新采样(这样我的所有体素都可以是立方体),然后map_coordinates
用来在我的平面上进行插值,但是插入我的数据两次似乎不是一个好主意.
我也知道,scipy
有不规则隔开的ND数据(不同的内插LinearNDInterpolator
, NearestNDInterpolator
等等),但这些都是非常缓慢和内存密集型,我的目的.在我知道值在每个维度内有规律间隔的情况下,插入数据的最佳方法是什么?
我正在使用光线投射算法学习体绘制.我在这里找到了一个很好的演示和tuturial .但问题是我有一个ATI显卡而不是nVidia,这让我无法在演示中使用cg着色器,因此我想将cg着色器更改为glsl着色器.我已经阅读了OpenGL的红皮书(第7版),但不熟悉glsl和cg.有没有人可以帮我改变演示中的cg着色器到glsl?或者是否有任何材料可以使用光线投射进行体积渲染的最简单演示(当然在glsl中). 这是演示的cg着色器.它可以在我朋友的nVidia显卡上运行.令我困惑的是,我不知道如何将cg的入口部分翻译成glsl,例如:
struct vertex_fragment
{
float4 Position : POSITION; // For the rasterizer
float4 TexCoord : TEXCOORD0;
float4 Color : TEXCOORD1;
float4 Pos : TEXCOORD2;
};
Run Code Online (Sandbox Code Playgroud)
更何况,我可以编写一个程序将2个纹理对象与2个纹理单元绑定到着色器,前提是我在绘制屏幕时分配两个texcoord,例如
glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
在演示中,程序将绑定到两个纹理(一个2D用于backface_buffer
一个3D volume texture
),但只有一个纹理单元,glMultiTexCoord3f(GL_TEXTURE1, x, y, z);
我认为GL_TEXTURE1
单位是用于体积纹理,但是哪一个(纹理单位)用于backface_buffer
?据我所知,为了在着色器中绑定纹理obj,我必须得到一个纹理单元来绑定例如:
glLinkProgram(p);
texloc = glGetUniformLocation(p, "tex");
volume_texloc = glGetUniformLocation(p, "volume_tex");
stepsizeloc = glGetUniformLocation(p, "stepsize");
glUseProgram(p);
glUniform1i(texloc, 0);
glUniform1i(volume_texloc, 1);
glUniform1f(stepsizeloc, stepsize);
//When rendering an object with this program.
glActiveTexture(GL_TEXTURE0); …
Run Code Online (Sandbox Code Playgroud) 如果有人关心,我正在使用WPF ....
故事的开头:
我得到了一系列灰度图像(模型切片).用户输入灰度值的"范围"以构建3D模型.因此,我创建了一个3D bool
数组,以便更容易地构建3D模型.此数组表示一个像素框,指示是否应构建/生成/填充每个像素.
领带:
使用a bool[,,]
,我想检索List<Point3D[]>
每个Point3D[]
长度为3的位置,并表示3D空间中的三角形.
附加信息:
生成的模型将进行3D打印.在bool[,,]
,true
表示物质的存在,而false
表明没有物质.我需要避免使用立方体模型,其中每个像素都被立方体替换(根据我的目的,这将是无用的).模型应尽可能平滑且尽可能准确.
我试图做的:
1-我实现了行进立方体算法,但似乎没有创建它来接受值的"范围".
2-我一直在努力制作自己的算法,但我部分失败了.(这真的很复杂.如果你想了解更多信息,请告知)
一些我不知道如何实现的预期解决方案:
1-修改Marching cube算法,以便使用a bool[,,]
2-修改Marching cube算法,以使其使用"范围" isolevel
值的工作
3-展示如何在WPF中实现适合我的目的的另一种算法(可能是Ray-Casting算法).
4-请求我尝试实现的算法源,然后向我展示如何解决它.(它首先是将a多边形化bool[,,]
)
5-其他一些神奇的解决方案.
提前致谢.
编辑:
通过说
使用a
bool[,,]
,我想检索List<Point3D[]>
每个Point3D[]
长度为3的位置,并表示3D空间中的三角形.
我的意思是我想要检索一组三角形.每个三角形应表示为3 Point3D
秒.如果您不知道Point3D
它是什么,它struct
包含3个双打(X,Y和Z),用于表示3D空间中的位置.
行进立方体算法的问题在于它有点模糊.我的意思是,通过这样做,你有什么理解?
cubeindex = 0;
if (grid.val[0] < isolevel) cubeindex |= 1;
if (grid.val[1] < isolevel) cubeindex |= 2;
if (grid.val[2] < isolevel) cubeindex |= …
Run Code Online (Sandbox Code Playgroud) 我的任务是使用Helix Toolkit可视化标量的3D字段。输入数组包含双精度值,没有限制,但通常在[-50000,+50000]之间。标量值影响多维数据集的颜色:最小值具有蓝色,0-白色,最大值-红色。所有其他颜色值均与该值进行插值。
现在,我正在尝试了解HelixToolkit.Wpf.SharpDX中的颜色转移贴图如何工作。为此,我创建了一个2x2x1标量的简单字段。
MainWindow.xaml
<hx:Viewport3DX
Name="view1"
Grid.Row="1"
BackgroundColor="SkyBlue"
Camera="{Binding Camera}"
EffectsManager="{Binding EffectsManager}"
EnableDesignModeRendering="True"
UseDefaultGestures="False"
CameraRotationMode="Trackball">
<hx:Viewport3DX.InputBindings>
<KeyBinding Key="B" Command="hx:ViewportCommands.BackView" />
<KeyBinding Key="F" Command="hx:ViewportCommands.FrontView" />
<KeyBinding Key="U" Command="hx:ViewportCommands.TopView" />
<KeyBinding Key="D" Command="hx:ViewportCommands.BottomView" />
<KeyBinding Key="L" Command="hx:ViewportCommands.LeftView" />
<KeyBinding Key="R" Command="hx:ViewportCommands.RightView" />
<KeyBinding Command="hx:ViewportCommands.ZoomExtents" Gesture="Control+E" />
<MouseBinding Command="hx:ViewportCommands.Rotate" Gesture="RightClick" />
<MouseBinding Command="hx:ViewportCommands.Zoom" Gesture="MiddleClick" />
<MouseBinding Command="hx:ViewportCommands.Pan" Gesture="LeftClick" />
</hx:Viewport3DX.InputBindings>
<hx:VolumeTextureModel3D VolumeMaterial="{Binding VolumeMaterial}" />
</hx:Viewport3DX>
Run Code Online (Sandbox Code Playgroud)
MainWindowViewModel.cs
public MainWindowViewModel()
{
Nx = 2;
Ny = 2;
Nz = 1;
var m = new VolumeTextureDiffuseMaterial(); …
Run Code Online (Sandbox Code Playgroud) 问题几乎就是标题.
我有一个3d卷作为原始数据加载[256, 256, 256] = size(A)
.它只包含零和一的值,其中1表示结构,0表示"空气".
我想在MATLAB中可视化结构,然后在其上运行一个算法并在其上放置一个叠加,让我们说红色.
所以更准确一点:
我已经阅读了MathWorks教程,但他们没有帮助.我尝试使用该set
命令,但它没有完全说出每个属性我尝试"无效的根属性".
我有一个解剖体图像(B),它是索引图像i,j,k:
B(1,1,1)=0 %for example.
Run Code Online (Sandbox Code Playgroud)
该文件仅包含0和1。
我可以使用isosurface正确可视化它:
isosurface(B);
我想在j中的某个坐标处削减体积(每个体积都不同)。
问题在于该体积垂直倾斜,可能具有45%的度,因此切割将不会遵循解剖体积。
我想为数据获取一个新的正交坐标系,因此我在坐标j处的平面将以更准确的方式削减解剖体。
有人告诉我要使用PCA进行此操作,但是我不知道如何执行此操作,因此阅读帮助页面也无济于事。任何方向都欢迎!
编辑:我一直在遵循建议,现在我得到了一个新的体积,以零为中心,但是我认为轴并没有按照他们的意愿跟随解剖图像。这些是前后图像:
这是我用来创建图像的代码(我从答案中得到了一些代码,并从注释中得到了一些想法):
clear all; close all; clc;
hippo3d = MRIread('lh_hippo.mgz');
vol = hippo3d.vol;
[I J K] = size(vol);
figure;
isosurface(vol);
% customize view and color-mapping of original volume
daspect([1,1,1])
axis tight vis3d;
camlight; lighting gouraud
camproj perspective
colormap(flipud(jet(16))); caxis([0 1]); colorbar
xlabel x; ylabel y; zlabel z
box on
% create the 2D data matrix
a = 0;
for i=1:K
for j=1:J
for k=1:I
a = a + 1; …
Run Code Online (Sandbox Code Playgroud) 我想评估曲面的值来实现行进四面体算法,但我不明白如何使用.raw无格式数据.
将带有卷数据集的.raw文件加载到1D字节数组后,应该应用什么算术转换来获取与X,Y,Z相关的值?这是我知道加载.raw文件的唯一方法,我可以创建一个3D字节数组而不是这个吗?怎么样?
int XDIM=256, YDIM=256, ZDIM=256;
const int size = XDIM*YDIM*ZDIM;
bool LoadVolumeFromFile(const char* fileName) {
FILE *pFile = fopen(fileName,"rb");
if(NULL == pFile) {
return false;
}
GLubyte* pVolume=new GLubyte[size]; //<- here pVolume is a 1D byte array
fread(pVolume,sizeof(GLubyte),size,pFile);
fclose(pFile);
Run Code Online (Sandbox Code Playgroud) 我想使用以下代码行在13个z
位置绘制离散的2D图像[4:4:52]
.
a=100;
[mesh.x,mesh.y,mesh.z] = meshgrid(1:1:100,1:1:100,4:4:52);
a_unifdist=0;
b_unifdist=10;
noise=a_unifdist+(b_unifdist-a_unifdist).*rand(100,100,13);
c = (a./mesh.x)+noise;
slice(c,1:100,1:100,4:4:52);
Run Code Online (Sandbox Code Playgroud)
但是,我从1到13得到13个连续图,而不是13个离散位置,如下所示:
有人能告诉我我的错误是什么吗?我希望图像堆叠在[4:4:52]
z轴上的位置.谢谢.
我正在编写一个体积渲染程序,它不断调整某些平面几何体,因此它总是面向相机.每当相机旋转时,平面几何体就会旋转,以使其看起来好像不会移动 - 相对于场景中的其他所有内容.(我使用相机的观察方向作为这些平面几何的法线向量.)
目前我手动存储自定义旋转矢量('旋转')并在渲染函数中应用其影响如下:
gl2.glRotated(rotations.y, 1.0, 0.0, 0.0);
gl2.glRotated(rotations.x, 0.0, 1.0, 0.0);
Run Code Online (Sandbox Code Playgroud)
然后我通过使用旋转值围绕x和y轴旋转初始视图方向(0,0,-1)来获得查看方向.这是以下面的方式完成的.最终的查看方向存储在"视图"中:
public Vec3f getViewingAngle(){
//first rotate the viewing POINT
//then find the vector from there to the center
Vec3f view=new Vec3f(0,0,-1);
float newZ=0;
float ratio=(float) (Math.PI/180);
float vA=(float) (-1f*rotations.y*(ratio));
float hA=(float) (-1f*rotations.x)*ratio;
//rotate about the x axis first
float newY=(float) (view.y*Math.cos(vA)-view.z*Math.sin(vA));
newZ=(float) (view.y*Math.sin(vA)+view.z*Math.cos(vA));
view=new Vec3f(view.x,newY,newZ);
//rotate about Y axis
float newX=(float) (view.z*Math.sin(hA)+view.x*Math.cos(hA));
newZ=(float) (view.z*Math.cos(hA)-view.x*Math.sin(hA));
view=new Vec3f(newX,view.y,newZ);
view=new Vec3f(view.x*-1f,view.y*-1f,view.z*-1f);
//return the finalized normal viewing direction
view=Vec3f.normalized(view);
return view;
} …
Run Code Online (Sandbox Code Playgroud) 如果我在Matlab中获得了轮廓
[f, v] = isosurface(x, y, z, v, isovalue)
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方法将变换应用于曲面并很好地将结果绘制为光滑的表面?转变T
是非线性的.
我试图将转换T
应用于两者f
并且vert
使用patch
但不能完全使用它.
我正在开发使用VTK进行可视化的C ++应用程序。我需要读取.vtr文件(RectilinearGrid),并使用VTK体积渲染功能对其进行渲染。
我尝试使用Paraview做到这一点,而且非常容易,我只需要应用“ IsoVolume”过滤器,结果就是我所需要的:
问题是...如何在C ++中做到这一点?IsoVolume过滤器属于ParaView家伙制作的VTK的扩展,因此它不在我的库中,并且我没有找到没有链接错误即可导入这些类的方法。
有没有更简单的方法?VTK中是否有IsoVolume过滤器的替代品,可用于直线网格数据?
我正在尝试创建一个 3D 阵列,然后在(在其他软件或体积渲染包中)像 Lorenz Attractor 这样的奇怪吸引器上执行体积渲染。例如,从数据点绘制吸引子并提供一个值来分配颜色并在 matplotlib 中进行可视化是很容易的。
但是我想要一个填充的体积数组。我尝试过像 griddata 这样的插值方法,但它没有给出想要的结果。我的设想是这样的:
这是来自维基百科页面。
这是我尝试过的,但如果你在一个简单的查看器中打开结果,它看起来不太好。我在想,也许只在组成 x、y、z 数组的点之间进行插值……玩了几个小时后,我有点迷茫。我认为我需要的是取点并进行某种插值或填充到数组中,在这里我调用 interp_im。然后可以在体积渲染中查看。非常感谢任何帮助!
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from scipy.interpolate import griddata
from scipy.interpolate import LinearNDInterpolator
from skimage.external import tifffile
rho = 28.0
sigma = 10.0
beta = 8.0 / 3.0
def f(state, t):
x, y, z = state # Unpack the state vector
return sigma * (y - x), x * (rho - z) - y, x * y …
Run Code Online (Sandbox Code Playgroud)