問題:目前分割得到的圓形邊緣和理想邊緣相比,部分向外偏離,需要向內收縮
探索方法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,則認為當前圖中存在兩個相交的圓,需要對邊 緣做進一步的處理。依據...