我无法找到一种方法来检测图像中没有空矩形。 所以我有一个像下面的图像,我想检测图像中的矩形。我知道如果它们被填满,如何检测没有矩形。
contours = cv2.findContours(image.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if imutils.is_cv2() else contours[1]
print len(contours)
但是如果矩形是空的,这不起作用。我也不知道如何在图像中填充图表。我知道如果使用OpenCV绘制轮廓时如何填充轮廓但我不知道如何填充图像中已存在的空矩形。我认为这会有所帮助。
答案 0 :(得分:2)
假设您已经尝试过形状检测器,线路检测等,而这里没有成功,这是解决此问题的另一种方法。
如果这是灰度PNG图像,您可以使用颜色分段来实现此目的。 我会像这样接近它:
count = 0
For each pixel in the image:
if color(pixel) == white /*255*/
count++
floodfill using this pixel as a seed pixel and target color as count
no_of_rectangles = count - 1 /* subtract 1 since the background will be colored too*/
这假设矩形具有连续的线条,否则填充物将泄漏到其他矩形中。
答案 1 :(得分:1)
如果找到外部轮廓(RETR_EXTERNAL),则填充与否不会有所不同。以下代码将为您提供数字3。
canvas = np.zeros(img.shape, np.uint8)
img2gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(img2gray,128,255,cv2.THRESH_BINARY_INV)
im2,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
print(len(contours))
for cont in contours:
cv2.drawContours(canvas, cont, -1, (0, 255, 0), 3)
cv2.imshow('contours',canvas)
cv2.waitKey(30000)
cv2.destroyAllWindows()
请注意,如果您在findContours()中使用RETR_TREE作为第二个参数,则会得到所有6个轮廓,包括内部轮廓。
显然,这是假设图片仅包含矩形,并且不能区分不同的形状。