【圖像處理】利用循環移位實現描述子分類

  下面的十幾篇文章均是我從自己的QQ(632846506)日誌中移過來的。https://user.qzone.qq.com/632846506/infocenter。

       描述一種特徵描述子:對圖像中每個3*3的塊進行一定的處理,之後用矩陣外周8個像素表示此塊,每個像素點有0和1兩種狀態。於是總共有2的8次方即256種狀態。但通過一定的分類規則,可以把256種狀態分爲36種。比如以下兩個圖:


由於左圖可以通過旋轉變爲右圖,所以認爲他們是同一種狀態。

這個方法很簡單,也有一定道理,分類的標準一定程度保證了“旋轉不變性”。

假設用一個1*8的向量表示特徵,向量中每個數分別表示特徵中從左上角開始,順時針每個像素的標識。如上圖兩個特徵可以表示爲:


通過對向量中的元素進行循環移位,兩個向量均可移位成爲以下的形式:


即所有移位結果中表示的最小的數。
 可以利用標準模塊庫中的 bitset<> 實現特徵的表示和移位操作:

  1. int Original_to_Sets(int long_num)  
  2. {  
  3.     bitset<8> bit_num(long_num);  
  4.     int shift_min=long_num;  
  5.     for(int n=0;n<8;n++){  
  6.         int first_bit=bit_num[7];  
  7.         for(int i=7;i>0;i--){  
  8.             bit_num[i]=bit_num[i-1];  
  9.         }  
  10.         bit_num[0]=first_bit;  
  11.         int shift_tmp=bit_num.to_ulong();  
  12.         if(shift_tmp<shift_min){  
  13.             shift_min=shift_tmp;  
  14.         }  
  15.     }  
  16.     return shift_min;  
  17. }  

用一個向量original_nums記錄原始的256中情況,另一個向量set_nums對應記錄每種情況移位爲最小值時的情況:

  1. int main(){  
  2.     vector<int>original_nums;  
  3.     vector<int> set_nums;  
  4.     vector<int> sets;  
  5.       
  6.     int nums=256;  
  7.     for(int i=0;i<nums;i++){  
  8.         original_nums.push_back(i);  
  9.         int shift_num=Original_to_Sets(i);  
  10.         set_nums.push_back(shift_num);  
  11.   
  12.         bool exist=false;  
  13.         for(vector<int>::iterator it=sets.begin();it!=sets.end();it++){  
  14.             if(*it==shift_num)  
  15.                 exist=true;  
  16.         }  
  17.         if(!exist)  
  18.             sets.push_back(shift_num);  
  19.     }  
  20.     cout<<"There are "<<sets.size()<<" kinds"<<endl;  
  21.     for(vector<int>::iterator it=sets.begin();it!=sets.end();it++){  
  22.         bitset<8> bit_num(*it);  
  23.         cout<<bit_num<<endl;  
  24.         for(int i=0;i<256;i++){  
  25.             if(*it==set_nums[i])  
  26.                 cout<<original_nums[i]<<" ";  
  27.         }  
  28.         cout<<endl;  
  29.     }  
  30.     return 0;  
  31. }  

最終256中特徵被分爲36種:


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