在Matlab中实现Radon变换,输出大小



由于我的问题的性质,我想评估Radon变换在Matlab中的数值实现(即不同的插值方法给出不同的数值)。

在尝试编写自己的Radon代码并将其与Matlab的输出进行比较时,我发现我的Radon投影大小与Matlab不同。

因此,如果需要氡气样本,我可以凭直觉来计算数量。让我们做2D案例。


其思想是,最大尺寸将是在radon变换中投影对角线(至少为矩形)部分时,因此为diago=sqrt(size(I,1),size(I,2))。因为我们什么都不想得到,n_r=ceil(diago)n_r应该是离散样本量的radon变换应该确保没有遗漏任何数据。

我注意到Matlab的radon输出总是均匀的,这是有道理的,因为你希望"射线"总是穿过旋转中心。我注意到,在所有情况下,数组的端点都有2个零。

所以在这种情况下,n_r=ceil(diago)+mod(ceil(diago)+1,2)+2;

然而,我似乎与Matlab有一些小的差异。

A MWE:

 % Try: 255,256
 pixels=256;
 I=phantom('Modified Shepp-Logan',pixels);
 rd=radon(I,pi/4);
 size(rd,1)
 s=size(I);
 diagsize=sqrt(sum(s.^2));
 n_r=ceil(diagsize)+mod(ceil(diagsize)+1,2)+2

rd=
   367

n_r =
   365

由于Matlab的Radon变换是一个我无法研究的函数,我想知道为什么会有这种差异。

我又看了一眼这个问题,我相信这实际上是正确的答案。从radon.m的"隐藏文档"(键入edit radon.m并滚动到底部)

老语法

R=RADON(I,THETA,N)返回一个RADON变换在N个点计算的投影。R有N行。如果没有指定N,即计算投影的点数是:

   2*ceil(norm(size(I)-floor((size(I)-1)/2)-1))+3

这个数字足以计算单位投影间隔,甚至沿着对角线。

我没有尝试重新驱动这个公式,但我认为这就是你想要的。

这是一个相当专业的问题,所以我会在不完全确定它是你特定问题的答案的情况下提出一个想法(通常我会通过并让其他人回答,但我不确定有多少stackoverflow的读者研究过radon)。我认为您可能忽略了radon函数调用文档中的floor函数。来自文档:

xp中返回的径向坐标是沿x轴的值,即从x轴逆时针以θ度定向。两者的起源axis是图像的中心像素,它被定义为

floor((size(I)+1)/2)

例如,在20×30的图像中,中心像素为(10,15)。

这为你传入的奇数或偶数大小的问题提供了不同的行为。因此,在你的例子("Try:255256")中,奇数和偶数需要不同的情况,这可能涉及(实际上)用零的行和列填充。

最新更新