时间:9-26
作者:老李
目标
1.编写程序,实现特殊几何形状,如圆、椭圆、三角形、正方形等的正投影。
2.编写程序,实现离散化图像的正投影。
思路
首先需要理解正投影这一概念。正指的是方向的正,通俗的讲就是光线自上而下地投放。我们要得到的正投影相当于做radon变换时, 中 的那个效果。
其实对于这两个目标而言,做的是一件事情。而一个灰度图像完全可以理解为一个二维矩阵,投影的话无非是对每一列求和映射到与图片的宽相同的向量上,然后输出图像表示出来。
过程
我用matlab来实现这件事情
img = imread('picture');%读图
gImg = rgb2gray(img); %这里用的是灰度图
InjectR1=sum(gImg);
l=length(InjectR1);
x = 1:l;
subplot(1,3,1);
plot(x,InjectR1);
subplot(1,3,2);
imshow(gImg);
y=radon(gImg,0); %做零度角的radon变换
c = length(y);
x = 1:c;
subplot(1,3,3);
plot(x, y)
比如我使用一个矩形
值
左边是我的结果,右边是matlab自带的radon函数作用的结果。
有没有感觉我的效果其实更加真实,因为最左端是一片白,值应该比较大。
但是为什么matlab自带的radon效果会是右边这样,我还需要通过查找文档进一步去理解。
上面这个问题最后讲,我先展示一下其他图形正投影的效果
以及吴宣仪(离散图片)
贴张原图感受一下
matlab中对于radon变换算法的描述
我先把原图贴出来
图像的radon变换是每个像素的radon变换之和。
该算法首先将图像中的像素划分为四个子像素,并分别投影每个子像素,如上图所示。
每个子像素的贡献根据投影位置和像素中心之间的距离按比例分配给两个最邻近的容器。如果子像素投影击中容器的中心点,则轴上的容器将获得子像素的完整值,或像素值的四分之一。如果子像素投影击中两个存储箱之间的边界,则子像素值在两个存储箱之间均匀分割。
意思就是matlab吧接收器的个数弄成了像素点的两倍。
但是到了这一步还是没有找到我的图与matlab中radon函数作用后的图的区别。
先发了。。。找点成就感,这个问题以后再补充
10-8 补充
这个问题今天学姐告诉我了,为啥radon变换会把图像平移和放宽。
是这样的,图像再进行radon变换的时候,某一发方向的射线所经过的像素点的个数不再是图像的长度了,而有可能变得更多或者更少,所以radon变换事先把所经过的像素个数可能的最大值求出来。
所以在执行radon函数时,要先把自变量扩宽。如果是0度正投影投射的话,那一开始的部分就假设他为零,直到接触到图像的边缘。
这里有个很好的思考题:就是什么时候,图像的左端不是从零开始的(假设图像的左边缘不是纯黑的)。那就是图像的角刚刚戳到左端的时候。如果这个图片是一个正方形的图片,那就是radon变换为45度角的时候。