图像中的缺陷轮廓检测 python opencv
Flawed contour detection in an image python opencv
我想检测下图中巨大黑色斑点的轮廓:
所以我使用 Canny 边缘检测来使用以下代码找到边缘:
edged = cv2.Canny(image, 30, 200)
然后,当我试图找到轮廓时,它只给出一半的斑点。
这是我用来寻找轮廓的代码:
# find contours in the edged image, keep only the largest
# ones, and initialize our screen contour
(cnts, _) = cv2.findContours(image.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10]
# Scan the contours for largest item
array_sizes = []
for numpoints in cnts:
array_sizes.append(len(numpoints))
largest = max(array_sizes)
second = second_largest(array_sizes)
index_of_object = array_sizes.index(largest)
# Largest detected contour
screenCnt = cnts[index_of_object]
我是否可以对原始图像进行任何改动,以更全面、更准确地检测大的黑色斑点?感谢所有帮助。
问题出在您的工作流程中。
从您的处理中删除 Canny 运算符。它会给你一个来自你的斑点的边缘图像。使用 contourFinder 处理 Canny 图像后,它会将边缘段视为对象。您最大的轮廓将是最长的边缘段。
如果放大 Canny 图像,您会发现当前结果结束处存在间隙。
要获取 blob 的轮廓,请跳过 Canny。如果 findContours 将白色视为前景,则可能需要反转图像。
请对这些方法有所了解和理解,以免运行再次掉入此类陷阱。
我想检测下图中巨大黑色斑点的轮廓:
所以我使用 Canny 边缘检测来使用以下代码找到边缘:
edged = cv2.Canny(image, 30, 200)
然后,当我试图找到轮廓时,它只给出一半的斑点。
这是我用来寻找轮廓的代码:
# find contours in the edged image, keep only the largest
# ones, and initialize our screen contour
(cnts, _) = cv2.findContours(image.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10]
# Scan the contours for largest item
array_sizes = []
for numpoints in cnts:
array_sizes.append(len(numpoints))
largest = max(array_sizes)
second = second_largest(array_sizes)
index_of_object = array_sizes.index(largest)
# Largest detected contour
screenCnt = cnts[index_of_object]
我是否可以对原始图像进行任何改动,以更全面、更准确地检测大的黑色斑点?感谢所有帮助。
问题出在您的工作流程中。
从您的处理中删除 Canny 运算符。它会给你一个来自你的斑点的边缘图像。使用 contourFinder 处理 Canny 图像后,它会将边缘段视为对象。您最大的轮廓将是最长的边缘段。 如果放大 Canny 图像,您会发现当前结果结束处存在间隙。
要获取 blob 的轮廓,请跳过 Canny。如果 findContours 将白色视为前景,则可能需要反转图像。
请对这些方法有所了解和理解,以免运行再次掉入此类陷阱。