1. 程式人生 > >數字影象處理成長之路11:harris角點檢測

數字影象處理成長之路11:harris角點檢測

前言

    時間過去了大約一個月,成長之路已經寫到第11篇,前面的10篇使我得到了鍛鍊,初步體驗了數字影象處理的趣味,同時提高了自己的一些不足。比如數學知識有所鞏固加強。在程式設計的過程中,我只是把原理初步的用c++描述出來,當執行程式後,發現效率總不令人滿意,這也在提醒我,優化演算法與程式碼的重要性,但在優化的過程中還要儘量不犧牲程式的可讀性。程式的介面用的是QT寫的,隨著介面功能的增多,提高程式碼複用並減少對封裝的破壞也是我關注的一個問題。

        總之,之前的篇可以說是知識的熱身階段,真正的學習或許是從這篇角點檢測開始,因為角點檢測是很重要的知識點,用途很多,也有一定難度。限於我目前的水品,也只能夠試著寫出自己的理解,隨著日後知識的提升,這篇文章也會加以完善。

        參考了很多文章,也會在結尾列出這些連線。關於harris角點檢測,網上雖然有很多文章,不過也都大多互相參考。有些問題,如,harris演算法與moravce演算法相比,在方向上的改進體現在哪?

        既然harris角點檢測演算法是對Moravce演算法的改進,所以我們先來看看Moravce演算法。

如果畫素在一個平坦的區域中,那麼臨近的畫素值會相差不多。如果畫素在邊緣上,那麼在與邊緣平行的方向上,畫素值較接近,而在與邊緣垂直的方向上,畫素值變化會劇烈。如果畫素是一個角點,那麼畫素值在任何方向都會出現劇烈變化。

    這是Moravce演算法的基本思路,那麼如何描述這種變化?最簡單的是用差值來表示,為了避免負數,用差值的平方來表示。

        以水平方向為例:

        其中k=w/2w為視窗大小,以3x3視窗為例,k=1,展開有: 同理可以計算出豎直方向,對角線方向。然後找到最小值,以畫素在水平邊緣為例,然後設定一個閾值T,如果,則說明這不是一個角點。

Harris演算法

    u,v為水品和垂直方向微小移動。其中 

    兩式合併:

    

        在矩陣理論中,上式稱為二次型矩陣。  是對稱矩陣。 在幾何上是橢圓。可以把矩陣M變成標準型。標準型的各項係數就是矩陣的特徵值。

        計算特徵值的方法需要很大的計算量,harris並沒有這樣做,而是利用矩陣的跡和行列式的值來計算一個角點響應R來判斷角點:

        當R為正時檢測到的是角點。其中 是M的特徵值。

程式

    本來想試著用C++寫寫演算法的實現,不過看到網上有一個寫的不錯,於是不打算寫了,這是網上的一個:     https://github.com/RonnyYoung/ImageFeatures/blob/master/source/harris.cpp


    今天這個文章就算一個筆記吧,記錄自己學習的過程,對於角點檢測的學習還沒有結束,這篇文章還有很多需要修改的地方,待我知識更多的時候,要回來完善。

參考:

http://www.cnblogs.com/ronny/p/4009425.html

http://blog.csdn.net/newthinker_wei/article/details/45603583

https://www.zhihu.com/question/38902714?from=profile_question_card