用OpenGL修改图像?

时间:2010-04-28 11:13:24

标签: c++ opengl

我有一台获取XRay图像的设备。由于一些技术限制,探测器由异质像素大小和多个倾斜和部分重叠的瓦片组成。因此图像失真。探测器的几何形状是精确的。

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

我没有使用OpenGL编程的经验,我在网上找到的大部分信息都没用。我该怎么办?我该怎么做呢 ?

图像尺寸为560x860像素,我们需要处理720张图像。我在Ubuntu上。

5 个答案:

答案 0 :(得分:4)

OpenGL用于渲染多边形。你可以做多次传递并使用着色器来获得你想要的东西,但你最好在Open C L中重写算法。如果没有可用的图形加速卡,那么你可以获得便携式甚至使用多核CPU的奖励。

答案 1 :(得分:2)

而不是OpenGL,这听起来像是一个CUDA,或者更普遍的GPGPU问题。

如果您已经使用C或C ++代码,那么CUDA应该只是确定您要在GPU上使用的类型以及如何平铺算法。

答案 2 :(得分:1)

如果你想用OpengGL做这件事,你通常会把当前数据作为纹理提供,然后编写一个处理该数据的片段着色器,并将其设置为渲染到纹理。完全呈现输出纹理后,您可以将其检索回CPU并将其作为文件写出来。

我担心在不了解更多关于你正在做的事情的情况下,做一个非常概括的整体流程草图很难做 - 但如果(如你所说)你已经用CUDA完成了这个,那么你显然已经对大部分细节都有了相当公正的想法。

答案 3 :(得分:1)

你在这里问的是“我怎么能用GPU来解决这个问题?”

现代GPU基本上是线性代数引擎,因此您的第一步是将问题定义为转换输入坐标的矩阵。 x,y>它在同质空间中的输出:

alt text

例如,您将表示将x缩放½,将y缩放1.2,并向上和向左平移两个单位的转换:

alt text

您也可以为rotationshear等制作类似的变换。

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

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

简单地将内部循环从ad-hoc数学转换为经过优化的线性代数子程序,可以为您提供足够的性能提升。

答案 4 :(得分:0)

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

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