【发布时间】:2012-04-24 04:50:18
【问题描述】:
我有一个 256x256 的投影矩阵。每行都是以相等角度拍摄的投影。我需要使用 matlab 生成带有反投影的原始图像,我对 matlab 并不熟悉。你能建议我任何代码示例或算法吗?我发现了一些类似的代码,我无法使用它们生成原始图像。
【问题讨论】:
我有一个 256x256 的投影矩阵。每行都是以相等角度拍摄的投影。我需要使用 matlab 生成带有反投影的原始图像,我对 matlab 并不熟悉。你能建议我任何代码示例或算法吗?我发现了一些类似的代码,我无法使用它们生成原始图像。
【问题讨论】:
如果您有图像处理工具箱,使用iradon 命令应该相对简单。如果你不这样做,它会有点困难,因为你需要推出你自己的版本。显然你不能使用它,但是如果我使用它,我会得到一张图片:
I = iradon(Pteta',linspace(0,179,size(Pteta,1));
那么,你自己怎么做呢?我会尽力帮助你,但不给你答案——这毕竟是功课!
首先,考虑一下您的 0 度投影。想象一下您投影的轴有 1,256 个单位。现在想象这些坐标在你的图像上的反向投影,它看起来像这样:
类似地,想象一个 90 度的投影应该是这样的:
酷,我们可以使用[X, Y] = meshgrid(1:256); 获得这些矩阵,但是离轴投影呢?想想沿某个角度线的距离,例如转换极坐标/笛卡尔坐标:
theta = 45 % projection angle in degrees
t = X*cosd(theta) + Y*sind(theta);
而且它有效!
但是有一个问题!注意到现在值上升超过 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));
对于我们的偏心版本,这给了我们这个图像,或者类似的东西:
现在您只需要对每个角度都执行此操作,然后将它们全部加起来。
【讨论】: