Это мой первый опыт обработки изображений. В блокноте Юпитера, используя scipy, я пытаюсь преобразовать изображение серой линии в векторное представление SVG. До сих пор я был в состоянии преобразовать серое изображение в двоичное (моно chrome изображение) и использовать фильтр sobel по осям x и y, чтобы получить края чертежа. Я получаю двойные линии в качестве ребер для учета обеих сторон линий (как показано на рисунке ниже, а также код, который я использовал)
Я хочу заменить эти двойные линии одной. После этого необходимо обнаружить линии и кривые на чертеже и преобразовать их в линии SVG и кривые Безье. Ища онлайн, я становлюсь немного ошеломленным и запутанным о правильном пути вперед. Было бы очень полезно, если бы я мог получить некоторые советы о том, как действовать отсюда. Если возможно, я хочу сделать это только в scipy, а не в opencv.
Вместо того, чтобы просто использовать существующие функции и алгоритмы scipy, я также хочу изучить основную теорию, чтобы я мог эффективно их использовать. Поэтому, пожалуйста, поделитесь любыми полезными теоретическими ресурсами.
Заранее спасибо
%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'])