本記事では、下図のような画像ファイル(.jpgや.png)の線図のラインをpathとしたsvgファイルを作成するPythonの雛形コードを作成しました。

作成したsvgファイルは、CADソフトで読み込むことが出来ます。下図は、オープンソースのFreeCADで読み込んだ例です。

■ライブラリのインストール
pipの場合
pip install scikit-image
pip install sknw
pip install svgwrite
anaconda環境下の場合
conda install -c anaconda scikit-image
conda install -c conda-forge sknw
conda install svgwrite
■本プログラム
import os
import cv2
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from skimage.morphology import skeletonize
import sknw
import svgwrite
file_path = './pictures/tubo.png'
file_name = os.path.basename(file_path)
fname, ext = os.path.splitext(file_name)
print(fname, ext)
save_dir = './save_dir/'
img = cv2.imread(file_path)
plt.imshow(img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray)
gray_flip = cv2.flip(gray, 0)
plt.imshow(gray_flip)
gray_rotate = cv2.rotate(gray_flip, cv2.ROTATE_90_CLOCKWISE)
plt.imshow(gray_rotate)
retval, dst = cv2.threshold(gray_rotate, 192, 255, cv2.THRESH_OTSU)
plt.imshow(dst)
outfile_name = f'{save_dir}{fname}_sknw_Draw.svg'
if os.path.exists(outfile_name):
os.remove(outfile_name)
print('delete ', outfile_name)
ske = skeletonize(~(dst != 0))
graph = sknw.build_sknw(ske.astype(np.uint32), multi=True)
dwg = svgwrite.Drawing(outfile_name,
profile = 'tiny',
)
for i, (s,e) in enumerate(graph.edges()):
pt_s = graph.nodes[s]['o'].tolist()
pt_e = graph.nodes[e]['o'].tolist()
for g in graph[s][e].values():
points = g['pts'].tolist()
points = [pt_s] + points + [pt_e]
p = ""
for i in range(len(points)):
if i == 0:
p = "M " + str(points[i][0]) + " " + str(points[i][1])
else:
p += " L " + str(points[i][0]) + " " + str(points[i][1])
path = dwg.path(p).stroke(width = 1).fill('none')
dwg.add(path)
dwg.save()
del dwg
print('save', outfile_name)
(参考)scikit-image × sknwを使わずに、OpenCVのみで同様のことをする雛形コードは次のリンクを参照下さい。線図のラインを閉じたポリゴンで作成します。
hk29.hatenablog.jp
以上
<広告>
リンク
リンク