Как получить отдельные линии / кривые для ребер? - PullRequest
0 голосов
/ 30 января 2020

Это мой первый опыт обработки изображений. В блокноте Юпитера, используя scipy, я пытаюсь преобразовать изображение серой линии в векторное представление SVG. До сих пор я был в состоянии преобразовать серое изображение в двоичное (моно chrome изображение) и использовать фильтр sobel по осям x и y, чтобы получить края чертежа. Я получаю двойные линии в качестве ребер для учета обеих сторон линий (как показано на рисунке ниже, а также код, который я использовал)

Я хочу заменить эти двойные линии одной. После этого необходимо обнаружить линии и кривые на чертеже и преобразовать их в линии SVG и кривые Безье. Ища онлайн, я становлюсь немного ошеломленным и запутанным о правильном пути вперед. Было бы очень полезно, если бы я мог получить некоторые советы о том, как действовать отсюда. Если возможно, я хочу сделать это только в scipy, а не в opencv.

Вместо того, чтобы просто использовать существующие функции и алгоритмы scipy, я также хочу изучить основную теорию, чтобы я мог эффективно их использовать. Поэтому, пожалуйста, поделитесь любыми полезными теоретическими ресурсами.

Заранее спасибо

enter image description here

%matplotlib inline

import numpy as np
from scipy import ndimage as nd
import matplotlib.pyplot as plt
from skimage import io

def apply_gradient_threshold(d,thres):
    d2 = np.copy(d)
    d2[d2 == -thres] = thres
    d2[d2 != thres] = 0
    return d2


def plot_images(imgs, names):
    fig, axes_list =  plt.subplots(1, len(imgs), figsize=(20, 20))
    for name,axes in zip(names, axes_list):
        axes.set_title(name)

    for img, axes in zip(imgs, axes_list):
        axes.imshow(img, cmap='Greys_r')

    plt.show()  

img_file = <file_url>

img = plt.imread(img_file)
gray_img = io.imread(img_file, as_gray=True) 

if(np.max(gray_img) > 1) :
    gray_img = gray_img/255 #normalize

threshold = 0.2
binary = (gray_img > threshold)*1  # convert the grayscale image to binary (monochrome)

im = binary.astype('int32')
dx = nd.sobel(im,1)
dy = nd.sobel(im,0)
dx = apply_gradient_threshold(dx, 4)
dy = apply_gradient_threshold(dy, 4)
mag = np.hypot(dx,dy) #sqrt(dx^2 + dy^2)
mag *= 255.0/np.max(mag)

plot_images([binary, mag ], ['Binary - ' + str(threshold), 'Sobel Filter Result'])

1 Ответ

1 голос
/ 03 февраля 2020

Ваше изображение практически уже сделано из краев. Используйте прореживание, а не краевой фильтр.

...