2012-04-11 296 views
0

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

回答

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

现在你只需要为每一个角度做到这一点,并添加他们都放弃了。

+0

虽然我不允许使用iradon命令,但我试过它给了我一些随机图像。我需要获得像汽车或树木这样的真实形象。 和角度跨度[0,pi] 这里是矩阵,如果有帮助:http://www.mediafire.com/?rn6j2h7rbkje3oe – dum 2012-04-11 20:47:44

+0

这听起来像这是你的功课,所以我已经添加了该标记。你知道背投影是如何工作的(即在纸上)? – aganders3 2012-04-11 20:50:38

+0

好的,我刚刚打开了你的投影矩阵 - 这是扇形束数据吗? – aganders3 2012-04-11 20:55:23