在C ++或MATLAB中实现技术论文算法


14

我是电气工程专业的本科生。我已经阅读了许多有关信号和图像处理算法(重构,分段,滤波等)的技术论文。这些论文中显示的大多数算法都是在连续时间和连续频率上定义的,并且经常根据复杂的方程式给出解决方案。您将如何在C ++或MATLAB中从头开始实施技术论文,以便复制在该论文中获得的结果?

更具体地说,我正在看Wang等人的论文“通用锥束重建算法”(IEEE Trans Med Imaging。1993; 12(3):486-96),我想知道如何开始?实现他们的算法?公式10为您提供了处重建图像的公式。您将如何编码?您是否有一个遍历每个体素并计算相应公式的for循环?您将如何在该公式中编写函数的函数代码?您将如何在任意点评估函数?

我读过冈萨雷斯和伍兹写的《数字图像处理》一书,但我仍然茫然。我还阅读了有关数字食谱的系列丛书。那是正确的方法吗?

您从研究论文中编程算法有什么经验?有任何提示或建议吗?


1
有机会的时候我去看看报纸。但我相信,这全都与给定图形中的XYZ点有关。您定义一个顶点,然后从那里开始。

2
通常,通过采样将信号离散化,然后将积分转换为总和。
nibot 2011年

因此,我已经读过有关将积分采样和将其转换为总和的信息,但是如果被积分中的函数存储为矩阵,您如何在每个采样点评估被积分?

1
达米安(Damian),您是否看到过don投影如何通过反投影来反转?这是一个稍微简单些的示例,我可以解释一下它是否会让您感兴趣。它用于使用平面波进行层析成像,而不是您发布的论文中描述的锥形采样。 en.wikipedia.org/wiki/Radon_transform
nibot 2011年

1
@ mr-crt,是否可以迁移到dsp.SE?
nibot 2011年

Answers:


15

在连续的时间/空间/频率中定义的信号处理算法通常是通过在离散的网格上对信号进行采样并将积分转换为总和(以及将导数转换为差)来实现的。通过使用卷积核(即邻居的加权和)进行卷积来实现空间滤波器。

关于滤波采样的时域信号,有大量的知识。时域滤波器被实现为有限冲激响应滤波器,其中当前输出采样被计算为先前N个输入采样的加权和;或无限脉冲响应滤波器,其中当前输出是先前输入和先前输出的加权和。形式上,离散时间滤波器是使用z变换描述的,它是Laplace变换的离散时间模拟。的双线性变换映射一个到另一个(c2d并且d2c在Matlab)。

您将如何在任意点评估函数?

当您需要信号的值不直接位于采样网格上时,可以从附近的点内插值。内插可以很简单,例如选择最接近的样本,计算最接近的样本的加权平均值,或将任意复杂的分析函数拟合到采样数据并在所需坐标处评估此函数。插值到统一的更细网格上就是上采样。如果您的原始(连续)信号所包含的细节(即频率)不超过采样网格的一半,则可以从采样版本(Nyquist-Shannon采样定理)中完美地重构出连续函数。有关如何在2D中进行插值的示例,请参见双线性插值

在Matlab中,您可以使用interp1interp2分别插值1D或定期采样的2D数据,或griddata从不定期采样的2D数据进行插值。

您是否有一个遍历每个体素并计算相应公式的for循环?

对,就是这样。

Matlab旨在通过矩阵和向量(即多维数组)进行操作,从而使您不必通过显式的for循环来执行此操作。在Matlab中,这称为“向量化”。定积分可以用近似sumcumsumtrapzcumtrapz,等。

我读过冈萨雷斯和伍兹写的《数字图像处理》一书,但我仍然茫然。我还阅读了有关数字食谱的系列丛书。那是正确的方法吗?

是的,数字食谱将是一个很好的开始。它非常实用,涵盖了最终需要使用的大多数数值方法。(您会发现Matlab已经实现了您所需的一切,但是 数字食谱将提供出色的背景知识。)

我参加了“算法和数据结构”课程,但是我看不到那里展示的材料与实现科学算法之间的关系。

“算法和数据结构”课程中处理的材料趋向于集中于诸如包含整数或字符串的列表,数组,树和图之类的结构,以及诸如排序和选择之类的操作:通常只有一个正确结果的问题。对于科学算法,这只是故事的一半。另一半涉及估计实数和解析函数的方法。您可以在“数值方法”(或“数值分析”)课程中找到它;就像这样-向下滚动幻灯片):如何估算特殊函数,如何估算积分和导数等。这里的主要任务之一是估算结果的准确性,而一个常见的模式是迭代一个例程,以改善结果。估计直到足够准确为止。(您可能会问自己如何Matlab的知道如何做一些简单的估计值sin(x)一些x。)


