radon变换 matlab 代码,Radon变换及其Matlab代码实现

Radon变换和Hough变换类似,最初是用于检测图像中的直线(例如笔直的街道边沿、房屋的边沿、

笔直的电线等)。

关于Hough变换,可以参考OpenCV中的代码和示例(其实除了Hough Lines还有Hough Circles等等变种),

此处不再赘述。

关于Radon变换,可以参考wiki或者百科,或者网络上的其他资料介绍。

这里做一个简单的总结。

首先准备一张灰度化的图像,及黑白图像,然后检测图像的边缘(如Canny算子,Sobel算子等等,

主要是灰度梯度方法吧)

假设我们得到一幅图像的边缘图像,然后找出这些边缘中的直线(段),除了之前的Hough算法之外,

这里使用Radon变换。

Radon变换核心在于“线积分”,针对一幅图像,具体来说就是:

设置一个方向(水平自左至右为0度,垂直自下至上为90度,以此类推)

按照这个方向对图像进行“列向量求和”

以0度为例,就是从图像的第1列开始,计算这一列上所有像素的灰度值之和;如此一直计算到最后一列。

以30度为例,如下图,X'为积分方向,对红色垂线所在列的像素进行灰度值叠加求和,

得到积分如图中的淡蓝色小块(仅作示意,可能不准确)

c47969cf25a5e79f0ad16ea45bdb40bd.png

其他角度类似。

如果图像中有一条亮白的直线段,那么会存在这样的情况,

沿着某个方向积分得到的积分图没有“突变”(平缓,没有特别的尖峰)

沿着与之垂直的聆听一个方向则存在“突变”

下图是一个简单的示例

1371790b4e5cb8720c1dd02a0dd607e0.png

至此,你应当能体会到Radon变换的原理了。

接下来用Matlab进行测试

%% Radon Transform

function RadonTest()

fileName=input('Input image file name:');

srcImage=imread(fileName);

grayImage=rgb2gray(srcImage);

cannyImage=edge(grayImage,'canny');

theta=0:180;

[R,x]=radon(cannyImage,theta);

figure,imagesc(theta,x,R);

title('R_theta X');

xlabel('theta(degree)');

ylabel('X\prime');

colormap(hot);

colorbar;

end

首先载入一张图片,然后灰度化,接着检测边缘

然后针对边缘原图像进行Radon变换

最后得到结果

示例1

原图像(有一条直线段)

dd37d1564eda56532d7720b2c1e4395f.png

Radon变换结果

b7049963b0ca608302c7d751c3d5838e.png

其中的极亮(暗)点对应的是 X'=-45, theta=50° (大概位置),这表明原图像中截距45处,50+90=140°方向有一条直线(段)

示例2

原图像

bd352da21fb963da42daee81355bce35.png

Radon变换结果

d2bf3bfb368fe938b334bfc1a5a32164.png

我正在尝试利用OpenCV或者EmguCV实现Radon变换,请关注后续更新。

本文原创,文章链接

http://blog..net/fengyhack/article/details/41873119

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值