問題:目前分割得到的圓形邊緣和理想邊緣相比,部分向外偏離,需要向內收縮 探索方法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
問題 原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。方法 使用之前的方法還存在乙個隱蔽的問題是,之前的方法假設了邊緣上的第乙個點絕對是正確的。但是在實際情況中,第乙個點不一定可以作為正確點。所以在之前的方法的基礎上還要做一 下改進。中標記圓弧進入...