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變換,請關注後續更新。
本文原創,文章連結