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

Я хотел бы преобразовать этот радарный график в числовые значения для каждого компонента (пунктирные линии), используя openCV для python.Как бы я лучше всего это сделал?Я думал об обнаружении центра графика, а также пересечений пунктирных линий с серой областью.Делая это, я мог измерить расстояние между центром и каждым из этих пересечений, чтобы определить значение для каждого компонента.Однако это кажется довольно сложным, и я не знаю, с чего начать.Может ли кто-нибудь помочь мне здесь?

РЕДАКТИРОВАТЬ: Цель состоит в том, чтобы написать часть программного обеспечения, которая может извлекать данные из 250 из этих графиков.(У меня есть сканы лучшего качества)

enter image description here

1 Ответ

0 голосов
/ 04 июня 2019

Я бы сделал что-то вроде этого (извините, это псевдокод, если вы думаете, что идея достаточно хороша, я попытаюсь написать настоящий код):

1. найти центр круга (возможно, с помощью функции HoughCircle)

2. обратный порог, чтобы выделить темно-серую область

3. Вызовите функцию opencv приблизительно для получения полигона, представляющего эту область

4. Для каждой вершины измерить расстояние от центра и преобразовать его в желаемый масштаб

Я думаю, что это должно работать.

учебник по кругу https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html

Поли учебник
https://docs.opencv.org/3.1.0/dd/d49/tutorial_py_contour_features.html

EDIT

У меня было немного свободного времени, поэтому я написал начальный фрагмент кода для извлечения окружности, радиуса и поли, надеюсь, это поможет вам

    img = cv.imread("c:\\temp\\test.jpg", cv.IMREAD_COLOR) 
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

    #thresholds for isolate circle and poly
    ret, thres_poly_temp = cv.threshold(gray, 90, 255, cv.THRESH_BINARY_INV)
    ret, thres_circle = cv.threshold(gray, 110, 255, cv.THRESH_BINARY_INV)

    #cleanup image for detect poly
    thres_poly = thres_poly_temp.copy()
    thres_poly = cv.GaussianBlur(thres_poly_temp,(3,3),0)
    thres_poly = cv.medianBlur( thres_poly, 5)

    #bitwise_and to keep just the poly, removing the circle 
    cv.bitwise_and(thres_poly_temp, thres_circle, thres_poly)
    kernel = np.ones((3, 3),np.uint8)
    thres_poly  = cv.morphologyEx(thres_poly, cv.MORPH_CLOSE, kernel)
    kernel = np.ones((3, 3),np.uint8)
    thres_poly  = cv.morphologyEx(thres_poly, cv.MORPH_OPEN, kernel)

    #find circle
    circle = cv.HoughCircles(thres_circle, 3, 2, 800, minRadius = 100, maxRadius=500, param1=80, param2=100)
    radius_list = []
    if circle is not None:
        circle = np.round(circle[0, :]).astype("int")
        for (x,y,r) in circle:
            cv.circle(gray, (x,y), r, (255,255,0),3)
            cv.circle(gray, (x,y), 3, (255,255,0),3)
            radius_list.append((x+r,y))
            a = 0
            #find radius
            while(a < 360):
                rad = math.radians(a)
                x2 = int((radius_list[0][0] - x) * math.cos(rad)) - int((radius_list[0][1] - y) * math.sin(rad)) + x;
                y2 = int((radius_list[0][0] - x) * math.sin(rad)) + int((radius_list[0][1] - y) * math.cos(rad)) + y;
                radius_list.append((x2,y2))
                a = a + 18
                cv.line(gray, (x,y), (x2,y2), (255,255,0),2)

    #find poly contour
    contours,hierarchy = cv.findContours(thres_poly, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

    #extract contour with max area
    maxArea = -1
    maxAreaContour = contours[0]
    for contour in contours:
        area = abs(cv.contourArea(contour))
        if area > maxArea:
            maxArea = area
            maxAreaContour = contour

    #approx poly to get contours
    epsilon = 0.1*cv.arcLength(maxAreaContour,True)
    approx = cv.approxPolyDP(maxAreaContour, 5, True)
    cv.drawContours(gray, [approx],-1,(0,255,0),2)
    cv.imshow("1", gray)

    #now just iterate all the radius with the contour to find the intersection
    # it should be pretty straight forward

выходной образец

РЕДАКТИРОВАТЬ 2 : по-прежнему отсутствует: выровнять изображение, как я уже говорил, вы можете использовать горизонтальные и вертикальные пунктирные линии для этого (используйте грубые линии, чтобы получить их, затем определите m и q и сделайте обратное рото-перевод)

...