从扫描文档中的图形中提取数据

时间:2019-06-02 13:38:39

标签: python opencv

编辑:这是我之前提出的一个问题的更深层解释,但对我来说仍然没有解决。

我目前正在尝试编写一些代码,这些代码可以从一本书中一些不常见的图形中提取数据。我扫描了这本书的页面,并通过使用opencv来检测图形的某些功能,以便将它们转换为可用数据。在左图中,我正在寻找“三角形”的高度,在右图中,是从中心到虚线与灰色区域相交的点的距离。在这两种情况下,我都希望将这些值转换为数字数据以供进一步使用。

enter image description here

对于左图,我想到了检测所有单独的颜色并通过计算该颜色的像素数量来计算每个扇区的面积的方法。当我拥有这些扇区的面积时,我可以使用基本数学轻松地计算它们的高度。以下代码段显示了我在识别不同颜色方面已经走了多远。但是,我无法准确地完成这项工作。似乎总是也检测到其他扇区的某些颜色,或者未检测到一个扇区的所有像素。我认为这与我使用的边界有关。我不太清楚如何使它们工作。有人知道我该如何确定这些值?

import numpy as np
import cv2

img = cv2.imread('images/test2.jpg')

lower = np.array([0,0,100])
upper = np.array([50,56,150])

mask = cv2.inRange(img, lower, upper)
output = cv2.bitwise_and(img, img, mask = mask)

cv2.imshow('img', img)
cv2.imshow('mask', mask)
cv2.imshow('output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

对于正确的图形,我仍然不知道如何从中提取数据。我想通过检测所有虚线来确定中心,然后通过检测这些虚线与灰色区域的交点来测量中心与这些交点之间的距离。但是,由于听起来很复杂,我还无法弄清楚如何正确地做到这一点。下面的代码片段显示了我对行检测的了解。同样在这种情况下,检测也不是很准确。有人知道如何解决这个问题吗?

import numpy as np
import cv2

# Reading the image
img = cv2.imread('test2.jpg')
# Convert the image to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Apply edge detection
edges = cv2.Canny(gray,50,150,apertureSize = 3)

# Line detection
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength=50,maxLineGap=20)

for line in lines:
    x1,y1,x2,y2 = line[0]
    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)

cv2.imwrite('linesDetected.jpg',img)

1 个答案:

答案 0 :(得分:1)

对于左图,使用您的方法,尝试查看RGB直方图,如果您要使用分段的相对面积,则颜色应该是明显的峰值。

另一种替代方法是使用Hough Circle Transform,该方法应适用于圆弧段。另请参见here

对于正确的图像……让我想想……

您可以创建一个内部没有数据的“空”图。您知道圆弧段(“蛋糕块”)的位置。然后,您可以使用灰色阈值,RGB阈值或Find Contours或寻找Watershed / Distance Transform来确定数据所在的区域(暗区域)。

最后,我们的想法是在清除的图像和找到的片段(您的数据)之间进行布尔覆盖。然后,您可以确定您的圆弧段所占的份额,或者知道中心,找到离中心最远的点。