全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1488
推到 Plurk!
推到 Facebook!

邊界搜尋

尚未結案
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-27 16:49:38 IP:163.28.xxx.xxx 未訂閱
我寫了一個找灰階變化最大點的邊界搜尋程式 可是卻不能正確的找出灰階變化最大點 請各位高手幫忙看看是那邊出錯了 謝謝!    以下是程式執行之後的影像
int GB[100];
  int D[100];
  int max1=0;
  int iX,iY;
  int iTime=360/2;
  int iR=StrToInt(Edit1->Text);        //³]©w·j´M³Ì¤p¥b®|
  Graphics::TBitmap* BMP=new Graphics::TBitmap();
  if (Image2->Picture->Bitmap->Empty==true)
     {
       ShowMessage("½Ð¸ü¤J¹ÏÀɦA¶i¦æÃä¬É·j´M!!");
     }
  else
     {
      BMP->Width=300;
      BMP->Height=300;
      BMP->Assign(Image2->Picture->Bitmap );
      BMP->Canvas->Pen->Color=clRed;
      BMP->Canvas->Pen->Width=1;
      int iXC=BMP->Width/2;
      int iYC=BMP->Height/2;
      for (int i=1;i<=iTime;i++)
        {
          double Angle=(double)PI/180*(double)(2*i);
          if (Angle>0 && AnglePicture->Bitmap->Canvas->Pixels[iX][iY];
                }
              for (int i=1; i<21; i++)
                {
                  D[i]=abs((int)GB[3*(i+1)]-(int)GB[3*i]);    //°µ¦Ç¶¥®t¤À
                }
              int value=D[0];
              for (int i=0; i<10; i++)       //¨ú¦Ç¶¥ÅܤƳ̤jÂI
                {
                  if ( D[i]>value )
                   {
                     max1 = i;              //³Ì¤jÂI©M iR ¤§¶¡ªº¶ZÂ÷
                     value = D[i];          //³Ì¤jÂI¤§­È
                   }
                }
            }              else if (Angle>PI/2 && AnglePicture->Bitmap->Canvas->Pixels[iX][iY];
                }
              for (int i=1; i<21; i++)
                {
                  D[i]=abs((int)GB[3*(i+1)]-(int)GB[3*i]);
                }
              int value=D[0];
              for (int i=0; i<10; i++)
                {
                  if ( D[i]>value )
                   {
                     max1 = i;
                     value = D[i];
                   }
                }
            }              else if (Angle>PI && Angle<3*PI/2)       //---²Ä¤T¶H­­
            {
              for (int i=1; i<21; i++)
                {
                  iX=iXC+(double)(iR+i)*cos(Angle);
                  iY=iYC-(double)(iR+i)*sin(Angle);
                  GB[i]=Image1->Picture->Bitmap->Canvas->Pixels[iX][iY];
                }
              for (int i=1; i<21; i++)
                {
                  D[i]=abs((int)GB[3*(i+1)]-(int)GB[3*i]);
                }
              int value=D[0];
              for (int i=0; i<10; i++)
                {
                  if ( D[i]>value )
                   {
                     max1 = i;
                     value = D[i];
                   }
                }
            }              else if(Angle>3*PI/2 && Angle<2*PI)     //---²Ä¥|¶H­­
            {
              for (int i=1; i<21; i++)
                {
                  iX=iXC+(double)(iR+i)*cos(Angle);
                  iY=iYC-(double)(iR+i)*sin(Angle);
                  GB[i]=Image1->Picture->Bitmap->Canvas->Pixels[iX][iY];
                }
              for (int i=1; i<21; i++)
                {
                  D[i]=abs((int)GB[3*(i+1)]-(int)GB[3*i]);
                }
              int value=D[0];
              for (int i=0; i<10; i++)
                {
                  if ( D[i]>value )
                   {
                     max1 = i;
                     value = D[i];
                   }
                }
            }
          BMP->Canvas->MoveTo(iXC,iYC);
          BMP->Canvas->LineTo(iX+(max1*cos(Angle)),iY+(max1*sin(Angle)));            }
       Image2->Picture->Assign(BMP);
       delete BMP;
     }
}    
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-27 20:05:28 IP:211.76.xxx.xxx 未訂閱
williams8807 您好:    您的問題應該是想問為什麼會是一個圓吧? 簡單檢視之後,發現可能的問題在沒有正確取出顏色值: GB[i]=GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[iX][iY]); (假設為灰階影像) 因為Image1->Picture->Bitmap->Canvas->Pixels[iX][iY]傳回的是TColor, 這時您再用類似ScanLine[.]的方法去計算,D[i]=abs((int)GB[3*(i 1)]-(int)GB[3*i]);就會發生錯誤。 提供您參考。
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-28 14:16:15 IP:163.28.xxx.xxx 未訂閱
我修正過了 還是一樣
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-28 15:41:28 IP:211.76.xxx.xxx 未訂閱
williams8807 您好:    如果沒有把問題解決掉,似乎是太可惜了!加油!    因為沒有您的新code所以目前把我有懷疑的部分說明一下: 1.因為您都用int,所以有可能在計算中途,小數部分會被捨去,所以建議是算的時候儘量用float或double,最後再轉為int。 2.紅色部分加上比較正確。 3.註解都沒顯示出來。    
if (Angle>0 && AnglePicture->Bitmap->Canvas->Pixels[iX][iY];
                }
              for (int i=1; i<21; i  )
                {
                  D[i]=abs((int)GB[3*(i 1)]-(int)GB[3*i]);    //°µ¦Ç¶¥®t¤À
                }
              int value=D[0];
              max1 = 0;
              for (int i=0; i<10; i  )       //¨ú¦Ç¶¥ÅܤƳ̤jÂI
                {
                  if ( D[i]>value )
                   {
                     max1 = i;              //³Ì¤jÂI©M iR ¤§¶¡ªº¶ZÂ÷
                     value = D[i];          //³Ì¤jÂI¤§­È
                 }
                }
            }
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-29 10:58:05 IP:163.28.xxx.xxx 未訂閱
真是不好意思 我已經將上面的程式碼修正了 我也用小畫家畫一張黑白的影像做測試 結果如下 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=16873530&CC=377370">
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-29 12:41:35 IP:211.76.xxx.xxx 未訂閱
看來結果應該是要指向內邊界或外邊界才對。 如果不介意的話,恐怕得"解剖"程式碼,才能讓那唯一的真相,被我們外表看似大孩子的"可男"(可憐的男孩(人))解決!
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-30 13:54:41 IP:163.28.xxx.xxx 未訂閱
 
