主動輪廓(active contour)的問題 |
缺席
|
triop
一般會員 發表:14 回覆:15 積分:5 註冊:2005-11-08 發送簡訊給我 |
小弟需要用active contour(也就是snake)來做影像分割
我已經按照paper 的演算法來撰寫程式了 但是結果出來卻不太理想,控制點並沒有根據我的輸入影像來收縮 想向版上的前輩們請教一下是不是那邊有問題 以下附上該部分的程式碼及運算結果影像 [code cpp] float Total_I[7][7],//External; Cont_of_I[7][7],//internal(Continuous); Curv_of_I[7][7],//internal(Cruve); c[80]; float avg_dis=0.05*(new_sample[1000][4] new_sample[1000][5]);//輪廓上每一點距離之平均; float alpha[80],beta[80],gamma[80]; int ptsmoved=0,moved_threshold=25; for (int i=0;i<40;i ){ alpha[i]=1.0; beta[i]=1.0; gamma[i]=1.2; Ctl_pnt[i]=Point(0,0); if (i<7) for (int j=0;j<7;j ){ Total_I[i][j]=0; Cont_of_I[i][j]=0; Curv_of_I[i][j]=0; } } //這邊是設置控制點初始的位置,散落在目標影像的周圍; for (int cnt=0;cnt<10;cnt ){ Ctl_pnt[cnt].x=new_sample[1000][0] (int)(cnt*new_sample[1000][4]/5);//x座標; Ctl_pnt[cnt].y=new_sample[1000][1];//y座標; Ctl_pnt[10 cnt].x=new_sample[1000][0] 2*new_sample[1000][4];//x座標; Ctl_pnt[10 cnt].y=new_sample[1000][1] (int)(cnt*new_sample[1000][5]/5);//y座標; Ctl_pnt[20 cnt].x=int(new_sample[1000][0] (2-0.2*cnt)*new_sample[1000][4]);//x座標; Ctl_pnt[20 cnt].y=new_sample[1000][1] 2*new_sample[1000][5];//y座標; Ctl_pnt[30 cnt].x=new_sample[1000][0];//x座標; Ctl_pnt[30 cnt].y=int(new_sample[1000][1] (2-0.2*cnt)*new_sample[1000][5]);//y座標; } for(int a=0;a<10;a ) { //疊代10次; float new_avg_dis=0.0f; //Start--of--SNAKE for(int z=0;z<=40;z ){ //依序40點; int i; if(z==40) i=0; else i=z; int j=(z 39)@, k=(z 1)@; float ext_max=0.0f,ext_min=255.0f, max_cont=0.0f,max_curv=0.0f; TPoint pnt=Ctl_pnt[i]; for(int m=-3;m<4;m ){ for(int n=-3;n<4;n ) { if (SknBuff[pnt.y m][pnt.x n] > ext_max) ext_max=SknBuff[pnt.y m][pnt.x n]; if (SknBuff[pnt.y m][pnt.x n] < ext_min) ext_min=SknBuff[pnt.y m][pnt.x n]; } } for(int m=0;m<7;m ){ //7x7範圍(-3,-2,-1,0,1,2,3); for(int n=0;n<7;n ) { Cont_of_I[m][n]=fabs(avg_dis-float(sqrt(pow(double((Ctl_pnt[i].x m-3)-Ctl_pnt[j].x),2.0) pow(double((Ctl_pnt[i].y n-3)-Ctl_pnt[j].y),2.0)))); if (Cont_of_I[m][n] < max_cont) max_cont=Cont_of_I[m][n]; Curv_of_I[m][n]=pow(double(Ctl_pnt[j].x-2*(Ctl_pnt[i].x m-3) Ctl_pnt[k].x),2.0) pow(double(Ctl_pnt[j].y-2*(Ctl_pnt[i].y n-3) Ctl_pnt[k].y),2.0); if (Curv_of_I[m][n] < max_curv) max_curv=Curv_of_I[m][n]; if (ext_max!=ext_min) Total_I[m][n]=(ext_min-SknBuff[pnt.y n-3][pnt.x m-3])/(ext_max-ext_min); else Total_I[m][n]=(ext_min-SknBuff[pnt.y n-3][pnt.x m-3])/5.0; } } float min_energy=65535.0; for(int m=0;m<7;m ){ for(int n=0;n<7;n ) { if (max_cont!=0) Cont_of_I[m][n]/=max_cont; if (max_curv!=0) Curv_of_I[m][n]/=max_curv; Total_I[m][n]=alpha[i]*Cont_of_I[m][n] beta[i]*Curv_of_I[m][n] gamma[i]*Total_I[m][n]; if ( Total_I[m][n] <= min_energy){ min_energy=Total_I[m][n]; pnt=Point(m,n); } } } if ( pnt.x!=3 && pnt.y!=3 ) { Ctl_pnt[i].x =pnt.x-3; Ctl_pnt[i].y =pnt.y-3; } if(z!=0) new_avg_dis =float(sqrt(pow(double((Ctl_pnt[i].x)-Ctl_pnt[j].x),2.0) pow(double((Ctl_pnt[i].y)-Ctl_pnt[j].y),2.0))); } avg_dis=new_avg_dis/40.0; //corner的判斷================; for(int i=0;i<40;i ){ //依序40點; c[i]=CalC(Ctl_pnt,i); } for(int i=0;i<40;i ){ //依序40點; if ( (c[i]>c[(i 39)@]) && (c[i]>c[(i 1)@]) && c[i]>0.25 ) if (SknBuff[Ctl_pnt[i].y][Ctl_pnt[i].x]>0) beta[i]=0; } // }//end of do-while; // while (ptsmoved>moved_threshold); }//end of the iterations; [/code] |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |