Извлечение данных из графиков в отсканированный документ - PullRequest
1 голос
/ 02 июня 2019

РЕДАКТИРОВАТЬ: Это более глубокое объяснение вопроса, который я задал ранее, который до сих пор не решен для меня.

В настоящее время я пытаюсь написать некоторый код, который может извлекать данные из некоторых необычных графиков вкнига.Я отсканировал страницы книги, и с помощью 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 Ответ

1 голос
/ 02 июня 2019

Для левого изображения, используя ваш подход, попробуйте взглянуть на гистограмму RGB, цвета должны быть значительными пиками, если вы хотите использовать относительную площадь сегментов.

Другой альтернативой может бытьиспользовать Hough Circle Transform , который должен работать на сегментах круга.См. Также здесь .

Для правильного изображения ... позвольте мне подумать ...

Вы можете создать «пустую» диаграмму без данных внутри.Вы знаете расположение сегмента круга («кусочки торта»).Затем вы можете определить область, в которой находятся данные (темные), либо используя серый порог, порог RGB, либо Найти контуры , либо ищите Водораздел / Преобразование расстояния .

В конце концов, идея заключается в создании логического наложения между очищенным изображением и найденными сегментами (вашими данными).Затем вы можете определить, какая доля сегментов вашего круга покрыта, или, зная центр, найти самую дальнюю точку от центра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...