我正在尝试创建实现氡变换算法的 ac 程序。我知道对于图像 f(x,y) 是 g(phi,s) 的集合,phi 是图像的随机变换,其中 g(phi,s) 定义为:
现在,我没有太多的 C 经验,我总是使用带有 Java 和 C# 的外部库来执行复杂的数学运算。我很难为 c 找到一个,我也很难创建一个函数来做到这一点,我一直在研究数值积分,但这是针对定积分的。任何帮助,将不胜感激
我正在尝试创建实现氡变换算法的 ac 程序。我知道对于图像 f(x,y) 是 g(phi,s) 的集合,phi 是图像的随机变换,其中 g(phi,s) 定义为:
现在,我没有太多的 C 经验,我总是使用带有 Java 和 C# 的外部库来执行复杂的数学运算。我很难为 c 找到一个,我也很难创建一个函数来做到这一点,我一直在研究数值积分,但这是针对定积分的。任何帮助,将不胜感激
并且通常不要依赖您的手写代码来解决此类问题,这些问题在某些情况下非常复杂并且必须进行测试和强调。如果您在 C Gnu 科学库中编程可以帮助您进行积分计算。
免责声明:可能存在图像处理社区已知的 Radon 变换的专门实现。我不知道那些,我只是把这个问题当作一个集成问题来处理。我看到例如。http://takinginitiative.net/2008/04/02/radon-transform-c-implementation-update/可能有一些特定的方法来计算图像的氡变换。
你在这里真正做的是沿一条线的一维积分。请参阅 Wikipedia 文章http://en.wikipedia.org/wiki/Radon_transform中的第 4 个公式。
如果您在图像上执行此操作,则用于计算积分的方法将完全取决于您选择的插值。如果您进行双线性插值,那么简单的(自适应)梯形规则可能会给您带来良好的结果。
如需 C 库为您提供帮助,您可以查看GNU Scientific Library。
要计算g(phi,s)
,您至少可以尝试最基本的求和。
首先,使用一些小步来总结f(x,y) * delta(x*sin(phi) - y*cos(phi) - s) * dx
给定的y
所有图像。那是一个循环。然后使用一些小步骤对所有图像重复上述操作。这是另一个循环,在. 哦,别忘了乘以。所以你有两个嵌套循环 for and和里面你 sum up ,例如这样的:x
dx
x
y
dy
y
dy
y
x
f(x,y) * delta(x*sin(phi) - y*cos(phi) - s) * dx * dy
#include <math.h>
#include <assert.h>
double g(double phi, double s, double xmin, double xmax, double dx, double ymin, double ymax, double dy)
{
double x, y, sum;
assert(xmin <= xmax && dx > 0);
assert(ymin <= ymax && dy > 0);
sum = 0;
for (y = ymin; y <= ymax; y += dy)
for (x = xmin; x <= xmax; x += dx)
sum += f(x,y) * delta(x*sin(phi) - y*cos(phi) - s) * dx * dy;
return sum;
}
您只需要定义f()
返回图像数据并delta()
选择合适的dx
和dy
(不要太大,也不要太小)。这应该会给你一些初步的结果。