如何对单个投影向量执行逆Iradon变换?

huangapple go评论66阅读模式
英文:

How to implement a inverse Iradon Transform to a single projection vector?

问题

对于你提到的反向 Radon 变换中结果除以2的问题,MathWorks网页上的示例是正确的。这个步骤是为了正确地处理数据,因为 iradon 函数中的 theta 参数表示投影的角度,通常情况下应该是一个矢量,而不是标量。当你使用 iradon([r45 r45], [45 45])/2; 时,实际上是将 r45 投影矢量分别应用于 45 度和 45 度两个角度,然后将结果除以2以进行适当的归一化,以便获得正确的反投影结果。

你提到的 I1 = iradon([R(:,46) R(:,46)],[45 45]); 在这个上下文中不正确,因为 iradon 函数通常期望一个矢量 theta 和一个投影矩阵,而不是两次重复的相同投影矢量。

因此,MathWorks网页上的示例代码 I = iradon([r45 r45], [45 45])/2; 是正确的,目的是正确地处理单个角度的投影并得到正确的反投影结果。

英文:

My question is the example at inverse Iradon Transform to a single projection vector, why the result of iradon need to be divided by 2? <https://www.mathworks.com/help/images/ref/iradon.html>.
Here is the example at the MathWorks webpage:
"

The example of 'Examine Backprojection at a Single Angle':

            P = phantom(128);

Perform a Radon transform of the image, then get the projection vector corresponding to a projection at a 45 degree angle.

            R = radon(P,0:179);
            r45 = R(:,46);

Perform the inverse Radon transform of this single projection vector. The iradon syntax does not allow you to do this directly, because if theta is a scalar it is treated as an increment. You can accomplish the task by passing in two copies of the projection vector and then dividing the result by 2.

            I = iradon([r45 r45], [45 45])/2; %Here is my question.
            Display the result.
            imshow(I, [])
            title(&#39;Backprojection from 45 degrees&#39;)

"

Btw, when I go to the Iradon.m file, I found the normalization of the command result. Which means the result of 'Iradon' is independent to the number of angles it process. To prove it, I just did the below experiment.

        P = phantom(128);
        R = radon(P,0:179);
        
        I1 = iradon([R(:,46) R(:,46)],[45 45]);
        I2 = iradon([R(:,46) R(:,46) R(:,46)],[45 45 45]);
        D1 = max(I1, [], &#39;all&#39;)-max(I2, [], &#39;all&#39;);
        
        I3 = iradon([R(:,46) R(:,46)],[45 45])/2;
        I4 = iradon([R(:,46) R(:,46) R(:,46)],[45 45 45])/3;
        D2 = max(I3, [], &#39;all&#39;)-max(I4, [], &#39;all&#39;);

The result is D1 = 0, D2 = 0.804. Which means the 'I1' and 'I2' is the same.If the example command:

        I = iradon([r45 r45], [45 45])/2;  

from MathWorks is correct. I think D2 should be 0 but it's not, and D1 is 0.
So I just image the iradon transform of a single angle should be written like:

        I1 = iradon([R(:,46) R(:,46)],[45 45]);

NOT:

        I = iradon([r45 r45], [45 45])/2;

which is presented on the MathWorks webpage. Am I wrong?

答案1

得分: 1

你说得对。

实际上没有别的可以回答的。我怀疑这可能是iradon()的旧版本遗留问题。也许可以向MathWorks提交一个问题/错误报告?

坦白地说,我不确定是不是应该更改函数。

如果将滤波器设置为"none",我期望得到基本上是一个反投影器,这意味着值应该堆叠。但相反,它们也被归一化了。我认为这是在实现上的可疑选择和缺乏支持的混合,但谁知道呢?

英文:

You are right.

Nothing else to answer really. I suspect this is an artifact from an older version if iradon(). Perhaps submit an issue/bug to MathWorks?

Admittedly, I am not sure if its the function that should change instead.

If you set the filter to &quot;none&quot;, I would expect to get essentially a backprojector, which means that the values should indeed stack. But instead, they are also normalized. I think this is a mix of dubious choices at implementation and lack of support, but who knows.

huangapple
  • 本文由 发表于 2023年3月7日 00:48:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/75653578.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定