我正在尝试检测此图像上的轮廓数量。理想情况下应该为3,但由于噪音,我没有得到空闲的结果。因此,我尝试在将图像阈值化之前对图像进行模糊处理:
import numpy as np
import cv2
img= cv2.imread('Inkedblueimagewithdot.jpg')
cv2.imshow('original',img)
blur= cv2.pyrMeanShiftFiltering(img,21,49)
gray_image= cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
ret,thresh= cv2.threshold(gray_image,70,255,cv2.THRESH_BINARY)
_, contours,hierarchy =cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
print(len(contours))
contourimage=cv2.drawContours(img,contours,-1,(255,255,255),20)
cv2.imshow('countors',contourimage)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出为:
2
这是输入图像: This is the input image
这是输出图像:This is the output image
答案 0 :(得分:0)
为了获得3个轮廓,可以使用cv2.RETR_LIST
。它列出了二进制图像中存在的所有轮廓,与here
要回答第二个问题,您可以尝试设置区域约束,以便丢弃特定区域以下的轮廓。对于提供的图像,我将区域设置为4000:
for i, c in enumerate(contours):
if cv2.contourArea(c) > 4000:
x, y, w, h = cv2.boundingRect(c)
roi = image[y :y + h, x : x + w ]
cv2.imshow('cropped_region', roi)
cv2.waitKey(0)
预期结果: