專案記錄 圓形邊緣修正方法探索2

2021-07-31 05:34:55 字數 1213 閱讀 1841

問題:目前分割得到的圓形邊緣和理想邊緣相比,部分向外偏離,需要向內收縮 探索方法1: 假設在理想情況下,圓形物體的掩膜是絕對正確的。此時可以遍歷當前的邊緣點,判斷每個邊緣點的兩側的掩膜標記是否不同。如果兩側的鄰域點掩膜都為0,說明該邊緣點偏外,需要向內收縮,使用最近的掩膜點來替換掉越界了的點。

探索方法2:

在前一種方法中,使用最近的掩膜點來替換掉越界了的點,實踐效果不理想,下面改進的方法是

1、 不再考慮前後兩個弧之間的光滑過渡問題,對每段弧單獨處理;

2、從中心開始,嘗試向該點移動,第一次碰到掩膜邊界時停止移動,用該點來替換。

//找出兩側都是0的點,說明此處需要收縮

while(i < veccurcontour.size()-1)

;pt2d

sideb=;

//檢測兩側的點是否都為0

long

a=sidea.y*swidth+sidea.x;

long

b=sideb.y*swidth+sideb.x;

if(!(pmaskbuf[a]==0 && pmaskbuf[b]==0))

else

;pt2d

sideb=;

//檢測兩側的點是否都為0

a=sidea.y*swidth+sidea.x;

b=sideb.y*swidth+sideb.x;

if((pmaskbuf[a]==0 && pmaskbuf[b]==1) || (pmaskbuf[a]==1 && pmaskbuf[b]==0))

i++;

}int

end=i;

out<<"終點:"<

<0) continue;

//起點和終點已經確定,需要對這一段進行替換

//初始邊緣不可靠,改變方法,從中心開始,嘗試向該點移動,第一次碰到

for(int

i1=begin;i1<=end;i1++)

while(!pcontourmask[pos] && newx!=centerx && newy!=centery);

newx-=dx;

newy-=dy;

veccurcontour[i1].x=newx;

veccurcontour[i1].y=newy;

}i++;}}

out.close();

}

專案記錄 圓形邊緣修正方法探索1

問題 目前分割得到的圓形邊緣和理想邊緣相比,部分向外偏離,需要向內收縮 探索方法1 假設在理想情況下,圓形物體的掩膜是絕對正確的。此時可以遍歷當前的邊緣點,判斷每個邊緣點的兩側的掩膜標記是否不同。如果兩側的鄰域點掩膜都為0,說明該邊緣點偏外,需要向內收縮,使用最近的掩膜點來替換掉越界了的點。但是此方...

專案記錄 圓形邊緣修正方法探索3

方法 從圓心向每個點移動,只要遇到非mask標記點,則替換當前邊界點。結果 實踐效果不好,多個孤立點被替換之後,容易重合為同一點。for int j 0 jint sx centerx vecresult j x int sy centery vecresult j y int maxmove ma...

專案記錄 處理兩個相交圓方法探索2

問題 原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。方法 使用之前的方法還存在乙個隱蔽的問題是,之前的方法假設了邊緣上的第乙個點絕對是正確的。但是在實際情況中,第乙個點不一定可以作為正確點。所以在之前的方法的基礎上還要做一 下改進。中標記圓弧進入...