引言:如果不介意的話,恐怕得"解剖"程式碼.....
我不太懂您的意思耶 解剖程式碼?
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-30 14:15:39 IP:211.76.xxx.xxx 未訂閱
就是可能的話,把程式碼及圖片寄給我或post上來,好仔細觀察研究問題所在。
vittel
一般會員


發表:13
回覆:14
積分:5
註冊:2003-09-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-31 00:46:17 IP:203.67.xxx.xxx 未訂閱
小弟粗淺..斗膽提出一點看法..供大家參考.. 
if (Angle>0 && AnglePicture->Bitmap->Canvas->Pixels[iX][iY]);
        //這裡..只設定了GB[1]~GB[20]的值
    }
    for (int i=1; i<21; i  )
    {
        D[i]=abs((int)GB[3*(i 1)]-(int)GB[3*i]);    //對灰階做差分
    //這裡..卻拿GB[6],GB[3]....GB[63],GB[60]來計算..
         //超過20的都是未知數..不是嗎  
    }
    double value=D[0];
    for (int i=0; i<10; i  )       //找灰階變化最大的點
    {
        if ( D[i]>value )
        {
            max1 = i;              //灰階變化最大點和iR的距離
            value = D[i];          
        }
    }
    BMP->Canvas->MoveTo(iXC,iYC);
    BMP->Canvas->LineTo((iXC iR*cos(Angle)) (max1*cos(Angle)),(iYC-iR*sin(Angle))-(max1*sin(Angle)));
}
我是覺得這地方怪怪的..希望能幫上忙..
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-02 16:17:28 IP:163.28.xxx.xxx 未訂閱
to RichTop: 邊界搜尋的程式碼以經全部post上來了 只是在程式碼前面少打 void __fastcall TForm1::Button2Click(TObject *Sender) 而已喔        to vittel: 謝謝! GB[i]=GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[iX][iY]); 應該只取到1byte而已[假如我沒記錯] 所以我修正為 >
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-02 22:28:50 IP:211.76.xxx.xxx 未訂閱
williams8807 您好:    我有修改了一第一象限的部分,似乎能跑出正確的結果,僅將修改部分上傳供參考。 不過有幾樣要說明: 1.其實程式大致上已經是正確了,可能是您給的最小半徑太大而且搜尋的距離又太短。所以我試著給了較小的半徑,但長一點的搜尋距離,結果似乎就對了。不過最後還是要視您真正的應用而定。 2.有一個建議,那就是同一程式區段盡量不要用相同名稱的變數,比方說您似乎特別偏愛使用i,不過有時會造成閱讀上的誤導,給您參考。 > < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=16943955&CC=378945">
  double GB[100];
  double D[100];
  double max1=0;
  double iX,iY;
  double iTime=360/2;
  int iR=StrToInt(Edit1->Text);        //設定最小搜尋半徑
  int sr = 50;
  Graphics::TBitmap* BMP=new Graphics::TBitmap();
  if (Image2->Picture->Bitmap->Empty==true)
     {
       ShowMessage("請先載入影像!!");
     }
  else
     {
      BMP->Width=300;
      BMP->Height=300;
      BMP->Assign(Image2->Picture->Bitmap );
      BMP->Canvas->Pen->Color=clRed;
      BMP->Canvas->Pen->Width=1;
      double iXC=BMP->Width/2;
      double iYC=BMP->Height/2;
      for (int i=1;i<=iTime;i++)
        {
          double Angle=(double)PI/180*(double)(2*i);
          if (Angle>0 && Anglesr; i++)
                { AnsiString msg;
                  iX=iXC+(double)(iR+i)*cos(Angle);
                  iY=iYC-(double)(iR+i)*sin(Angle);
                  GB[i]=GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[iX][iY]);
                }
              for (int i=1; i<=sr; i++)
                {
                  D[i]=abs(GB[i]-GB[i-1]);    //對灰階做差分
                }
              double value=D[1];
              max1 = 1;
              for (int i=2; i<=sr; i++)       //找灰階變化最大的點
                {
                  if ( D[i]>value )
                   {
                     max1 = i;              //灰階變化最大點和iR的距離
                     value = D[i];
                   }
                }
            BMP->Canvas->MoveTo(iXC,iYC);
            BMP->Canvas->LineTo((iXC+(iR*cos(Angle))+(max1*cos(Angle))),(iYC-iR*sin(Angle))-(max1*sin(Angle)));
            }
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/08/02 22:32:14
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-04 13:48:34 IP:163.28.xxx.xxx 未訂閱
非常謝謝RichTop和vittel的建議與協助
系統時間:2024-11-26 0:24:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!