在连续的时间/空间/频率中定义的信号处理算法通常是通过在离散的网格上对信号进行采样并将积分转换为总和(以及将导数转换为差)来实现的。通过使用卷积核(即邻居的加权和)进行卷积来实现空间滤波器。
关于滤波采样的时域信号,有大量的知识。时域滤波器被实现为有限冲激响应滤波器,其中当前输出采样被计算为先前N个输入采样的加权和;或无限脉冲响应滤波器,其中当前输出是先前输入和先前输出的加权和。形式上,离散时间滤波器是使用z变换描述的,它是Laplace变换的离散时间模拟。的双线性变换映射一个到另一个(c2d
并且d2c
在Matlab)。
您将如何在任意点评估函数?
当您需要信号的值不直接位于采样网格上时,可以从附近的点内插值。内插可以很简单,例如选择最接近的样本,计算最接近的样本的加权平均值,或将任意复杂的分析函数拟合到采样数据并在所需坐标处评估此函数。插值到统一的更细网格上就是上采样。如果您的原始(连续)信号所包含的细节(即频率)不超过采样网格的一半,则可以从采样版本(Nyquist-Shannon采样定理)中完美地重构出连续函数。有关如何在2D中进行插值的示例,请参见双线性插值。
在Matlab中,您可以使用interp1
或interp2
分别插值1D或定期采样的2D数据,或griddata
从不定期采样的2D数据进行插值。
您是否有一个遍历每个体素并计算相应公式的for循环?
对,就是这样。
Matlab旨在通过矩阵和向量(即多维数组)进行操作,从而使您不必通过显式的for循环来执行此操作。在Matlab中,这称为“向量化”。定积分可以用近似sum
,cumsum
,trapz
,cumtrapz
,等。
我读过冈萨雷斯和伍兹写的《数字图像处理》一书,但我仍然茫然。我还阅读了有关数字食谱的系列丛书。那是正确的方法吗?
是的,数字食谱将是一个很好的开始。它非常实用,涵盖了最终需要使用的大多数数值方法。(您会发现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]');
过去沿射线密度的积分现在是一列离散采样图像上的总和,而这又是通过在转换后的坐标系上插值原始图像找到的。