查找OpenCV Contou的区域

2024-06-16 11:23:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在最近的一组图像中,我的OpenCV代码没有找到正确的轮廓区域。当轮廓未闭合时,似乎会发生这种情况。我试着确保轮廓是封闭的,但没有效果。

编辑:问题是轮廓中有间隙。

背景: 我有一系列通道中胶囊的图像,我想测量形状的面积以及矩的质心。

问题: 当轮廓未闭合时,力矩是错误的。

编辑:当我有间隙时,轮廓不是整个形状,因此是不正确的区域。

我的工作:

  • 读取图像->;img=cv2.imread(文件名,0)
  • 应用Canny筛选器->;edges=cv2.Canny(img,lowerThreshold,lowerThreshold*2)
  • 查找等高线->;等高线,层次结构=cv2.find contours(边,cv2.cv.cv_RETR_LIST,cv2.cv.cv_CHAIN_APPROX_NONE)
  • 查找最长轮廓
  • 确保轮廓闭合
  • 查找力矩->;cv2.力矩(cnt)

可以找到一个使用测试图像的工作示例here

有一个关于闭合轮廓的question,但是这两个建议都不起作用。使用cv2.approxPolyDP不会改变结果,尽管它应该返回闭合轮廓。将等高线的第一个点添加为最后一个点,以使其闭合,也不能解决问题。

下面是绘制轮廓的图像示例。在这里,面积被确定为85,而在几乎相同的图像中,它是8660,这是它应该是的。 http://www.negative-probability.co.uk/docs/ImageWContour_0.png

任何建议都会被告知的。

代码:

img =cv2.imread(fileName,0)
edges = cv2.Canny(img,lowerThreshold,lowerThreshold*2)
contours, hierarchy = cv2.findContours(edges,cv2.cv.CV_RETR_LIST,cv2.cv.CV_CHAIN_APPROX_NONE) #cv2.cv.CV_CHAIN_APPROX_NONE or cv2.cv.CV_CHAIN_APPROX_SIMPLE

#Select longest contour as this should be the capsule
lengthC=0
ID=-1
idCounter=-1
for x in contours:
    idCounter=idCounter+1 
    if len(x) > lengthC:
        lengthC=len(x)
        ID=idCounter

if ID != -1:
    cnt = contours[ID]
    cntFull=cnt.copy()

    #approximate the contour, where epsilon is the distance to 
    #the original contour
    cnt = cv2.approxPolyDP(cnt, epsilon=1, closed=True)

    #add the first point as the last point, to ensure it is closed
    lenCnt=len(cnt)
    cnt= np.append(cnt, [[cnt[0][0][0], cnt[0][0][1]]]) 
    cnt=np.reshape(cnt, (lenCnt+1,1, 2))

    lenCntFull=len(cntFull)
    cntFull= np.append(cntFull, [[cntFull[0][0][0], cntFull[0][0][1]]]) 
    cntFull=np.reshape(cntFull, (lenCntFull+1,1, 2))

    #find the moments
    M = cv2.moments(cnt)
    MFull = cv2.moments(cntFull)
    print('Area = %.2f \t Area of full contour= %.2f' %(M['m00'], MFull['m00']))

Tags: the图像gtchainimgcv2cv轮廓
2条回答

我的问题是,正如@HugoRune所指出的,在我们的国家里有差距。解决办法是缩小差距。

我发现很难找到一种通用的方法来关闭间隙,所以我反复更改Canny过滤器的阈值,并执行morphological closing直到找到一个闭合的轮廓。

对于那些有同样问题的人,有几个很好的答案可以用来闭合轮廓,例如thisthis

在处理了类似的问题之后,另一种解决方案(可以说更简单,开销更少)是使用形态学打开功能,它执行侵蚀和膨胀。如果首先将其转换为二值图像,请执行打开操作,然后执行Canny检测,这应该会执行相同的操作,但不必重复使用过滤器。唯一要做的就是在不丢失太多细节的情况下,对内核大小进行几次调整,以确定合适的大小。我发现这是一个相当强大的方法,以确保轮廓是封闭的。

Morphological operations documentation

相关问题 更多 >