圖像-不變矩

http://blog.youkuaiyun.com/dadaadao/article/details/6114989


不變矩的主要思想是使用對變換不敏感的基於區域的幾個矩作為形狀特征,Hu提出了7個這樣的矩,在他工作的基礎上出現了很多改進的版本。

 

圖像的幾何不變矩 

 

  矩特征主要表征了圖像區域的幾何特征,又稱為幾何矩, 由於其具有旋轉、平移、尺度等特性的不變特征,所以又稱其為不變矩。

在圖像處理中,幾何不變矩可以作為一個重要的特征來表示物體,可以據此特征來對圖像進行分類等操作。 

1.HU矩       幾何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,圖像f(x,y)的(p+q)階幾何矩定義為 Mpq =∫∫(x^p)*(y^q)f(x,y)dxdy(p,q = 0,1,……∞)

矩在統計學中被用來反映隨機變量的分布情況,推廣到力學中,它被用作刻畫空間物體的質量分布。同樣的道理,如果我們將圖像的灰度值看作是一個二維或三維的密度分布函數,那麼矩方法即可用於圖像分析領域並用作圖像特征的提取。最常用的,物體的零階矩表示了圖像的「質量」:Moo= ∫∫f(x,y )dxdy 一階矩(M01,M10)用於確定圖像質心( Xc,Yc):Xc = M10/M00;Yc = M01/M00;若將坐標原點移至 Xc和 Yc處,就得到了對於圖像位移不變的中心矩。如Upq =∫∫[(x-Xc)^p]*[(y-Yc)^q]f(x,y)dxdy。

Hu在文中提出了7個幾何矩的不變量,這些不變量滿足於圖像平移、伸縮和旋轉不變。

如果定義Zpq=Upq/(U20 + U02)^(p+q+2),Hu 的7種矩為:H1=Z20+Z02;H1=(Z20+Z02)^2+4Z11^2;......      

 

  2.Zernike矩        在模式識別中,一個重要的問題是對目標的方向性變化也能進行識別。Zernike 矩是一組正交矩,具有旋轉不變性的特性,即旋轉目標並不改變其模值。。由於Zernike 矩可以構造任意高階矩,所以Zernike 矩的識別效果優於其他方法.

