下面的十幾篇文章均是我從自己的QQ(632846506)日誌中移過來的。https://user.qzone.qq.com/632846506/infocenter。
由於左圖可以通過旋轉變爲右圖,所以認爲他們是同一種狀態。
這個方法很簡單,也有一定道理,分類的標準一定程度保證了“旋轉不變性”。
假設用一個1*8的向量表示特徵,向量中每個數分別表示特徵中從左上角開始,順時針每個像素的標識。如上圖兩個特徵可以表示爲:
通過對向量中的元素進行循環移位,兩個向量均可移位成爲以下的形式:
即所有移位結果中表示的最小的數。
可以利用標準模塊庫中的 bitset<> 實現特徵的表示和移位操作:
- int Original_to_Sets(int long_num)
- {
- bitset<8> bit_num(long_num);
- int shift_min=long_num;
- for(int n=0;n<8;n++){
- int first_bit=bit_num[7];
- for(int i=7;i>0;i--){
- bit_num[i]=bit_num[i-1];
- }
- bit_num[0]=first_bit;
- int shift_tmp=bit_num.to_ulong();
- if(shift_tmp<shift_min){
- shift_min=shift_tmp;
- }
- }
- return shift_min;
- }
用一個向量original_nums記錄原始的256中情況,另一個向量set_nums對應記錄每種情況移位爲最小值時的情況:
- int main(){
- vector<int>original_nums;
- vector<int> set_nums;
- vector<int> sets;
- int nums=256;
- for(int i=0;i<nums;i++){
- original_nums.push_back(i);
- int shift_num=Original_to_Sets(i);
- set_nums.push_back(shift_num);
- bool exist=false;
- for(vector<int>::iterator it=sets.begin();it!=sets.end();it++){
- if(*it==shift_num)
- exist=true;
- }
- if(!exist)
- sets.push_back(shift_num);
- }
- cout<<"There are "<<sets.size()<<" kinds"<<endl;
- for(vector<int>::iterator it=sets.begin();it!=sets.end();it++){
- bitset<8> bit_num(*it);
- cout<<bit_num<<endl;
- for(int i=0;i<256;i++){
- if(*it==set_nums[i])
- cout<<original_nums[i]<<" ";
- }
- cout<<endl;
- }
- return 0;
- }
最終256中特徵被分爲36種: