英文:
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('Backprojection from 45 degrees')
"
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, [], 'all')-max(I2, [], 'all');
I3 = iradon([R(:,46) R(:,46)],[45 45])/2;
I4 = iradon([R(:,46) R(:,46) R(:,46)],[45 45 45])/3;
D2 = max(I3, [], 'all')-max(I4, [], 'all');
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 "none"
, 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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论