我有一个程序可以获取图像的轮廓。我想基于相对平直度将这些轮廓分解为子轮廓。如果额外像素的直线度小于阈值乘以先前的直线度,则应该分割轮廓。当我绘制一个用油漆绘制的正方形图像时,程序输出应为4个子轮廓。然而,出于某种原因,我得到3个子轮廓,其中2个包括2-3个点,其中一个包括大部分原始轮廓。请注意,我的代码中的0.85是来自研究论文的阈值。 dPreious是边缘的像素距离(不包括当前像素)。 v是终点之间的欧氏距离。
def split(contour):
new = [];
toAdd = [];
sCurrent = 0.0
sPrevious = 0.0
v = 0.0
dPrevious = 1
for points in range(0,len(contour)):
currentX = float(contour[points][0])
currentY = float(contour[points][1])
if points != 0:
v = math.sqrt(math.pow(float(toAdd[0][0])-currentX,2) + math.pow(float(toAdd[0][1])-currentY,2))
dPrevious = len(toAdd)
sCurrent = v/dPrevious
if sCurrent < 0.85*sPrevious:
new.append(toAdd)
toAdd = []
toAdd.append(contour[points])
sPrevious = sCurrent
new.append(toAdd)
return new
答案 0 :(得分:0)
如果使用OpenCV查找轮廓,可以使用cv2.approxPolyDP()函数的功能为您完成工作: cv2.approxPolyDP。您可能必须尝试使用epsilon参数才能获得成功。