1. 程式人生 > >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'為積分方向,對紅色垂線所在列的畫素進行灰度值疊加求和,

得到積分如圖中的淡藍色小塊(僅作示意,可能不準確)


其他角度類似。

如果影象中有一條亮白的直線段,那麼會存在這樣的情況,

沿著某個方向積分得到的積分圖沒有“突變”(平緩,沒有特別的尖峰)

沿著與之垂直的聆聽一個方向則存在“突變”

下圖是一個簡單的示例


至此,你應當能體會到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

原影象(有一條直線段)


Radon變換結果


其中的極亮(暗)點對應的是 X'=-45, theta=50° (大概位置),這表明原影象中截距45處,50+90=140°方向有一條直線(段)

示例2

原影象


Radon變換結果


我正在嘗試利用OpenCV或者EmguCV實現Radon變換,請關注後續更新。

本文原創,文章連結