主動式輪廓法(Active Contour)(Snake) |
尚未結案
|
zhou72911
一般會員 發表:2 回覆:1 積分:0 註冊:2008-05-15 發送簡訊給我 |
我是參考下面這篇論文第3.3節的方式去做的 http://cgm.cs.ntust.edu.tw/steve/www/project.htm 我先找出圖形的最左邊和最右邊的兩個輪廓角點 (已先找出CP[0]和CP[5]) 這兩的點要固定不動 上下各4個點要往內縮來找物體輪廓 目前只測試上方四個點網內縮 但是只有第一個點可以 不管我迭帶幾次都一樣 A,B,C參數也調過了,也是一樣 或是都跳物件內部 我想要請問: 問題一:程式那出錯了? 問題二:我的處理順序是 假設控制點有10個V0~V9 先由V1旁的8個點計算一次總能量E,看看哪個最小 就將V1移到那, 接下來換計算V2~V9一次移動一個點(方式一樣) V0~V9跑完算迭帶一次 請問這樣對嗎? 請各位幫我看看教教我 感謝大家 下面是我的Snake程式 程式和論文第3.3節內容都在附加檔案內 [code cpp] 請在此區域輸入程式碼 //==================================================================================== //主動式輪廓法 //==================================================================================== void snake(BYTE *buffer_IN) { int x=0,y=0,i=0,j=0,k=0,l=0; int address=0,Tempx=0,Tempy=0; double Temp; double max=0.0,min=100000.0; double Pdistance=0.0; double E=0.0,Econt[3][3],Ecure[3][3],Eimg[3][3]; double A=1.0,B=1.0,C=1.5; //參數 double image_data_diff_x=0,image_data_diff_y=0; //迭帶20次 for(i=0;i<20;i ) {//只做上面四個點 for(j=1;j<=4;j ) { max=0.0; min=100000.0; ////////////////////////////////////////////////////////////////////////// //算Econt ////////////////////////////////////////////////////////////////////////// for(y=-1;y<=1;y ) { for(x=-1;x<=1;x ) { Pdistance = pow((double)(((CP[j].x x)-CP[j-1].x)* ((CP[j].x x)-CP[j-1].x) ((CP[j].y y)-CP[j-1].y)* ((CP[j].y y)-CP[j-1].y) ) ,0.5); Econt[1 y][1 x] = fabs(2.0-Pdistance); //找正規劃得最大最小值 if(Econt[1 y][1 x]>=max) max=Econt[1 y][1 x]; if(Econt[1 y][1 x]<=min) min=Econt[1 y][1 x]; } } for(y=-1;y<=1;y ) { for(x=-1;x<=1;x ) { //正規劃 if(max-min > 0) Econt[1 y][1 x]=(Econt[1 y][1 x]-min)/(max-min); } } max=0.0; min=100000.0; ////////////////////////////////////////////////////////////////////////// //算Ecure ////////////////////////////////////////////////////////////////////////// for(y=-1;y<=1;y ) { for(x=-1;x<=1;x ) { Ecure[1 y][1 x] = pow((double)((CP[j-1].x-2*(CP[j].x x) CP[j 1].x)* (CP[j-1].x-2*(CP[j].x x) CP[j 1].x) (CP[j-1].y-2*(CP[j].y y) CP[j 1].y)* (CP[j-1].y-2*(CP[j].y y) CP[j 1].y) ) ,0.5); //找正規劃得最大最小值 if(Ecure[1 y][1 x]>=max) max=Ecure[1 y][1 x]; if(Ecure[1 y][1 x]<=min) min=Ecure[1 y][1 x]; } } for(y=-1;y<=1;y ) { for(x=-1;x<=1;x ) { //正規劃 if(max-min > 0) Ecure[1 y][1 x]=(Ecure[1 y][1 x]-min)/(max-min); } } max=0.0; min=100000.0; ///////////////////////////////////////////////////////////////////////// //算Eimg ////////////////////////////////////////////////////////////////////////// for(y=-1;y<=1;y ) { for(x=-1;x<=1;x ) { //用SOBEL找灰階提度 address=960*(239-(CP[j].y y)) 3*(CP[j].x x); image_data_diff_x = ( (*(buffer_IN address-960 3))- (*(buffer_IN address-960-3)) 2*(*(buffer_IN address 3))- 2*(*(buffer_IN address -3)) (*(buffer_IN address 960 3))- (*(buffer_IN address 960-3)) ); image_data_diff_y = ( (*(buffer_IN address 960-3)) 2*(*(buffer_IN address 960)) (*(buffer_IN address 960 3))- (*(buffer_IN address-960-3))- 2*(*(buffer_IN address-960))- (*(buffer_IN address-960 3)) ); Eimg[1 y][1 x]=(-1)*(fabs(image_data_diff_x) fabs(image_data_diff_x)); //找正規劃得最大最小值 if(Eimg[1 y][1 x]>=max) max=Eimg[1 y][1 x]; if(Eimg[1 y][1 x]<=min) min=Eimg[1 y][1 x]; } } for(y=-1;y<=1;y ) { for(x=-1;x<=1;x ) { //正規劃 if(max-min > 0) Eimg[1 y][1 x]=(Eimg[1 y][1 x]-min)/(max-min); } } max=0.0;
min=100000.0; ////////////////////////////////////////////////////////////////////////// //算E ////////////////////////////////////////////////////////////////////////// for(y=-1;y<=1;y ) { for(x=-1;x<=1;x ) { E=(A*Econt[1 y][1 x] B*Ecure[1 y][1 x] C*Eimg[1 y][1 x]); //找最小的總能量E if(E<=min) { min=E; Tempx=x; Tempy=y; } } } CP[j].x=CP[j].x Tempx; CP[j].y=CP[j].y Tempy; } } //繪出控制點 for(i=0;i<=9;i ) { for(y=-1;y<=1;y ) { for(x=-1;x<=1;x ) { address=960*(239-(CP[i].y y)) 3*(CP[i].x x); *(buffer_IN address) =255; *(buffer_IN address 1)=255; *(buffer_IN address 2)=0; } } } } [/code]
------
小瑋 |
zhou72911
一般會員 發表:2 回覆:1 積分:0 註冊:2008-05-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |