【发布时间】:2019-06-03 00:39:37
【问题描述】:
编辑:这是对我之前提出的问题的更深入解释,但我仍然没有解决。
我目前正在尝试编写一些代码,可以从书中一些不常见的图表中提取数据。我扫描了这本书的页面,并通过使用 opencv 来检测图表的一些特征,以便将它们转换为可用的数据。在左图中,我正在寻找“三角形”的高度,在右图中,我正在寻找从中心到虚线与灰色区域相交的点的距离。在这两种情况下,我都想将这些值转换为数字数据以供进一步使用。
对于左图,我想检测所有单独的颜色并通过计算该颜色中像素的数量来计算每个扇区的面积。当我知道这些扇区的面积时,我可以使用基本数学轻松计算它们的高度。下面的代码 sn-p 显示了我在识别不同颜色方面已经走了多远。但是我无法准确地完成这项工作。它似乎总是检测到其他扇区的某些颜色,或者没有检测到一个扇区的所有像素。我认为这与我使用的边界有关。我不太清楚如何让它们工作。有人知道我如何确定这些值吗?
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()
对于右图,我仍然不知道如何从中提取数据。我想通过检测所有虚线来识别中心,然后通过检测这些虚线与灰色区域的交点,我可以测量中心与这些交点之间的距离。但是我还不能弄清楚如何正确地做到这一点,因为它听起来很复杂。以下代码 sn-p 显示了我在线路检测方面取得的进展。同样在这种情况下,检测远非准确。有人知道如何解决这个问题吗?
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)
【问题讨论】: