圖像處理——矩

本文轉自:https://www.cnblogs.com/ronny/p/3985810.html

本文轉自:http://blog.csdn.net/gdfsg/article/details/51015066

1. 矩的概念


2. Hu矩






3. 利用OPENCV計算Hu矩


opencv裏對Hu矩的計算有直接的API,它分爲了兩個函數:moments()函數用於計算中心矩,HuMoments函數用於由中心矩計算Hu矩。

Moments moments(InputArray array, bool binaryImage=false )

參數說明

  • 輸入參數:array是一幅單通道,8-bits的圖像,或一個二維浮點數組(Point of Point2f)。binaryImage用來指示輸出圖像是否爲一幅二值圖像,如果是二值圖像,則圖像中所有非0像素看作爲1進行計算。
  • 輸出參數:moments是一個類:
class Moments
{
public:
    Moments();
    Moments(double m00, double m10, double m01, double m20, double m11,
            double m02, double m30, double m21, double m12, double m03 );
    Moments( const CvMoments& moments );
    operator CvMoments() const;
}

裏面保存了圖像的2階與3階中心矩的值。

void HuMoments(const Moments& moments, double* hu)

參數說明:

  • 輸入參數:moments即爲上面一個函數計算得到的moments類型。
  • 輸出參數:hu是一個含有7個數的數組。
int main(int argc, char** argv) 
{ 
    Mat image = imread(argv[1]);  
    cvtColor(image, image, CV_BGR2GRAY); 
    Moments mts = moments(image); 
    double hu[7]; 
    HuMoments(mts, hu); 
    for (int i=0; i<7; i++) 
    { 
        cout << log(abs(hu[i])) <<endl; 
    } 
   return 0; 
}


4. Zernike矩

Hu矩在圖像描述上有廣泛的應用,但是其低階幾何矩與圖像整體特徵有關,不包含太多的圖像細節信息,而高階幾何矩易受噪聲影響,因此很難利用幾何矩恢復圖像。

Zernike矩能夠很容易地構造圖像的任意高階矩,並能夠使用較少的矩來重建圖像。Zernike矩是基於Zernike多項式的正交化函數,雖然其計算比較複雜,但是Zernide矩在圖像旋轉和低噪聲敏感度方面具有較大的優越性。由於Zernike矩具有圖像旋轉不變性,而且可以構造任意高階矩,所以被廣泛應用對目標進行識別中。

4.1 Zernike矩多項式


4.2 Zernike矩的定義



4.3 Zernike矩的計算




5. 總結

不變矩的應用過程一般包括:

  1. 選擇合適的不變矩類型;
  2. 選擇分類器(如神經網絡、最短距離等);
  3. 如果是神經網絡分類器,則需要計算學習樣例的不變矩去訓練神經網絡;
  4. 計算待識別對象的不變矩,輸入神經網絡就可得到待識別對象的類型,或者計算待識別對象不變矩與類別對象不變矩之間的距離,選擇最短距離的類別作爲待識別對象的類別。

可以看出,不變矩作用主要目的是描述事物(圖像)的特徵。人眼識別圖像的特徵往往又表現爲“求和”的形式,因此不變矩是對圖像元素進行了積分操作。

不變矩能夠描述圖像整體特徵就是因爲它具有平移不變形、比例不變性和旋轉不變性等性質。

然而,另一方面圖像的各階不變矩究竟代表的什麼特徵很難進行直觀的物理解釋。


1. 數學中的矩


2. 圖像的幾何矩



     補充一點,懂的請無視:

      可能有人會問,爲什麼像素點的值表示的是概率?meanshift算法裏用到的反向投影圖就是概率圖。什麼又是反向投影圖呢?舉個例子。

    (1)例如灰度圖像如下

      Image=

      0 1 2 3

      4 5 6 7

      8 9 10 11

      8 9 14 15

    (2)該灰度圖的直方圖爲(bin指定的區間爲[0,4),[4,7),[7,12),[12,16))

      Histogram=

      4 3 7 2

    (3)反向投影圖

      Back_Projection=

      4 4 4 4

      3 3 3 7

      7 7 7 7

      7 7 2 2

      可見,反向投影圖就是反應了顏色分佈的概率圖。


