РЕДАКТИРОВАТЬ: Это более глубокое объяснение вопроса, который я задал ранее, который до сих пор не решен для меня.
В настоящее время я пытаюсь написать некоторый код, который может извлекать данные из некоторых необычных графиков вкнига.Я отсканировал страницы книги, и с помощью opencv я хотел бы обнаружить некоторые особенности графиков, чтобы преобразовать их в полезные данные.На левом графике я ищу высоту «треугольников», а на правом графике расстояние от центра до точек, где пунктирные линии пересекаются с серой областью.В обоих случаях я хотел бы преобразовать эти значения в числовые данные для дальнейшего использования.
![enter image description here](https://i.stack.imgur.com/oxtNP.jpg)
Для левого графика я подумал об обнаружении всех отдельныхцветов и вычисления площади каждого сектора путем подсчета количества пикселей в этом цвете.Когда у меня есть площадь этих секторов, я могу легко рассчитать их высоту, используя базовую математику.Следующий фрагмент кода показывает, как далеко я уже продвинулся в определении разных цветов.Однако я не могу сделать это точно.Кажется, что он всегда обнаруживает некоторые цвета других секторов или не обнаруживает все пиксели одного сектора.Я думаю, что это как-то связано с границами, которые я использую.Я не могу понять, как заставить их работать.Кто-нибудь знает, как я могу определить эти значения?
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)