在最近的一组图像中,我的OpenCV代码没有找到正确的轮廓区域。当轮廓未闭合时,似乎会发生这种情况。我试着确保轮廓是封闭的,但没有效果。
编辑:问题是轮廓中有间隙。
背景: 我有一系列通道中胶囊的图像,我想测量形状的面积以及矩的质心。
问题: 当轮廓未闭合时,力矩是错误的。
编辑:当我有间隙时,轮廓不是整个形状,因此是不正确的区域。
我的工作:
可以找到一个使用测试图像的工作示例here。
有一个关于闭合轮廓的question,但是这两个建议都不起作用。使用cv2.approxPolyDP不会改变结果,尽管它应该返回闭合轮廓。将等高线的第一个点添加为最后一个点,以使其闭合,也不能解决问题。
下面是绘制轮廓的图像示例。在这里,面积被确定为85,而在几乎相同的图像中,它是8660,这是它应该是的。
任何建议都会被告知的。
代码:
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']))
我的问题是,正如@HugoRune所指出的,在我们的国家里有差距。解决办法是缩小差距。
我发现很难找到一种通用的方法来关闭间隙,所以我反复更改Canny过滤器的阈值,并执行morphological closing直到找到一个闭合的轮廓。
对于那些有同样问题的人,有几个很好的答案可以用来闭合轮廓,例如this或this
在处理了类似的问题之后,另一种解决方案(可以说更简单,开销更少)是使用形态学打开功能,它执行侵蚀和膨胀。如果首先将其转换为二值图像,请执行打开操作,然后执行Canny检测,这应该会执行相同的操作,但不必重复使用过滤器。唯一要做的就是在不丢失太多细节的情况下,对内核大小进行几次调整,以确定合适的大小。我发现这是一个相当强大的方法,以确保轮廓是封闭的。
Morphological operations documentation
相关问题 更多 >
编程相关推荐