C语言实现radon变换

因为实验室的要求,需要用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:  
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是使用C++实现Radon变换的简单示例代码: ```cpp #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { // 读取图像 Mat image = imread("image.jpg", 0); // 以灰度模式加载图像 if (image.empty()) { std::cout << "无法加载图像" << std::endl; return -1; } // 创建Radon变换结果图像 int diagonalLength = image.rows + image.cols - 1; // 对角线长度 Mat radonImage(diagonalLength, 180, CV_32FC1, Scalar(0)); // 创建一个浮点型单通道图像 // 进行Radon变换 for (int angle = 0; angle < 180; angle++) { Mat rotated; Point2f center(image.cols / 2.0, image.rows / 2.0); Mat rotationMatrix = getRotationMatrix2D(center, angle, 1.0); warpAffine(image, rotated, rotationMatrix, image.size(), INTER_LINEAR, BORDER_CONSTANT, Scalar(0)); for (int row = 0; row < diagonalLength; row++) { float sum = 0; for (int col = 0; col < image.cols; col++) { int y = row - col; if (y >= 0 && y < image.rows) { sum += rotated.at<uchar>(y, col); } } radonImage.at<float>(row, angle) = sum; } } // 对Radon变换结果进行归一化 normalize(radonImage, radonImage, 0, 255, NORM_MINMAX); // 显示Radon变换结果 imshow("Radon Transform", radonImage); waitKey(0); return 0; } ``` 在上述示例代码中,我们首先读取了一张灰度图像,然后创建了一个与原始图像大小和Radon变换范围相匹配的结果图像。接着,我们使用两层循环遍历每个角度和每个像素,计算Radon变换的结果并存储在结果图像中。最后,对结果图像进行归一化处理并显示出来。 请注意,这只是一个简单的示例,可能需要根据你的具体需求进行相应的修改和优化。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值