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

主動輪廓(active contour)的問題

缺席
triop
一般會員


發表:14
回覆:15
積分:5
註冊:2005-11-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-22 03:04:27 IP:140.117.xxx.xxx 訂閱
小弟需要用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-22 10:08:02 IP:118.169.xxx.xxx 訂閱
通常這種問題都會石沉大海
原因:
1.程式碼太長,註解不清楚,要花時間才能知道你想做什麼
但不是每個前輩都有那麼多時間幫你分析
所以你應該儘可能的把問題範圍縮到最小

2.假如是你要幫別人解決這問題的話,你希望對方提供你什麼資訊?
光是這片面的程式是否足夠?

編輯記錄
taishyang 重新編輯於 2008-01-22 10:10:30, 註解 無‧
系統時間:2024-05-20 5:32:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!