2012-02-16 76 views
22

我是圖像處理新手,我正在檢測文檔圖像中的線條。我讀了霍夫線轉換的理論,但我不明白爲什麼我必須在使用opencv調用該函數之前必須使用Canny,就像在許多教程中所說的一樣。在這種情況下找到邊緣有什麼意義?事實是,如果我在HoughLines()之前不使用Canny或閾值,結果將非常混亂。我希望有人會爲我解釋原因。在HoughLines(opencv)之前Canny有什麼用?

教程2我讀過:

  1. Imgproc Feature Detection
  2. Hough Line Transform
+0

請提供一個最簡單的工作示例,並鏈接到您提到的「許多教程」之一。 – Unapiedra 2012-02-16 11:40:10

+1

謝謝你的鏈接! – Unapiedra 2012-02-16 16:15:10

回答

9

簡短回答

cvCanny用於檢測邊緣,以及增加的對比度和圖像去除噪聲。使用Hough變換的HoughLines用於確定這些邊緣是否是線條。霍夫變換需要很好地檢測邊緣以提高效率並提供有意義的結果。

長的答案

Hough Transform的侷限性進行了更詳細的描述了維基百科。

霍夫變換的效率依賴於不同像素的像素的區域,例如,像素與其周圍鄰居之間的直接對比或者如果使用掩模區域像素區域及其周圍區域。如果所有像素都具有相似的數值,則沒有什麼東西可以作爲線條或圓圈突出顯示。這導致顏色減少(顏色變爲灰度,灰度變爲黑色和白色)以增加合約。

霍夫變換的參數數量也增加了投影在像素點中的分佈並增加了變換的複雜度,這意味着通常只有線條或圓圈可以使用它進行可靠檢測,因爲它們的參數少於3個。

在運行Hough變換之前需要檢測邊緣,否則其效率會進一步受損。另外噪聲圖像不適用於Hough變換,除非噪聲在手之前被去除。

+0

我明白了。我很抱歉我的英文不好,在閱讀文件時幫不了我的忙。謝謝你的理解。 – Risa 2012-02-16 13:03:47

9

首先,檢測線,你需要一個boolean矩陣圖像(或二進制)上工作,我的意思是:顏色是黑色白色,沒有灰度

HoughLines()正常工作的要求是將這種圖像作爲輸入。這就是您必須使用CannyTreshold的原因,將彩色圖像矩陣轉換爲布爾型之一。

霍夫變換

在一個畫面中的線實際上是一個邊緣。 Hough變換掃描整個圖像,並使用轉換將極座標中的所有像素笛卡爾座標轉換爲全像素座標; 黑色像素被省略。所以如果你第一次沒有檢測到邊緣,你將無法得到一條線,因爲HoughLines()在灰度級時不知道該如何表現。

+0

我現在明白了。非常感謝:> – Risa 2012-02-16 12:50:14

-2

所有是有關處理的二進制數據,

複雜的數據 - >(二進制數據,B的二進制數據,C的二進制數據,..)(用Canny(),索貝爾(),等等)

二進制數據 - >功能1()(使用houghlines())

b二進制數據 - >函數2()

C二元數據 - >功能3()..

二進制數據-X - >功能ON2()..

複雜的數據-X->功能1()..

HTH

1

從理論上講,你是正確的。尋找邊緣並不是絕對需要霍夫線算法的工作。

Hough的工作方式基本上是把每一個點都連接到每一個點,並且任何點都有最多的線經過它們,這些線保持不變。爲此,我們需要積分。 Canny創建了這些點。理論上你可以使用任何類型的過濾器 - 隔離所有藍色或紫色的點並將它們連接起來,無論如何 - 但邊緣效果很好。

該霍夫也不重量其線條或點。對於霍夫來說,一幅圖像是二元的 - 由1或0組成,即點或不點。沒有必要使用灰度,而Canny可以方便地返回二進制圖像。

因此,Canny始終是Hough的一部分。

相關問題