線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1403
推到 Plurk!
推到 Facebook!

圖片切割分群~~

尚未結案
jakie720313
一般會員


發表:15
回覆:7
積分:4
註冊:2003-11-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-21 03:53:17 IP:218.168.xxx.xxx 未訂閱
我現在要做的是把1300張圖片的每張圖片先切割成100塊(block),再把每張圖片去做分群。也就是把原本1張圖片有100個block(也就是100群),利用分群把群數降低,以加快比對的速度~~ 我分群的演算法如下: 1.因為圖片已經先切割成100個block,先挑圖片最左上角為第一群,設群數=1。 2.選取第二個block(第一個block的右邊),與第一群相減取絕對值算出差異值,每個block都是一個256個數字的陣列,差異值就等於陣列裡面的每個數字兩兩相減再取絕對值的總和。 3.自訂一個Threshold值,如果差異值小於Threshold的值就視為同一群,否則視為不同群,群數+1。 4.如果是同一群,就得對群裡面的block取平均。Ex:3個block都屬於同一群的話,這群的中心點=3個block陣列的總和/3,得到這群的新的256個數字的陣列。 5.繼續挑下一個block,對目前每個群求差異值,當群數超過1時,計算差異值就必須對兩個群求差異值,比較差異值的大小,看跟哪一群的差異值最小,就把block視為那一群,再把那一群做平均,以此類推,一直做到第100個block為止。 6.做完第一張圖片後,繼續挑第二張圖片重複做1~~5的步驟,直到1300張都做完為止。    如此一來,便可以把1300張圖片都做分群的動作,可是我現在遇到一個問題。就是Threshold值設比較大的時候,每張的群數都等於1(表示都屬於同一群),再去比對計算正確率,出來的結果竟然比我把Threshold值設小一點(每張的群數變大)去計算的正確率來得要高........這有點不合常理~~~ 理論上群數越少,正確率應該會越低才對,群數越多正確率應該會提高,可是我的程式跑出來的結果剛好相反@@.....一直在找bug始終找不出來~~~ 請教各位大大我的程式哪裡出了問題???哪裡有bug呢??可否幫我找一找呢??謝謝 //下面是分群的程式碼
long *block_minium=new long[100];                  //這裡是宣告的部分
int number;
long counts;
long counts2;
bool overflow=false;
struct my_struct2
  {
     long index;
     int Group;      };
struct my_struct2 Image[1300];
long find_index(int local)                                           //找尋陣列所在的位址
{
   long index=0;
   int a;      if(local!=0)
  {
     for(a=local-1;a>=0;a--)
       {
           index =Image[a].Group*256;
       }               return index;
  }
 else
   {
      index=0;
      return index;
   }    }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)
{
     int m=1;                                   //以下是分群的程式碼
     int i,j,block,k=1;
     int data_value,n;
     int NP = 1;
     int NC = 1;
     long different[101];
     int group[101];
     long temp[256];
     counts2=0;
     struct my_struct
      {
         int GroupFlag[101];
         long data[256];          };         struct my_struct C[101];
     struct my_struct P[101];         struct sortdata
      {
        long data;
      };          struct sortdata A[101];         int *d=new int[33280000];
     long i_index;
     long threshold,temp2;
     long mininum;
     FILE *fptr,*stream,*stream2;
     threshold = StrToInt(Edit3->Text);
     number = StrToInt(BoxNum->Text);
     counts = number*100*256;         fptr=fopen("D:\\data.txt","r");                //讀取檔案內容         for(i_index=0;i_index A[j].data)
                      {
                         temp2=A[i].data;
                         A[i].data=A[j].data;
                         A[j].data=temp2;
                      }
                }                  mininum = A[1].data;         for(i=1;i<=NC;i  )           //找最小值
       {
          if(different[i]==mininum)
             {
                k=i;                         //找出跟第幾群距離最小
             }
       }         if(mininum < threshold)                //跟第K群是屬於同一群
        {
           C[k].GroupFlag[  group[k]]=NP 1;
         for(i=1;i<=group[k];i  )
          {
            for(j=0;j<256;j  )
             {
               temp[j] =P[C[k].GroupFlag[i]].data[j];
             }
          }               for(i=0;i<256;i  )
             {
                C[k].data[i]=temp[i]/group[k];
             }            }
     else
        {
           for(i=0;i<256;i  )               //建立新的一群
             {
               C[NC 1].data[i] = P[NP 1].data[i];
             }
               group[NC 1]  ;
               NC  ;
     //        Label16->Caption=IntToStr(NC);
     //        ShowMessage(IntToStr(NC));            }
               NP  ;                    for(i=0;i<101;i  )
                {
                   different[i]=0;                    }                    for(n=0;n<256;n  )
                {
                  temp[n]=0;
                }       }
         if(NC>100)
           NC=100;            Image[choose].Group=NC;            ListBox3->Items->Add("[第" IntToStr(choose 1) "張]:" IntToStr(NC) " 群");
        Application->ProcessMessages();           /* open a file for update */
       stream = fopen("D:\\data2.txt","a ");          /* write some data to the file */
      for(i=1;i<=NC;i  )
      {
        for(j=0;j<256;j  )
          {
            fprintf(stream, "%ld\n",C[i].data[j]);
          }
      }           /* close the file */
         fclose(stream);                counts2 =NC*256;             Form1->CGauge1->Progress=(choose 1)*100/number;
         Sleep(10);
         Application->ProcessMessages();       }
        ShowMessage(IntToStr(counts2));          for(int x=0;x        發表人 - jakie720313 於 2005/01/21  03:57:30    發表人 - jakie720313 於 2005/01/21  03:59:46    發表人 - jakie720313 於 2005/01/21  14:20:45
        
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-21 15:29:12 IP:140.113.xxx.xxx 未訂閱
dear jakie720313:
引言:如此一來,便可以把1300張圖片都做分群的動作,可是我現在遇到一個問題。就是Threshold值設比較大的時候,每張的群數都等於1(表示都屬於同一群),再去比對計算正確率,出來的結果竟然比我把Threshold值設小一點(每張的群數變大)去計算的正確率來得要高........這有點不合常理~~~ 理論上群數越少,正確率應該會越低才對,群數越多正確率應該會提高,可是我的程式跑出來的結果剛好相反@@.....一直在找bug始終找不出來~~~ 請教各位大大我的程式哪裡出了問題???哪裡有bug呢??
光看你的程式碼也不知道哪邊可能出問題。現在你問的似乎是一個現象,並非完全是程式的bug所引起的,所以丟兩個問題給你: 1. 你要分群的圖片其特性是什麼?比對的目的是什麼? 2. 演算法的設計是否合理?因為這會導致你的結果會不會符合你的預期。 因為你也提出你所看到「不合理」的地方,但不光是程式寫錯會造成,邏輯上的錯誤或是演算法錯誤都可能得到這樣的結果。請參考看看嚕~
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-23 14:30:47 IP:140.118.xxx.xxx 未訂閱
我猜搞不好是我想的問題 比如說有a,b,c三個數 你設門檻為3,a=10,b=12,c=14 所以一開始a,b合併成1群為11,假設為r 第二次時r與c又合併成1群為12.5 看起來很合理... 但是看a,b,c原始值... a相似於b,b相似於c...(以門檻3為例) 但是其實a不相似於c阿... 而程式卻將三數都合併1群
系統時間:2024-05-10 4:19:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!