0

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

4

1 回答 1

1

iradon如果您有图像处理工具箱,则该命令应该相对简单。如果你不这样做,它会有点困难,因为你需要推出你自己的版本。显然你不能使用它,但是如果我使用它,我会得到一张图像:

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

那么,你怎么能自己做到这一点呢?我会在不给你答案的情况下一路帮助你——这毕竟是功课!

首先,考虑一下你的 0 度投影。想象一下您投影的轴有 1,256 个单位。现在想象这些坐标在你的图像上的反向投影,它看起来像这样: 0 度投影的反投影坐标

同样,假设一个 90 度的投影看起来像这样: 0 度投影的反投影坐标

很酷,我们可以使用 得到这些矩阵[X, Y] = meshgrid(1:256);,但是离轴投影呢?想想沿某个角度线的距离,例如转换极坐标/笛卡尔坐标:

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

它有效!

45 度投影的反投影坐标

不过有问题!注意到现在值上升超过 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度反投影

现在你只需要对每个角度都这样做,然后把它们加起来。

于 2012-04-11T20:33:41.767 回答