3. 幾個圖像的不變矩

HU矩




       這7個不變矩構成一組特徵量,Hu.M.K在1962年證明了他們具有旋轉,縮放和平移不變性。實際上,在對圖片中物體的識別過程中,只有M1和M2不變性保持的比較好,其他的幾個不變矩帶來的誤差比較大,有學者認爲只有基於二階矩的不變矩對二維物體的描述纔是真正的具有旋轉、縮放和平移不變性(M1和M2剛好都是由二階矩組成的)。

       由Hu矩組成的特徵量對圖片進行識別,優點就是速度很快,缺點是識別率比較低。Hu不變矩一般用來識別圖像中大的物體,對於物體的形狀描述得比較好,圖像的紋理特徵不能太複雜,像識別水果的形狀,或者對於車牌中的簡單字符的識別效果會相對好一些。

 

  其他常見的圖像矩

        連續正交矩:Zernike矩和Legendre矩

       離散正交矩:Tchebichef矩、Krawtchouk矩、Hahn矩、Racah矩等。

       雖然非正交矩形式簡單 、計算快、易於實現,但抗噪性差、基函數非正交 ,且具有較大的信息冗餘。連續正交矩的基函數正交,不僅其矩變換可逆 ,且易於圖像重建 , 由於其各階矩相互獨立,故具有最小的信息冗餘。其不足之處是該矩的基函數只在特定範圍內是正交的。

 

4. OpenCV先關函數

      由OPENCV提供計算中心距、歸一化中心距和hu矩的函數爲:

void cvMoments(const CvArr*image,CvMoments*moments,int isBinary=0)

double cvGetCentralMoment(CvMoments*moments,intx_order,int y_order)

doublecvGetNormalizedCentralMoment(CvMoments*moments,int x_order,int y_order);

voidcvGetHuMoments(CvMoments*moments,CvHuMoments*HuMoments);

     其中cvMoments和上面的cvContourMoments是同一個函數。

     同時OPENCV還提供了輸入圖像直接進行hu矩匹配的函數是

double cvMatchShapes(constvoid*object1,const void*object2,int method,double parameter=0);

 

5. 小結

        圖像的矩通常描述了該圖像形狀的全局特徵,並被廣泛的應用在各種圖像處理、計算機視覺和機器人技術領域的目標識別與方位估計中。一階矩與形狀有關,二階矩顯示曲線圍繞直線平均值的擴展程度,三階矩則是關於平均值的對稱性的測量。不變矩是圖像的統計特性,滿足平移、伸縮、旋轉均不變的不變性。

        如果把圖像看成是一塊質量密度不均勻的薄板,其圖像的灰度分佈函數f(x,y)就是薄板的密度分佈函數,則其各階矩有着不同的含義,如零階矩表示它的總質量;一階矩表示它的質心;二階矩又叫慣性矩,表示圖像的大小和方向。事實上,如果僅考慮階次爲2的矩集,則原始圖像等同於一個具有確定的大小、方向和離心率,以圖像質心爲中心且具有恆定輻射率的橢圓。

        由三階矩以下矩構成的七個矩不變量具有平移、旋轉和尺度不變性等等。當密度分佈函數發生改變時,圖像的實質沒有改變,仍然可以看做一個薄板,只是密度分佈有所改變。雖然此時各階矩的值可能發生變化,但由各階矩計算出的不變矩仍具有平移、旋轉和尺度不變性。通過這個思想,可對圖像進行簡化處理,保留最能反映目標特性的信息,再用簡化後的圖像計算不變矩特徵,可減少計算量。

        研究表明,只有基於二階矩的不變矩對二維物體的描述纔是真正的與旋轉、平移和尺度無關的。較高階的矩對於成像過程中的誤差,微小的變形等因素非常敏感,所以相應的不變矩基本上不能用於有效的物體識別。即使是基於二階矩的不變矩也只能用來識別外形相差特別大的物理,否則他們的不變矩會因爲很相似而不能識別。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章