2010-04-28 82 views
5

我有一个设备来获取XRay图像。由于一些技术上的限制,检测器由不同的像素尺寸和多个倾斜和部分重叠的瓷砖组成。图像因此失真。探测器的几何形状是精确的。用OpenGL修改图像?

我需要一个函数将这些扭曲的图像转换为具有均匀像素大小的平面图像。我已经通过CPU完成了这项工作,但我想尝试使用OpenGL以便携式方式使用GPU。

我与OpenGL的编程没有经验,而且大部分我能在网上找到的信息是无用用于此用途。我应该如何继续?我该怎么做呢 ?

图像尺寸是560x860像素,我们有720个图像的批次进行处理。我在Ubuntu上。

+0

Wihch OpenGL版本的目标是? – Danvil 2010-04-28 11:59:31

+0

这听起来有点像微软的PhotoSynth“东西”。 http://photosynth.net/ – epatel 2010-04-28 22:58:49

回答

0

您可能会发现this tutorial很有用(这有点旧,但请注意它在Cg部分之后包含一些OpenGL 2.x GLSL)。我不相信GLSL中有图像处理的捷径,如果这就是你要找的东西......你需要理解很多3D光栅化方面和历史包袱才能有效地使用它,但是一旦你做了有一个输入和输出设置框架,你可以忘记这一点,并相对容易地在你的着色器代码中使用你自己的算法。

多年来一直在做这类事情(最初使用Direct3D着色器,但最近使用CUDA),我不得不说,我完全同意推荐CUDA/OpenCL的帖子。它使生活变得更简单,并且运行速度更快。我现在必须非常绝望地回到非图形算法的图形API实现。

+0

好的。我会看看Ubuntu的新版本是否取得了一些进展,以便使使用CUDA的驱动程序更简单。请注意,我将使用纹理来存储输入像素线性组合的权重。 CUDA的确令人印象深刻。我的层析重建程序比我的GTX280上的CPU版本快600倍! – chmike 2010-04-29 15:19:15

2

而不是OpenGL中,这听起来像一个CUDA,或更一般地GPGPU问题。

如果您有C或C++代码做它已经,CUDA应该比搞清楚你想在GPU以及如何算法可以平铺使用类型多一点。

+0

我已经在CUDA中编程,但正在寻求OpenGL应该能够提供的便携式解决方案。另一件事是Ubuntu不是CUDA友好的。 – chmike 2010-04-28 11:48:15

+0

CUDA与Ubuntu完美搭配。我在Ubuntu 9.04/9.10/10.04和NVIDIA的CUDA SDK上做了很多工作。当然,艰难的CUDA仅限于Nvidia硬件... – Danvil 2010-04-28 11:58:25

+0

是... CUDA和OpenCL在Ubuntu上运行良好。 OpenCL可能是更好的想法,它更便携。 – 2010-04-28 22:34:32

4

OpenGL用于渲染多边形。你可能能够做多次通过并使用着色器来获得你想要的东西,但是你最好在Open C L中重写算法。那么奖金就是你拥有一些可移植的东西,甚至会使用多核CPU没有图形加速卡可用。

+0

OpenGL比OpenCL更具可移植性,特别是在Ubuntu上。 – chmike 2010-04-28 11:49:46

+0

OpenCL与Ubuntu完美搭配。我在Ubuntu 9.04-10.04和NVIDIA的OpenCL SDK上做了很多工作。 – Danvil 2010-04-28 11:57:36

+0

@danvil你如何安装驱动程序?我手动安装了驱动程序,但每次内核更新时,我都会在VGA中找到我自己,并且必须重新安装驱动程序。我在我的工作电脑上这样做,但这在生产机器上是不能接受的。 – chmike 2010-04-30 12:11:58

1

如果你想与OpengGL要做到这一点,你通常被作为纹理提供的最新数据,写片段着色器处理这些数据去做,将其设置为渲染到纹理。一旦输出纹理完全呈现,您可以将其检索回CPU并将其作为文件写出。

如果不知道更多关于您正在做什么的内容,恐怕很难做出比整体流程更加简洁的描述 - 但是如果(如您所说)您已经使用CUDA完成此任务,你显然已经对大部分细节有一个相当公平的想法。

+0

这就是我想要做的。使用示例代码进行更详细的解释会非常有帮助。在教程中至少有一个很好的指针,我们可以遵循全功能代码示例。 – chmike 2010-04-28 15:25:07

1

在心脏你问这里是“我如何可以使用GPU来解决这个问题?”

现代GPU基本上是线性代数的发动机,所以第一个步骤将是定义的问题,因为它可将输入的坐标< X的矩阵,Y>其在均匀空间输出:

alt text

例如,将表示由1.2缩放由&frac12 ;,缩放Y X,和翻译了的变换和由两个单位左为:

alt text

,你也可以计算出rotationshear等的类似变换。

将变换表示为矩阵向量乘法之后,您只需将源数据加载到纹理中,将变换指定为projection matrix并将其转换为结果。 GPU执行每个像素的乘法。 (你也可以编写着色器等,它们做更复杂的数学运算,考虑多个向量和矩阵以及不是什么,但这是基本思想。)

也就是说,一旦将问题表达为线性变换,就可以通过利用SIMD或其中某个many linear algebralibraries来使CPU运行速度更快。除非您需要实时性能或者需要处理大量数据,否则使用CUDA/GL /着色器等可能比它的严格价值更麻烦,因为初始化库时存在一些笨拙机械,设置渲染目标,学习图形开发的细节等。

只需将您的内循环从ad-hoc数学转换为经过良好优化的线性代数子程序,就可以为您提供足够的CPU性能提升,那里。

+0

我开始认为你的建议可能是正确的,而不是使用CPU。对于我的用例,我必须对许多图像应用完全相同的校正。因此,映射函数参数可以被预先计算,使得每个像素值可以被计算为输入图像像素的简单加权和。我已经实施了这样一个程序。 – chmike 2010-04-29 15:15:55