使用MATLAB从投影矩阵反投影

时间:2012-04-11 20:29:26

标签: matlab projection-matrix

我有一个256x256的投影矩阵。每行是以相等角度拍摄的投影。我需要使用matlab生成带反投影的原始图像,我对matlab并不熟悉。你能告诉我任何代码样本或算法吗?我发现了一些类似的代码,我无法使用它们生成原始图像。

1 个答案:

答案 0 :(得分:1)

如果你有图像处理工具箱,使用iradon命令应该相对简单。如果你不这样做,那将会更加困难,因为你需要推出自己的版本。显然你不能使用它,但是如果我使用的话,我可以获得一个图像:

I = iradon(Pteta',linspace(0,179,size(Pteta,1));

那么,你怎么能自己做到这一点?我会尽力帮助你,而不给你答案 - 毕竟这是作业!

首先,考虑一下你的0度投影。想象一下,你投射的轴有1,256个单位。现在想象一下在您的图像中反投影这些坐标,它看起来像这样: backprojected coordinates of a 0-degree projection

同样,认为90度投影看起来像这样: backprojected coordinates of a 0-degree projection

很酷,我们可以使用[X, Y] = meshgrid(1:256);来获取这些矩阵,但是离轴投影呢?只要想想沿着一些倾斜线的距离,比如转换极坐标/笛卡尔坐标:

theta = 45 % projection angle in degrees
t = X*cosd(theta) + Y*sind(theta);

它有效!

backprojected coordinates of a 45-degree projection

但是有一个问题!请注意,现在价值超过350?它也是偏离中心的。坐标现在超过了我们的投影长度,因为正方形的对角线长于边。我会留给你弄清楚如何解决这个问题,但是想想最终的图像会比初始投影小,你可能需要使用不同的单位(-127到128而不是1到256)。

现在,您可以将这些角度的投影编入索引,以反投影图像中的实际值。这里我们有第二个问题,因为值不是整数!我们可以围绕它们,这被称为最近邻插值,但它没有给出最好的结果。

proj = Pteta(angle,:);
% add projection filtering here
t = X*cosd(theta) + Y*sind(theta);
% do some rounding/interpolating to make t all integers
imagesc(proj(t));

对于我们偏离中心的版本,它会为我们提供此图像或类似内容: 45-degree backprojection

现在你只需要为每个角度执行此操作,并将它们全部添加。