今天心血来潮,想搞搞图像处理,就琢磨起MATLAB里的iradon
函数。这玩意儿听起来挺玄乎,就是把图像的投影数据给它“反”回去,变回原始图像。有点像CT扫描的逆过程,挺有意思的。
动手前的准备
我有点懵,不知道从哪儿下手。于是我就去网上搜搜资料,看看别人是怎么用这个函数的。网上资料还真不少,各种专业术语,看得我头大。不过慢慢地也摸到一些门道。
我知道要用这个函数,得先有个“投影数据”。这玩意儿是简单来说,就是把一个图像从不同角度“拍”一遍,记录下来的数据。就像CT扫描,从各个角度给人体拍X光片一样。
搞个图像来试试
有大概的解后,我就开始动手实践。我没急着自己去弄投影数据,那太麻烦。我先找个现成的图像来试试,就是MATLAB自带的那个“Shepp-Logan Head”图像,这图像在图像处理界挺有名的,经常被拿来做实验。
我用phantom
函数把这个图像加载进来:
P = phantom(256);
imshow(P)
图像显示出来,一个模拟人头部的图像,挺清晰的。
模拟投影
就是模拟投影的过程。我用radon
函数来做这个事情。这个函数就是用来计算图像的投影数据的。
我设置三个不同的投影角度:
theta1 = 0:10:170;
[R1,xp] = radon(P,theta1);
这里,theta1
就是一个角度的集合,从0度到170度,每隔10度取一个值。radon
函数会根据这些角度来计算投影数据,结果保存在R1
里。那个xp
是干啥的我也不清楚。
见证奇迹的时刻
有投影数据,就可以用iradon
函数来重建图像!我激动地搓搓手,输入以下代码:
I1 = iradon(R1,theta1);
imshow(I1)
运行!Duang的一下,图像出来!虽然有点模糊,但确实是那个“Shepp-Logan Head”图像!我成功!
调整参数,看看效果
我有点不满足,想看看能不能把图像重建得更清晰一些。于是我又去查查iradon
函数的用法。原来,这个函数还有几个可选参数,可以用来调整重建的效果。
我试着加几个参数:
I2 = iradon(R1,theta1,'linear','Ram-Lak');
imshow(I2)
这里,'linear'
表示使用线性插值,'Ram-Lak'
表示使用Ram-Lak滤波器。运行结果,图像确实清晰一些!
折腾完毕,收工!
折腾半天,我对iradon
函数总算是有一个初步的解。虽然还有很多细节没搞明白,但至少能跑起来,也算是一个小小的进步。以后有时间再慢慢深入研究。
这回实践还是挺有收获的。我发现,学习这些东西,光看理论是不行的,还得动手实践,才能真正理解它的原理和用法。而且遇到问题不要怕,多查资料,多尝试,总能找到解决办法的。