線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2741
推到 Plurk!
推到 Facebook!

主動式輪廓法(Active Contour)(Snake)

尚未結案
zhou72911
一般會員


發表:2
回覆:1
積分:0
註冊:2008-05-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-05-15 18:32:20 IP:140.118.xxx.xxx 訂閱
我是參考下面這篇論文第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 重新編輯於 2008-05-19 21:29:49, 註解 無‧
zhou72911 重新編輯於 2008-05-19 21:37:46, 註解 無‧
zhou72911 重新編輯於 2008-05-19 21:42:44, 註解 無‧
zhou72911 重新編輯於 2008-05-19 21:46:48, 註解 無‧
zhou72911 重新編輯於 2008-05-19 21:50:10, 註解 無‧
zhou72911 重新編輯於 2008-05-19 21:51:43, 註解 無‧
zhou72911 重新編輯於 2008-05-19 21:52:26, 註解 無‧
zhou72911
一般會員


發表:2
回覆:1
積分:0
註冊:2008-05-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-05-15 19:49:53 IP:140.118.xxx.xxx 訂閱

不好意思
我用的是VC 6.0
不知可否在這發問
------
小瑋
系統時間:2024-05-06 2:28:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!