Zernike 提出了一組多項式{ V nm ( x , y) } 。這組多項式在單位圓{ x2 + y2 ≦1} 內是正交的,具有如下形式: V nm ( x , y) = V nm (ρ,θ) = Rnm (ρ) exp ( jmθ) ,並且滿足   ∫∫ x^2+y^2 <= 1 [( V nm ( x , y) 的共軛]* V pq ( x , y) d x d y.      = [pi/(n+1)]*δnpδmq .

if(a==b) δab = 1 else δab = 0,n 表示正整數或是0;m是正整數或是負整數它表示滿足m的絕對值<=n 而且n-m的絕對值是偶數這兩個條件;ρ 表示原點到象素(x,y)的向量的距離;θ 表示向量ρ 跟x 軸之間的夾角(逆時針方向).

      對於一幅數字圖象,積分用求和代替,即A nm =ΣxΣy f(x,y) *[( V nm (ρ,θ) 的共軛],x^2+y^2 <=1,實際計算一幅給定圖象的Zernike 矩時,必須將圖象的重心移到坐標圓點,將圖象象素點映射到單位圓內。由以上可知,使[ V nm (ρ,θ) 的共軛]可提取圖象的特征,低頻特性由n 值小的[( V nm (ρ,θ) 的共軛]來提取,高頻特性由n 值大的來提取。Zernike 矩可以任意構造高價矩, 而高階矩包含更多的圖象信息, 所以Zernike 矩識別效果更好。,Zernike 矩僅僅具有相位的移動。它的模值保持不變。所以可以將| A nm | 作為目標的旋轉不變性特征。因為| A nm | =| A n , - m | ,所以只需計算m ≧0 的情況。

 

 

以下轉自http://blog.youkuaiyun.com/byxdaz/archive/2009/12/28/5089448.aspx

圖像的幾何不變矩

矩特征主要表征了圖像區域的幾何特征,又稱為幾何矩, 由於其具有旋轉、平移、尺度等特性的不變特征,所以又稱其為不變矩。在圖像處理中,幾何不變矩可以作為一個重要的特征來表示物體,可以據此特征來對圖像進行分類等操作。如果想詳細了解不變矩的概念、公式等請參考下面的論文:

不變矩方法研究

一種實用的不變矩計算方法

 

http://download.youkuaiyun.com/source/1943495

1.     HU矩

 

幾何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,圖像f(x,y)的(p+q)階幾何矩定義為

 

        Mpq =∫∫(x^p)*(y^q)f(x,y)dxdy(p,q = 0,1,……∞)

        矩在統計學中被用來反映隨機變量的分布情況,推廣到力學中,它被用作刻畫空間物體的質量分布。同樣的道理,如果我們將圖像的灰度值看作是一個二維或三維的密度分布函數,那麼矩方法即可用於圖像分析領域並用作圖像特征的提取。最常用的,物體的零階矩表示了圖像的「質量」:

                   Moo= ∫∫f(x,y )dxdy

        一階矩(M01,M10)用於確定圖像質心( Xc,Yc):

              Xc = M10/M00;Yc = M01/M00;

         若將坐標原點移至 Xc和 Yc處,就得到了對於圖像位移不變的中心矩。如

            Upq =∫∫[(x-Xc)^p]*[(y-Yc)^q]f(x,y)dxdy。 

        Hu在文中提出了7個幾何矩的不變量,這些不變量滿足於圖像平移、伸縮和旋轉不變。如果定義

 

         Zpq=Upq/(U20 + U02)^(p+q+2),

      Hu 的7種矩為:

      H1=Z20+Z02;H1=(Z20+Z02)^2+4Z11^2;......

矩是描述圖像特征的算子,它在模式識別與圖像分析領域中有重要的應用.迄今為止,常見的矩描述子可以分為以下幾種:幾何矩、正交矩、復數矩和旋轉矩.其中幾何矩提出的時間最早且形式簡單,對它的研究最為充分。幾何矩對簡單圖像有一定的描述能力,他雖然在區分度上不如其他三種矩,但與其他幾種算子比較起來,他極其的簡單,一般只需用一個數字就可表達。所以,一般我們是用來做大粒度的區分,用來過濾顯然不相關的文檔。

 

比如在圖形庫中,可能有100萬幅圖,也許只有200幅圖是我們想要的。使用一維的幾何矩的話,就可以對幾何矩進行排序,建立索引,然後選出與目標圖的幾何矩最近的2000幅圖作比較就好了。而對於其他的矩來說,由於一般是多維的關系,一般不好排序,只能順序查找,自然速度有巨大的差別.所以。雖然幾何矩不太能選出最像的,但可以快速排除不像的,提高搜索效率。

 

幾種簡單的幾何矩:

 

令平面上點坐標為P(x,y),重心為C(x!,y!),

二階行距:rowMoment = [Σ(x- x!)*(x- x!)]/A

二階列距:colMoment = [Σ(y- y!)*(y- y!)]/A

A為點的個數。

由以上兩個信息可以算出圖形的圓度:circleDisgree = rowMoment /colMoment .如果圖形的circleDisgree 越小於1,則它越趨向於長軸為y方向的橢圓。如果圖形的circleDisgree 越大於1,則它越趨向於長軸為x方向的橢圓.如果圖形的circleDisgree 越接近於1,則它越趨向於圓。

所以我們可以使用圓度這種幾何矩,對其進行索引,實現快速過濾。

 

//代碼實例

 

double* Getsquare(int **Array1,int Width,int Height//Array1圖像灰度矩陣

{

  int x,y;

  double pSum,dx,dy;

  int xmax,xmin,ymax,ymin,xSum,ySum,PointSum; 

  double dd,n1,n2,xAve,yAve; 

  pSum=Height*Width;

  xSum=0;ySum=0;PointSum=0;

  xmin=10000;ymin=10000;xmax=-1;ymax=-1;

 

  for (y=0 ;y<Height; y++)

  {

    for (x=0; x<Width; x++)

    {

      if (Array1[x][y]==255)

      {

       continue;

      }

      xSum=xSum+x;ySum=ySum+y;++PointSum;

      if (x<xmin)

       {

          xmin=x;

       }

      if (x>xmax)

      {

         xmax=x;

      }

    }

    if (y<ymin)

    {

       ymin=y;

    }

    if (y>ymax)

    {

      ymax=y;

    }

  }

if (pSum==0)

{

 goto Loop;

}

xAve=xSum/pSum;

yAve=ySum/pSum;

///上面為計算x,y平均值

for (x=1; x<16; x++)

{

 SqureNumber[x]=0;

}

// 11 20 02 21+ 21- 12+ 12- 30+ 30- 03+ 02-

for (y=0; y<Height; y++)

{

    for (x=0; x<Width; x++)

    {

      if (Array1[x][y]==255)

      {

       continue;

      }

      dx=x-xAve;dy=y-yAve;

      SqureNumber[1]=SqureNumber[1]+dx*dx;      // 計算 u(11) 11

      SqureNumber[2]=SqureNumber[2]+dx*dx;      // 計算 u(20) 20

      SqureNumber[3]=SqureNumber[3]+dy*dy;      // 計算 u(02) 02

      if (dy>0)

      {

        SqureNumber[4]=SqureNumber[4]+dx*dx*dy; // 計算 u(21)+ 21+

      }

      else

      {

        SqureNumber[5]=SqureNumber[5]+dx*dx*dy; // 計算 u(21)- 21-

      }

      if( dx>0 )

      {

        SqureNumber[6]=SqureNumber[6]+dx*dy*dy; // 計算 u(12)+ 12+

      }

      else

      {

        SqureNumber[7]=SqureNumber[7]+dx*dy*dy; // 計算 u(12}- 12-

      }

      if (dx>0 )

      {

        SqureNumber[8]=SqureNumber[8]+dx*dx*dx ;// 計算 u(30)+ 30+

      }

      else

      {

        SqureNumber[9]=SqureNumber[9]+dx*dx*dx; // 計算 u(30)- 30-

      }

      if (dy>0)

      {

        SqureNumber[10]=SqureNumber[10]+dy*dy*dy ;// 計算 u(03)+ 03+

      }

      else

      {

        SqureNumber[11]=SqureNumber[11]+dy*dy*dy;// 計算 u(03)- 03-

      }

    }//end for x

 }// end for y;

 for (x=1; x<12; x++)

 {

  SqureNumber[x]=SqureNumber[x]/pSum;

 }

 ///計算圖像的各階矩

 for (x=12; x<21; x++)

 {

  SqureNumber[x]=0;

 }

 SqureNumber[12]=((SqureNumber[2]-SqureNumber[3])/(SqureNumber[2]+SqureNumber[3]))/2; //長寬比特征

 dd=sqrt((SqureNumber[2]-SqureNumber[3])*(SqureNumber[2]-SqureNumber[3])+4*SqureNumber[1]*SqureNumber[1]);

 dd=dd+(SqureNumber[2]-SqureNumber[3]);

 SqureNumber[16]=2*atan(dd/(2*SqureNumber[1]))/M_PI; ///字型傾斜度

 dd=sqrt((SqureNumber[2]-SqureNumber[3])*(SqureNumber[2]-SqureNumber[3])+4*SqureNumber[1]*SqureNumber[1]);

 n1=((SqureNumber[2]+SqureNumber[3])+dd)/2;

 n2=((SqureNumber[2]+SqureNumber[3])-dd)/2;

 SqureNumber[14]=(n1-n2)/(n1+n2);                   //拉長度

 n1=sqrt((ymax-ymin)*(xmax-xmin));

 dd=sqrt((SqureNumber[2]+SqureNumber[3])/PointSum);

 SqureNumber[15]=dd/n1;                             //伸展度

 dd=(SqureNumber[8]-SqureNumber[9])/(SqureNumber[8]+SqureNumber[9]);

 SqureNumber[16]=(dd+1)/2;                          //水平偏移度

 dd=(SqureNumber[10]-SqureNumber[11])/(SqureNumber[10]+SqureNumber[11]);

 SqureNumber[17]=(dd+1)/2;                          //垂直偏移度

 dd=(SqureNumber[4]-SqureNumber[5])/(SqureNumber[4]+SqureNumber[5]);

 SqureNumber[18]=(dd+1)/2;                          //水平伸展度度

 dd=(SqureNumber[6]-SqureNumber[7])/(SqureNumber[6]+SqureNumber[7]);

 SqureNumber[19]=(dd+1)/2;                          //垂直伸展度

 Loop:;

 }

 

2.Zernike矩

 在模式識別中,一個重要的問題是對目標的方向性變化也能進行識別。Zernike 矩是一組正交矩,具有旋轉不變性的特性,即旋轉目標並不改變其模值。。由於Zernike 矩可以構造任意高階矩,所以Zernike 矩的識別效果優於其他方法.

 

Zernike 提出了一組多項式{ V nm ( x , y) } 。這組多項式在單位圓{ x2 + y2 ≦1} 內是正交的,具有如下形式: V nm ( x , y) = V nm (ρ,θ) = Rnm (ρ) exp ( jmθ) ,並且滿足   ∫∫ x^2+y^2 <= 1  [( V nm ( x , y) 的共軛]* V pq ( x , y) d x d y.      = [pi/(n+1)]*δnpδmq .

 

if(a==b)  δab = 1 else  δab = 0,n 表示正整數或是0;m是正整數或是負整數它表示滿足m的絕對值<=n 而且n-m的絕對值是偶數這兩個條件;ρ 表示原點到象素(x,y)的向量的距離;θ 表示向量ρ 跟x 軸之間的夾角(逆時針方向).

 

對於一幅數字圖象,積分用求和代替,即A nm =ΣxΣy f(x,y) *[( V nm (ρ,θ) 的共軛],x^2+y^2 <=1

 

實際計算一幅給定圖象的Zernike 矩時,必須將圖象的重心移到坐標圓點,將圖象象素點映射到單位圓內。由以上可知,使[ V nm (ρ,θ) 的共軛]可提取圖象的特征,低頻特性由n 值小的[( V nm (ρ,θ) 的共軛]來提取,高頻特性由n 值大的來提取。Zernike 矩可以任意構造高價矩, 而高階矩包含更多的圖象信息, 所以Zernike 矩識別效果更好。,Zernike 矩僅僅具有相位的移動。

 

它的模值保持不變。所以可以將| A nm | 作為目標的旋轉不變性特征。因為| A nm | =| A n , - m | ,所以只需計算m ≧0 的情況。

 

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

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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值