OpenCV多边形检测方法

时间:2016-02-03 22:52:06

标签: python opencv computer-vision

所以我有一个包含这样字段的数字表格:

问题在于人们以不同的方式填充这些字段:不同的颜色

渐变等。所以唯一保持一致的是场地的形状。

如何检测所有此类形状并确保它们已填充。 尝试模板匹配,但它对于具有渐变的图像或低对比度的图像不一致,其中阈值处理没有多大帮助,现在我卡住了。

我使用OpenCV 3.1和Python 2.7。

编辑:试图这样做。它似乎提供了更便于进一步处理的结果,但我仍然对下一步感到困惑。

import cv2

base_img = cv2.imread("form_base.png", 0)
form_img = cv2.imread("test2.png", 0)
ret,thresh1 = cv2.threshold(base_img,244,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(form_img,244,255,cv2.THRESH_BINARY)

res = thresh1 - thresh2

cv2.imwrite("test_output.png", res)

That's what I got

1 个答案:

答案 0 :(得分:1)

如果使用connectedComponents进行图像分割,然后对找到的斑点进行特征化,则该任务非常容易。这是一种可能的方法:

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt 

    img = cv2.imread('test2.png')
    # Convert image to grayscale and get threshold image or mask:
    g = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    th, im_th = cv2.threshold(g, 220, 250, cv2.THRESH_BINARY_INV)
    # Opening, just to have delimited edges and make sure to separate each component:
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(2,2))
    im_th2 = cv2.morphologyEx(im_th, cv2.MORPH_OPEN, kernel)
    # Connected Components segmentation:
    maxLabels, labels = cv2.connectedComponents(im_th2)
    plt.imshow(labels)

image segmented

如您所见,填充的那些组件的大小(像素数)将比未填充的那些组件大,因此您可以获取每个组件的大小看看是否充满。例如:您可以获取Blob大小的最大值并设置一个阈值,因为如所观察到的,未填充的对象的大小将小于填充的对象的大小的一半:

   # Get size of blobs: First value is always "empty" space, 0 on the mask, so discard it 
   sizes = np.array([len(labels[labels==i]) for i in range(1,maxLabels)])
   # Threshold with minimum value:
   thSizes = np.max(sizes)/2

您可以从此处计算填充的组件的数量或执行其他所需的操作:

   n_blobs = len(sizes[sizes>thSizes])
   print('There are ' + str(n_blobs) + ' fields filled.')
   >>>There are 6 fields filled.