作为一个简单的示例,这是一个简短的脚本,用于在Matlab中计算图像的ra度变换。don变换获取图像在一组投影角上的投影。我没有尝试沿任意角度计算投影,而是使用旋转整个图像imrotate,以使投影镜头始终垂直。然后,我们可以简单地使用进行投影sum,因为sum矩阵的会返回一个包含每一列之和的向量。

imrotate如果愿意,可以使用编写自己的代码interp2

%%# Home-made Radon Tranform

%# load a density map (image).  
A = phantom;

n_pixels = size(A, 1);  %# image width (assume square)

%# At what rotation angles do we want to take projections?
n_thetas = 101;
thetas = linspace(0, 180, n_thetas);

result = zeros(n_thetas, n_pixels);

%# Loop over angles
for ii=1:length(thetas)
    theta = thetas(ii);
    rotated_image = imrotate(A, theta, 'crop');
    result(ii, :) = sum(rotated_image);
end

%# display the result
imagesc(thetas, 1:n_pixels, result.');
xlabel('projection angle [degrees]');

过去沿射线密度的积分现在是一列离散采样图像上的总和,而这又是通过在转换后的坐标系上插值原始图像找到的。


哇@nibot,谢谢你这么详细的回答。我参加了“算法和数据结构”课程,但是我看不到那里展示的材料与实现科学算法之间的关系。我将阅读您给我的链接,并开始使用更简单的算法进行练习(从书本代替论文)。再次感谢
Damian

嗨,达米安,我修改了答案以解决您的评论。我想您会在有关数值方法/数值分析的课程或书中找到您想要的。
nibot 2011年

整个答案!
维克多·索罗金

@nibot:感谢您的编辑。我真的很喜欢您链接的数值分析课程。为什么将“有限冲激响应滤波器”链接到插值?我想知道为什么这不是EE学生课程的一部分。那好吧。谢谢!
达米安

@Damian:抽样理论,内插/抽取,Z变换,双线性变换和FIR / IIR滤波器在大学EE类/实验室中教授,例如信号和系统,通信系统,线性控制系统以及DSP入门。我将数值方法作为计算机工程双学位课程的一部分;我认为一般来说EE并不需要它。
星期日Eryk

3

除了nibot的出色解释之外,还有其他几点。

  • 与使用通用编程语言(例如C ++)自己完成所有操作相比,诸如MATLAB,Octave或SciPy / NumPy之类的数值计算环境将为您节省很多精力。处理double数组和循环与将数据类型(如复数)和运算(如整数)触手可及相比是无法相比的。(肯定是可行的,好的C ++代码可以快一个数量级,具有好的库抽象和模板,甚至可以相当干净和清晰,但是从例如MATLAB入手绝对容易。)

  • MATLAB还具有用于图像处理数字信号处理的 “工具包” ,这可能会有所帮助,具体取决于您的工作。

  • Mitra的《数字信号处理》是一本不错的书(在MATLAB中!),它学习离散时间,滤波器,变换等的基础知识,这对于完成任何体面的技术算法来说是必不可少的知识。

是的,我已经阅读了Image Processing Toolboox的文档。我似乎非常有用,但是我的问题旨在实现这样的目标。基本上,我想知道如何采用数学算法/公式并实现它(就像Mathworks对IPT所做的那样)。我想知道这种思维模式或一些准则。我会看米特拉的书。谢谢!
达米安

1
为了增加上述答案,像Armadillo这样的C ++工具包可以极大地简化Matlab代码到快速C ++代码的转换。Armadillo的语法类似于Matlab。您还可以通过Armadillo的mex界面将'n'match Matlab和C ++代码混合使用。
mtall 2014年

2

数值方法。通常是一门高等大学课程和教科书。

DSP通常接近数值方法和有效实现的交集。如果您忽略效率,那么您可能会寻找可以为感兴趣的技术论文方程式产生“足够准确”结果的任何数值逼近方法。有时可能要处理采样数据,其中采样定理将限制数据采集方法(预过滤)以及可以为该数据获得的结果的范围或质量。

有时,Matlab,数字配方或各种图像/信号处理库将具有用于所需数字解的有效算法或代码。但是有时您可能必须自己动手,因此有助于了解各种数值解法背后的数学原理。这本身就是一个大课题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.