所以我有一个包含这样字段的数字表格:
问题在于人们以不同的方式填充这些字段:不同的颜色
渐变等。所以唯一保持一致的是场地的形状。
如何检测所有此类形状并确保它们已填充。 尝试模板匹配,但它对于具有渐变的图像或低对比度的图像不一致,其中阈值处理没有多大帮助,现在我卡住了。
我使用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)
答案 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)
如您所见,填充的那些组件的大小(像素数)将比未填充的那些组件大,因此您可以获取每个组件的大小看看是否充满。例如:您可以获取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.