因为实验室的要求,需要用C语言实现radon变换,对于刚刚我这个大二刚接触这种纯理论纯算法的人来说,真心不是一般的纠结。。。网络上搜索了好久,也没有找到。最后在CSDN论坛见过别人发过一截代码,可是看起来依然不知道什么意思,不明觉厉。。
后来装了个MATLAB后,查看MATLAB的radon函数,发现其中使用了radonc这么个函数,网上好不容易找到radonc.c文件,发现是一个MATLAB和C语言的混合编程,对于有C语言基础的人来说,看起来完全没有任何压力。。。
针对自己对于radon变换的理解,给整个代码写了注解,相信,有了这个文件,再要换成C语言版本,应该很简单吧。。
对于,这段radon变换代码,配上下面的这段关于radon变换的解释,相信更好理解!
Radon变换:
考虑b=ax+y,将原来的XY平面内的点映射到AB平面上。则原来在XY平面上的一条直线的所有的点,在AB平面上都位于同一个点。通过记录下AB平面上的点的积累厚度,可反知XY面上的一条线的存在。在新平面下得到相应的点积累的峰值,可得出原平面的显著的线集。
例如:XY平面上的一个直线 y=2x-3;
变换 -3=-2x+y; 其中:a=-2,b=-3
若有两个点在XY平面:(0,-3),(2,1),此两点都过直线,则可知有AB平面上,此两点在(-2,-3)AB平面上。
一种更好的表示方法是用r和q来代替ab。即:xcosa+ysina=r 【极坐标形势】
以图像的中心为极坐标原点,直线X`即为新的投影坐标,q为角度。我们所要求的原坐标上的一条直线,是一条垂直于上图X`的一条直线,而非X`本身。
源代码:
/* Copyright 1993-2003 The MathWorks, Inc. */
/* $Revision: 1.13.4.3 $ $Date: 2003/08/01 18:11:24 $ */
/*
*
* RADONC.C .MEX file
* Implements Radon transform.
*
* Syntax [P, r] = radon(I, theta)
*
* evaluates the Radon transform P, of I along the angles
* specified by the vector THETA. THETA values measure
* angle counter-clockwise from the horizontal axis.
* THETA defaults to [0:179] if not specified.
*
* The output argument r is a vector giving the
* values of r corresponding to the rows of P.
*
* The origin of I is computed in the same way as origins
* are computed in filter2: