邊界搜尋 |
尚未結案
|
williams8807
一般會員 發表:40 回覆:37 積分:15 註冊:2003-11-22 發送簡訊給我 |
我寫了一個找灰階變化最大點的邊界搜尋程式
可是卻不能正確的找出灰階變化最大點
請各位高手幫忙看看是那邊出錯了
謝謝! 以下是程式執行之後的影像
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 發送簡訊給我 |
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 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
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 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
williams8807
一般會員 發表:40 回覆:37 積分:15 註冊:2003-11-22 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
vittel
一般會員 發表:13 回覆:14 積分:5 註冊:2003-09-19 發送簡訊給我 |
小弟粗淺..斗膽提出一點看法..供大家參考..
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 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |