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

2021-07-31 05:33:49 字數 2398 閱讀 5279

問題:目前分割得到的圓形邊緣和理想邊緣相比,部分向外偏離,需要向內收縮

探索方法1:

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

但是此方法在專案中行不通,因為專案中的掩膜檔案是有誤差的,不能表示正確的圓形。

下面記錄一下此方法的實現**:

//找出兩側都是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))

break;

i++;

}//終點已找到

int end = i;

if (begin < 0) continue;

int neb[8][2] = eight_neighborhood2;

int dir = 0;

/*接著繼續查詢下一段的起點(在前一段圓弧修正之後,下一段正確的圓弧也需要跟著做些微調整,

以保證整個圓形邊緣的光滑度*/

int newend = end;

int nextstart = end;

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

;pt2d sideb = ;

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

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

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

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

}nextstart = i - 1;

//方法:使用最近的初始邊緣點來替換掉越界了的點

dir = 0;

queue

addpt;//用來替換的點

//需要確保起點是和初始的邊緣重合的

bool isfind = false;

int findnum = begin > 6 ? 6 : begin;

int findindex;

for (findindex = 1; findindex < findnum; findindex++)

}if (!isfind)

;addpt.push(temp);

isfind = true;

break;

}pt2d temp = ;

qfindpt.push(temp);}}

}}

else

int dir = 0;

for (int index = begin; index < end; index++)

for (int i = 0; i < 8; i++)

else

break;

}else

dir = (dir + 1) % 8;

}else

dir = (dir + 1) % 8;}}

//替換點

for (int index = begin; index <= end; index++)

//計算nextstart和endpt之間的新線段,保證圓弧的光滑

//兩個點之間連線

if (nextstart - end > 3)

//替換點

veccurcontour.erase(veccurcontour.begin()+end+1,

veccurcontour.begin()+nextstart);

veccurcontour.insert(veccurcontour.begin()+end+1,

insertpt.begin(),insertpt.end());

i += (end - begin + insertpt.size() + 1);

}else

i += end - begin + 1;

break;

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

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

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

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

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

問題 原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。方法 先使用邊緣點計算出新的中心點的座標b,保留相距中心點的最短距離radius。如果中心點座標a和b點的距離超過了radius,則認為當前圖中存在兩個相交的圓,需要對邊 緣做進一步的處理。依據...