cv2.findContours 无法检测轮廓
cv2.findContours not able to detect contours
我有两个二值图像,我正在尝试检测其中白色斑块的轮廓(拼贴右侧的粉红色轮廓是轮廓结果)。
cv2.contourFind()
适用于 Contour1:
但对于 Contour2,它的表现很奇怪:
这是它的函数调用
#Convert Image to grayscale
img = cv2.imread(file_name)
img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dilated = cv2.dilate(mask, kernel, iterations=2)
image, contours, hierarchy = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for contour in contours:
[x, y, w, h] = cv2.boundingRect(contour)
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 2)
使用这个 contours
变量,我在找到的点周围绘制矩形。
我不明白为什么它适用于 Contour1,但当它们看起来非常相似时却无法用于 Contour2。
错误:二值图像在 Contour2 中有一个细的白色边框框,但在 Contour1 中没有(我的错!)。由于我只要求 外部轮廓,cv2.RETR_EXTERNAL
in
image, contours, hierarchy = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Contour2 只检测到最外面的框,因此绘制了 none 个子项。但是在 Contour1 中,二进制图像周围没有白色边框框,因此检测到内部白色斑点。
解决方法:使用cv2.RETR_LIST
或cv2.RETR_CCOMP
我有两个二值图像,我正在尝试检测其中白色斑块的轮廓(拼贴右侧的粉红色轮廓是轮廓结果)。
cv2.contourFind()
适用于 Contour1:
但对于 Contour2,它的表现很奇怪:
这是它的函数调用
#Convert Image to grayscale
img = cv2.imread(file_name)
img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dilated = cv2.dilate(mask, kernel, iterations=2)
image, contours, hierarchy = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for contour in contours:
[x, y, w, h] = cv2.boundingRect(contour)
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 2)
使用这个 contours
变量,我在找到的点周围绘制矩形。
我不明白为什么它适用于 Contour1,但当它们看起来非常相似时却无法用于 Contour2。
错误:二值图像在 Contour2 中有一个细的白色边框框,但在 Contour1 中没有(我的错!)。由于我只要求 外部轮廓,cv2.RETR_EXTERNAL
in
image, contours, hierarchy = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Contour2 只检测到最外面的框,因此绘制了 none 个子项。但是在 Contour1 中,二进制图像周围没有白色边框框,因此检测到内部白色斑点。
解决方法:使用cv2.RETR_LIST
或cv2.RETR_CCOMP